WPF动态生成Mysql表格(二维泛型集合)

通过基础的sql语句动态生成表格,不需要提前设置表头。

1.创建二维泛型集合

代码和类具体如下,类中只包含两个参数,一个header存取数据库表中的列名,source存储对应内容。
二维泛型集合中,外层list是存储列,里层list存储的是每一列的具体信息。这样只需要将表格数据的列对应添加到外层list,再把内层list添加信息即可

  List<List<Source>> vs = new List<List<Source>>();
  class Source
    {
       
        public string header { get; set; }
        public string source { get; set; }
       
    }

2.连接数据库读取表头

读取每一列的名称
最开始连接数据库部分与上一篇文章一直,不在讲解。需要注意的是,读取列名时,会按照拼音排序,会改变原有mysql表格中的列的排列方式。笔者通过使用type类型,因为第一列类型是char,其他信息的类型是double其排序就不改变

 String connetStr = "server=127.0.0.1;port=3306;user=root;password=123456; database=source;";
            // server=127.0.0.1/localhost 代表本机,端口号port默认是3306可以不写,t1是数据库名称。
            MySqlConnection conn = new MySqlConnection(connetStr);
            //这是连接语句
            conn.Open();
            //打开通道,建立连接           
            string sql= "select COLUMN_NAME from information_schema.columns where table_name = '场地信息表' order by COLUMN_type";
            MySqlCommand cmd = new MySqlCommand(sql, conn);//mysqlcommand是执行sql语句
            MySqlDataReader reader = cmd.ExecuteReader();//执行ExecuteReader()返回一个MySqlDataReader对象
			int v = 0;
            //创建对应列
            while (reader.Read())//初始索引是-1,执行读取下一行数据,返回值是bool
            {
                vs.Add(new List<Source>());
                vs[v].Add(new Source()
                {
                    header = reader.GetString("COLUMN_NAME")
                }
                );
                v += 1;                      
            }
            reader.Close(); 

创建完外层list后,会将其header设置为列名。如果有10列就最后vs.counter=10.

3. 设置每一列信息

			sql = "select * from 场地信息表";//获取场地信息表中的所有信息
             cmd = new MySqlCommand(sql, conn);//mysqlcommand是执行sql语句
            reader = cmd.ExecuteReader();//执行ExecuteReader()返回一个MySqlDataReader对象 
            int m = 1;
            //一行一行的填充数据
            while (reader.Read())//初始索引是-1,执行读取下一行数据,返回值是bool
            {
                for (int i = 0; i <vs.Count ; i++)
                {
                    if (m==1)
                    {
                        vs[i][0].source = reader.GetString(vs[i][0].header);
                       
                    }
                    else
                    {
                        vs[i].Add(new Source()
                        {
                            source = reader.GetString(vs[i][0].header),
                            //  header = buildinglist[i].header
                        });
                    }                  
                }
                m += 1;
            }

4.二维list传递到datatable

			DataTable dt = new DataTable();
            dt.Columns.Clear();
            for (int i = 0; i < vs.Count; i++)
            {
                dt.Columns.Add(vs[i][0].header, typeof(String));
               
            }
            for (int j = 0; j < vs[1].Count; j++)
            {
                DataRow dr = dt.NewRow();
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    dr[i] = vs[i][j].source;//vs中第一个【】表示最外层list第二个【】表示第二次list
                }
                dt.Rows.Add(dr);
            }
             dg.ItemsSource = dt.DefaultView;

前端datagrid的设置如下

DataGrid HorizontalAlignment="Left"   VerticalAlignment="Top" Name="dg"  
                  AutoGenerateColumns="True" CanUserResizeColumns="False" CanUserReorderColumns="False" Grid.Column="1">
                   </DataGrid>

需要注意的是,有时数据库中的列名中带特殊符号/时,容易绑定失败

4.效果

在这里插入图片描述

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页