WinForm DataGridView 和 DataTable 和 List 二维组合使用

5 篇文章 0 订阅
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;
        }
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值