顯示具有 c# 標籤的文章。 顯示所有文章
顯示具有 c# 標籤的文章。 顯示所有文章

2018年4月24日 星期二

[C#]DataSet 不支援 System.Nullable<>解決方案

 dt.Columns.Add(property.Name, Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType);

public DataTable ListToDataTable<T>(List<T> data)
        {
            PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
            DataTable dt = new DataTable();
            for (int i = 0; i < properties.Count; i++)
            {
                PropertyDescriptor property = properties[i];
                //原本dt.Columns.Add(property.Name, property.PropertyType);
                dt.Columns.Add(property.Name, Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType); //解決DataSet 不支援 System.Nullable<>
            }
            object[] values = new object[properties.Count];
            foreach (T item in data)
            {
                for (int i = 0; i < values.Length; i++)
                {
                    values[i] = properties[i].GetValue(item);
                }
                dt.Rows.Add(values);
            }
            return dt;
        }

2018年2月6日 星期二

[C#]將前端傳來的資料轉成json格式

將前端傳來的資料格式為 "[\"yhchang\",\"sjlee\",\"hwcheng\"]"
我需要把他轉成字串陣列,需使用Newtonsoft.Json.Linq;

//轉成json格式
JArray jarray = JArray.Parse(form["ParticipantsArray"]);

//用string.Join以逗號串接再以Split分割逗號存成字串陣列
string[] participantsArray = string.Join(",", jarray.ToList()).Split(',');

或直接foreach  jarray,看需求而定
 foreach (var item in jarray)
{
      string test = item.ToString();
}

2017年11月30日 星期四

[C#]手機設定以電腦解析度瀏覽

因目前系統雖然有做rwd設計,但有時介面未針對手機裝置特別設計UI,導致以手機瀏覽內容過多時會縮擠在一起,目前暫時以手機瀏覽時以電腦解析度瀏覽。


@using System.Text.RegularExpressions;
 string u = Request.ServerVariables["HTTP_USER_AGENT"];
    Regex b = new Regex(@"(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino", RegexOptions.IgnoreCase | RegexOptions.Multiline);
    Regex v = new Regex(@"1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-", RegexOptions.IgnoreCase | RegexOptions.Multiline);

bool mobile = false;
if ((b.IsMatch(u) || v.IsMatch(u.Substring(0, 4))))
 {
        mobile = true;
  }

//如果是手機以1280解析度瀏覽
@if (mobile == true)
    {
        <meta name="viewport" content="width=1280, initial-scale=1, user-scalable=yes" />
    }


好東西,判斷是否為手機裝置,有提供各種語言版本
http://detectmobilebrowsers.com/

2017年11月10日 星期五

[C#]Transaction 避免重複交易

筆記一下

TransactionOptions options = new TransactionOptions();
options.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
options.Timeout = new TimeSpan(0, 1, 0);
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, options))
{
  //交易開始

........



   scope.Complete();
}



2016年10月31日 星期一

[C#]從MemoryStream下載檔案並壓縮成zip檔

1.在NuGet管理套件搜尋DotNetZip並安裝
2.using Ionic.Zip;
3.
using (MemoryStream memoryStream = new MemoryStream())
{
                    TextWriter textWriter = new StreamWriter(memoryStream);

                    foreach (var item in swipeS_RequestRecordSaveService.GetRequestRecordSaveList(id))
                    {
                        textWriter.WriteLine("檔案內容");
                        textWriter.Flush();
                     
                    }
                    byte[] bytesInStream = memoryStream.ToArray();
                    memoryStream.Seek(0, SeekOrigin.Begin);
                    string password = desFun.Encrypt(id.ToString() + DateTime.Now.Minute.ToString());
                    using (ZipFile zipFile = new ZipFile())
                    {
                        zipFile.Password = password;
                        zipFile.AddEntry(fileName, memoryStream);
                        Response.ClearContent();
                        Response.ClearHeaders();
                        Response.AppendHeader("content-disposition", "attachment; filename=xxx.zip");
                        zipFile.Save(Response.OutputStream);
                    }
                    memoryStream.Close();
}

更多使用方式介紹 請上 https://dotnetzip.codeplex.com/

2016年9月8日 星期四

[C#]Math.Round 方法


取小數點兩位數
Math.Round(99.110000,2) //99.11

其他用法詳見MSDN
https://msdn.microsoft.com/zh-tw/library/system.math.round(v=vs.110).aspx


2016年5月12日 星期四

[C#]將加密的字串解密後重新放入陣列

1.CheckBox Value加密過的字串


加密後

2.將加密過的字串陣列解密並放入List
解密後
List<string> decryptSelectCourse = new List<string>();
foreach (var item in selectCourse)
{
    string decrypt = desFun.DESDecrypt(item.ToString(), ""); //解密的字串
 
     //解密失敗
     if (decrypt == "0")
     {
           return "請依照正常程序操作!";
      }
      //解密成功
      decryptSelectCourse.Add(decrypt);
}

*如需傳入陣列使用ToArray()即可
decryptSelectCourse.ToArray();

2016年3月2日 星期三

[c#]使用Contains判斷資料有無重複

string[] selectCourse = "2016/3/2,hugo";
List<string> courseList = new List<string>();

foreach (var item in selectCourse)
{
     string[] splitSelectCourse = item.Split(',');
     if (!courseList.Contains(splitSelectCourse[1]))
    {
        courseList.Add(splitSelectCourse[1]);
     }
}

2016年2月22日 星期一

[c#]日期區間跑迴圈

 public List<string> GetSelectWeeksByDate(DateTime startDate, DateTime endDate)
 {
     List<string> weeks = new List<string>();
    for (DateTime date = startDate; date <= endDate; date = date.AddDays(1))
    {
        weeks.Add(date.DayOfWeek.ToString("d") == "0" ? "7" : date.DayOfWeek.ToString("d"));
     }
     return weeks;
}

2015年8月4日 星期二

[C#]使用enum來做mapping

以下為enum練習範例

public enum Diploma
{
       u1 = 1,
       m1 = 2,
       d1 = 3,
       m2 = 4
 }

 public enum DiplomaChName
{
     學士班 = 1,
     碩士班 = 2,
     博士班 = 3,
     碩士在職專班 = 4
}


以下使用Diploma列舉項目:u1取得Diploma列舉值:1
再用Diploma列舉值:1 取得DiplomaChName列舉項目:學士班

int diplomaType = (int)Enum.Parse(typeof(Diploma), "u1"); //diplomaType  = 1
string msg = Enum.GetName(typeof(DiplomaChName), diplomaType); //msg =學士班

2015年3月26日 星期四

[c#]無法存取關閉的檔案

剛剛在主機端發現上傳檔案時會出現
無法存取關閉的檔案
只要在Web.config  system.web中加入
<httpRuntime maxRequestLength="819200" requestLengthDiskThreshold="819200"/>
就可以了

2014年11月21日 星期五

C#合併兩個Dictionary

 使用Dictionary類別的擴充方法Concat串接兩個序列

Dictionary<Guid, ViewModel.EventModel> events = roomOpenService.GetRoomOpenEvents(roomListID);
 events = events.Concat(roomBookingService.GetRoomBookingEvents(roomListID)).ToDictionary(k => k.Key, v => v.Value);

2014年10月13日 星期一

Access Update 無法更新解決方式

目前有一案子因主機只支援Access,所以只能使用OleDb
在下更新指令時seq 裡的參數順序一定要跟宣告的OleDbParameter順序一樣喔,
不然更新是無作用而且也不會報錯

OleDbParameter[] p = new OleDbParameter[3];
p[0] = new OleDbParameter("@NewsName", newsName); 1
p[1] = new OleDbParameter("@Content", content); 2
p[2] = new OleDbParameter("@ID", newsID); 3
string seq = "Update News Set NewsName = @NewsName, Content = @Content Where ID = @ID";

2014年9月25日 星期四

C# Interface用法

Interface其中一個好處是多個類別可繼承同個介面,
聽起來有點抽象是什麼意思呢?
以我目前的理解來解釋一下;
例如有一個新增會員功能與新增學生功能,這兩個都會用到新增這個功能,
我們就可以把這個新增的部分抽離出來寫成Interface.
以下是基本用法,等更熟悉後再實作複雜一點的

1.建立介面
   interface IAction
   {
       //新增
        void Add();
    }

2.建立會員類別繼承介面並實作介面

class MemberRepository : IAction
{
        void IAction.Add()
        {
            MessageBox.Show("已新增會員");
        }
}

3.建立學生類別繼承介面並實作介面
class StudentRepository : IAction
{
       void IAction.Add()
       {
            MessageBox.Show("已新增學生");
        }
 }

4.主程式部分
//新增會員
private void button1_Click(object sender, EventArgs e)
{
            IAction _memberRepository = new MemberRepository();
            _memberRepository.Add();
 }

//新增學生
 private void button2_Click(object sender, EventArgs e)
 {
            IAction _studentRepository = new StudentRepository();
            _studentRepository.Add();
  }



2014年1月8日 星期三

C# TextBox強迫英文大寫

在KeyPress事件裡每輸入字元就強迫轉成大寫
或使用TextBox的CharacterCasing屬性

 if (char.IsLower(e.KeyChar))
{
      SerialNo_txt.SelectedText = char.ToUpper(e.KeyChar).ToString();
      //小寫
      SerialNo_txt.SelectedText = char.ToLower(e.KeyChar).ToString();
      e.Handled = true;
 }

2014年1月6日 星期一

RadioButton群組用法

將RadioButton放入panel中

  //取得選取得值
1
2
3
4
5
6
7
8
9
10
11
foreach (Control control in this.panel1.Controls)
{
   if (control is RadioButton)
   {
      RadioButton radio = control as RadioButton;
      if (radio.Checked)
      {
          appearance = radio.Text;
      }
   }
}

2013年12月13日 星期五

c# 委派使用方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 //宣告委派型別
 public delegate void  DelegateTest(string name);
 private void button3_Click(object sender, EventArgs e)
 {
    //實體化型別並設定對應方法
    DelegateTest del= Show;
    //傳入字串到方法
    del.Invoke("test");
 }

 public static void Show(string value)
 {
    MessageBox.Show(value);
 }

2012年10月30日 星期二

DataGridView資料列交錯顏色

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 private void RowColor(DataGridView dgv)
{
    if (dgv.Rows.Count != 0)
    {
       for (int i = 0; i < dgv.Rows.Count; i++)
      {
        if ((i % 2) == 1)
          {
            dgv.Rows[i].DefaultCellStyle.BackColor = System.Drawing.Color.Snow;
          }
         else
          {
             dgv.Rows[i].DefaultCellStyle.BackColor = System.Drawing.Color.LightBlue;
          }
        }
      }
}

2012年10月12日 星期五

c# if簡寫

string result ="";

if(menuType  == 0)
{
  result  = "成立";
}
else
{
  result  = "不成立";
}

等同於
 result  = (menuType == 0 ) ?  "成立": "不成立";

2012年6月26日 星期二

取當月第一天與最後一天

//取得當月第一天
 DateTime FirstDay = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);

//取得當月最後一天
DateTime LastDay = new DateTime(DateTime.Now.AddMonths(1).Year, DateTime.Now.AddMonths(1).Month, 1).AddDays(-1);

Visual Studio JS intellisense 失效解決方式

  試了好久,發現到工具>選項>IntelliCode js項目設定啟用,重新開啟VS就正常了! 後來發現是TypeScript3.2版有問題停用,使用4.3版的TypeScript即可