WinForm DataGridView 和 DataTable 和 List 二維組合使用
阿新 • • 發佈:2018-12-17
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace FromChuLi { public partial class Form1 : Form { FromCellList fcl = new FromCellList(); public Form1() { InitializeComponent(); DataTable dt = new DataTable(); dt.Columns.Add("col1", typeof(int)); dt.Columns.Add("col2", typeof(int)); dt.Columns.Add("col3", typeof(int)); dt.Rows.Add(1, 2, 3); dt.Rows.Add(4, 5, 6); dt.Rows.Add(7, 8, 9); dataGridView1.DataSource = FromCellList.DataTableToFromCellList(dt).DeleteColumn(1).ToDataTable(); dataGridView1.DataSource = dt; } private void DataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) { if (e.Button == MouseButtons.Right) { zToolStripMenuItem.Text = e.RowIndex.ToString() + "行" + e.ColumnIndex.ToString() + "列"; if (e.RowIndex == -1)//第一行,head 頂部 { //彈出操作選單 DataGridView dgv = sender as DataGridView; ContextMenuStrip context = new ContextMenuStrip(); context.Size = new System.Drawing.Size(153, 300); #region 刪除列 ToolStripMenuItem contextItem = new ToolStripMenuItem(); contextItem.Size = new System.Drawing.Size(152, 22); contextItem.Text = "刪除列"; contextItem.Click += new System.EventHandler( (sender2, e2) => { dataGridView1.Columns.RemoveAt(e.ColumnIndex); fcl.DeleteColumn(e.ColumnIndex); } ); #endregion #region int 從小到大 排序 ToolStripMenuItem contextItem2 = new ToolStripMenuItem(); contextItem2.Size = new System.Drawing.Size(152, 90); contextItem2.Text = "int 從小到大 排序"; contextItem2.Click += new System.EventHandler( (sender2, e2) => { fcl.SortInt(e.ColumnIndex); dataGridView1.DataSource = fcl.ToDataTable(); } ); #endregion #region 兩個字名字之間加兩個空格 ToolStripMenuItem contextItem3 = new ToolStripMenuItem(); contextItem3.Size = new System.Drawing.Size(152, 120); contextItem3.Text = "兩個字名字之間加兩個空格"; contextItem3.Click += new System.EventHandler( (sender2, e2) => { FromCellList fl = fcl.GetColumn(e.ColumnIndex); for (int i = 0; i < fl.list.Count; i++) { List<object> ziList = fl.list[i].lines; for (int j = ziList.Count - 1; j > -1; j--) { if (j == e.ColumnIndex && i!=0) //i!=0 表示標題 不參與 { string item = ziList[j].ToString(); if (item.Length == 2) { item = item.Insert(1, " "); } ziList[j] = item; } } } fcl = fl; dataGridView1.DataSource = fcl.ToDataTable(); } ); #endregion #region 名字之間的空格去掉 ToolStripMenuItem contextItem4 = new ToolStripMenuItem(); contextItem4.Size = new System.Drawing.Size(152, 150); contextItem4.Text = "名字之間的空格去掉"; contextItem4.Click += new System.EventHandler( (sender2, e2) => { FromCellList fl = fcl.GetColumn(e.ColumnIndex); for (int i = 0; i < fl.list.Count; i++) { List<object> ziList = fl.list[i].lines; for (int j = ziList.Count - 1; j > -1; j--) { if (j == e.ColumnIndex && i != 0) //i!=0 表示標題 不參與 { string item = Convert.ToString(ziList[j]);//ziList[j] type =object item = item.Replace(" ","").Trim(); ziList[j] =item; } } } fcl = fl; dataGridView1.DataSource = fcl.ToDataTable(); }); #endregion #region int 從大到小排序 ToolStripMenuItem contextItem5 = new ToolStripMenuItem(); contextItem5.Size = new System.Drawing.Size(152, 90); contextItem5.Text = "int 從大到小排序"; contextItem5.Click += new System.EventHandler( (sender2, e2) => { fcl.SortIntDescending(e.ColumnIndex); dataGridView1.DataSource = fcl.ToDataTable(); } ); #endregion context.Items.Add(contextItem); context.Items.Add(contextItem2); context.Items.Add(contextItem3); context.Items.Add(contextItem4); context.Items.Add(contextItem5); context.Show(MousePosition.X, MousePosition.Y); countToolStripMenuItem.Text = "Count:" + fcl.list.Count; } } } private void 從剪貼簿建立ToolStripMenuItem_Click(object sender, EventArgs e) { IDataObject data = Clipboard.GetDataObject(); var has = data.GetDataPresent(typeof(string)); var length = Clipboard.GetDataObject().GetFormats().Length != 0; if (has && length) { string bit = (string)data.GetData(typeof(string)); var arr = bit.Split(new string[] { "\n" }, System.StringSplitOptions.None); if (arr.Length > 1) { for (int i = 0; i < arr.Length; i++) { var eleArr = arr[i].Split(new string[] { "\t" }, System.StringSplitOptions.None); List<object> listObj = new List<object>(eleArr); if (eleArr.Length > 1) { Lines line = new Lines(i, listObj); fcl.Add(line); } } } dataGridView1.DataSource = fcl.ToDataTable(); } countToolStripMenuItem.Text = "Count:" + fcl.list.Count; } } public class Lines { public int line; public List<object> lines = new List<object>(); public int Count { get { return lines.Count; } } public Lines(int line, List<object> lines) { this.line = line; this.lines = lines; } public Lines(Lines lines) { this.line = lines.line; this.lines = lines.lines; } } public class FromCellList { public List<Lines> list = new List<Lines>(); public void Add(Lines line) { list.Add(line); } public static FromCellList DataTableToFromCellList(DataTable dt) { FromCellList fcl = new FromCellList(); var objList = new List<object>(); foreach (DataColumn dc in dt.Columns) { objList.Add(dc.ColumnName); } Lines lines0 =new Lines(0, objList); fcl.Add(lines0); for (int i = 0; i < dt.Rows.Count; i++) { DataRow dataRow = dt.Rows[i]; var lines = new Lines(i, dataRow.ItemArray.ToList()); fcl.Add(lines); for (int j = 0; j < dt.Columns.Count;j++) { string strName = dt.Rows[i][j].ToString(); // Console.WriteLine(strName); } } return fcl; } /// <summary> /// 獲取指定列的內容 /// </summary> /// <param name="columnIndex">列的下標</param> /// <returns></returns> public FromCellList GetColumn(int columnIndex) { var fromCellList = new FromCellList (); for (int i = 0; i < list.Count; i++) { var lines = list[i]; for (int j = 0; j < lines.Count; j++) { if (j == columnIndex) { fromCellList.Add(lines); } } } return fromCellList; } public void SortInt(int columnIndex) { //第一行 標題 不參與 排序 Lines lines = new Lines(0, list[0].lines); list.RemoveAt(0); list.Sort((left, right) => { var l = (Lines)left; var r = (Lines)right; if (l == null || r == null) return -1; //首先比較第一個欄位. var firstL = -999; var firstR = -999; int.TryParse(l.lines[columnIndex] as string, out firstL); int.TryParse(r.lines[columnIndex] as string, out firstR); if (firstL > firstR) { return 1; } else if (firstL == firstR)//相等則比較第2個欄位. { return 0; } else { return -1; } }); //第一行 標題 不參與 排序 list.Insert(0, lines); } /// <summary> /// 從大到小 /// </summary> /// <param name="columnIndex"></param> /// <returns></returns> public void SortIntDescending(int columnIndex) { //第一行 標題 不參與 排序 Lines lines = new Lines(0, list[0].lines); list.RemoveAt(0); list.Sort((left, right) => { var l = (Lines)left; var r = (Lines)right; if (l == null || r == null) return -1; //首先比較第一個欄位. var firstL = -999; var firstR = -999; int.TryParse(l.lines[columnIndex] as string, out firstL); int.TryParse(r.lines[columnIndex] as string, out firstR); if (firstL > firstR) { return -1; } else if (firstL == firstR)//相等則比較第2個欄位. { return 0; } else { return 1; } }); //第一行 標題 不參與 排序 list.Insert(0,lines); } public DataTable ToDataTable() { DataTable dt = new DataTable(); for (int i = 0; i < list.Count; i++) { var lines = list[i]; var row = new List<string>(); for (int j = 0; j < lines.Count; j++) { string contant = ""; if (lines.lines[j].GetType() == typeof(string)) { contant = Convert.ToString(lines.lines[j]); } else if (lines.lines[j].GetType() == typeof(int)) { contant= lines.lines[j].ToString(); } // Console.WriteLine(lines.lines[j].GetType()+"=type,vallue="+ contant); //result += ("行號:" + lines.line + "neirong=" + lines.lines[j]); if (i == 0) { dt.Columns.Add(contant, typeof(string)); } if (i > 0) { row.Add(contant); } } if (i > 0) { dt.Rows.Add(row.ToArray()); } } return dt; } public override string ToString() { string result=""; string str = ""; for (int i = 0; i < list.Count; i++) { var lines = list[i]; str = ""; for (int j = 0; j < lines.Count; j++) { if (j > 0) { str += "\t"; } str += lines.lines[j].ToString(); } result += str +"\n"; } return result; } public FromCellList DeleteColumn(int columnIndex) { for (int i = 0; i < list.Count; i++) { List<object> ziList = list[i].lines; for (int j = ziList.Count-1; j >-1; j--) { if (j == columnIndex) { string item = ziList[j].ToString(); // Console.WriteLine("Delete:"+item+"\t"+"j="+j); ziList.RemoveAt(j); } } } return this; } } }