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年4月24日 星期二
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();
}
我需要把他轉成字串陣列,需使用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/
@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();
}
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/
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
![]() |
解密後 |
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]);
}
}
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;
}
{
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 =學士班
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"/>
就可以了
無法存取關閉的檔案
只要在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);
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";
在下更新指令時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();
}
聽起來有點抽象是什麼意思呢?
以我目前的理解來解釋一下;
例如有一個新增會員功能與新增學生功能,這兩個都會用到新增這個功能,
我們就可以把這個新增的部分抽離出來寫成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;
}
或使用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 ) ? "成立": "不成立";
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);
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);
訂閱:
文章 (Atom)
Visual Studio JS intellisense 失效解決方式
試了好久,發現到工具>選項>IntelliCode js項目設定啟用,重新開啟VS就正常了! 後來發現是TypeScript3.2版有問題停用,使用4.3版的TypeScript即可
