C#手动操作DataGridView之------使用各种数据源填充表格实例

news2024/11/28 14:35:21

C#中的表格控件只有一个,那就是datagridview,不像QT中可以用QTableview,QTableWidget。新手拿到datagridview的第一个问题就是数据从哪里来?难道从设计器中一个个手动输入,到时候要变怎办?所以,我们这里说说DataGridView的手动操作。

一、手动操作DataGridView

这里我们是没有数据源的纯view控件的操作,后面第二部分我们再讲有数据源的操作。

1、初步尝试

下面的代码声明并初始化完成列DataGridViewColumn、行DataGridViewRow 、单元格DataGridViewCell 对象,但这里需要注意的是,DataGridView必须先有列后有行,最后才是单元格cell,初始化完成后你就可以直接将他们加入DataGridView的实例中了,如下代码dataGridView1就是在设计器的工具箱中直接拖放到窗体中的DataGridView控件。

  DataGridViewColumn col = new DataGridViewColumn();
  DataGridViewRow row = new DataGridViewRow();
  DataGridViewCell cell = new DataGridViewTextBoxCell();
  cell.Value = "item";
  col.CellTemplate = cell; //设置单元格格式模板
  col.HeaderText = "column01";
  dataGridView1.Columns.Add(col);

效果:
在这里插入图片描述
虽然,只有一行一列一个单元格,但如果我们搞懂了原理,那后面批量加入我们需要的行列和单元格就容易了。
这里了重点强调一下,加入的顺序应该是:
1、初始化列
2、初始化行
3、初始化单元格
4、将列column加入DataGridView
5、将行row加入列DataGridView
6、将单元格cell加入行row

注意,一个列必须设定它自己这一列的单元格格式母板,否则就会报错。如:

cell= new DataGridViewTextBoxCell();
 col.CellTemplate = cell;

2、批量加入

批量加入无非就是加入了一些循环,过程和单个单元格的加入几乎没有差别,需要注意的是每次加入的行或者列或者单元格都必须是一个新对象,也就是要new一个新的对象,否则就不能成功加入。

 DataGridViewColumn col;
 DataGridViewRow row;
 DataGridViewCell cell= new DataGridViewTextBoxCell();
         
 for (int i = 0; i < 6; i++)
 {
     col = new DataGridViewColumn();
     col.HeaderText = "col" + i.ToString();       
     col.CellTemplate = cell;
     dataGridView1.Columns.Add(col);
     }
            
 for (int i = 0; i <20; i++)
  {
      row = new DataGridViewRow(); 
      for (int j = 0; j < 6; j++)
      {
         cell = new DataGridViewTextBoxCell();
         cell.Value = "item" + i.ToString() + j.ToString();
         row.Cells.Add(cell);
      }
      dataGridView1.Rows.Add(row);
   
   }

运行的效果如下:
在这里插入图片描述
这里,我们将加入行和加入单元格同时进行的,你也可以加入行和加入列完成后,单独对单元格进行赋值,代码如下:


 for (int i = 0; i < 20; i++)
  {
      row = new DataGridViewRow();
      //for (int j = 0; j < 6; j++)
      //{
      //    cell = new DataGridViewTextBoxCell();
      //    cell.Value = "item" + i.ToString() + j.ToString();
      //    row.Cells.Add(cell);
      //}
      dataGridView1.Rows.Add(row);
  }

  for (int i = 0; i < 6; i++)
      for (int j = 0; j < 20; j++)
          dataGridView1.Rows[j].Cells[i].Value = "item" + j.ToString() + i.ToString();

3、带数据的行的加入rows.Add

行的加入我们利用add方法来完成,它有三个重载,所以我们可以用多种方式加入,前面我们就已经使用过了它的最常见的重载,直接在add的参数中加入row
如:

dataGridView1.Rows.Add(row);

这里我们使用数组加入也很方便:


    //添加行
     string[] row0 = { "Jack", "1880", "2022-12-5","12.5","true" };
     string[] row1 = { "Smith", "2208", "2022-02-15", "538", "true" };
     dataGridView1.Rows.Add(row0);
     dataGridView1.Rows.Add(row1);
     dataGridView1.Rows.Add(new string[] { "Tome", "1208", "2012-2-15", "1.2", "true" });
     //list转数组后加入
     List<string> values = new List<string>();
     values.Add("Jone");
     values.Add("1222");      
     values.Add("2022-05-12");
     values.Add("23.2");
     values.Add("false");
     dataGridView1.Rows.Add(values.ToArray());

运行效果
在这里插入图片描述
还有一个重载是add(int ),这个专门从来加入空行,比如加入1000个空行,那就直接在参数中输入1000:

  dataGridView1.Rows.Add(1000);

二、数据来源DataSource

数据来源可以是自己从数据库中获取,也可以自己构建一个DataTable,也可以读入字符流或者字符列表等。这里分别演示。DataSource它的特点是:任何实现IListSource接口的类都可以作为它的右值。

1、来自列表List

我们将列表中装入一个对象,当然,这个对象有多少特征,我们就可以显示在表格中显示多少列

 List<Student> students = new List<Student>()
 {
      new Student() {Name="John", Gender=true, Birthday=new DateTime(2012, 12, 4),Age= 20, Hight=15},
      new Student() {Name="Jack",  Gender=true, Birthday=new DateTime(2022, 10, 12), Age=10, Hight=125}
  };
  dataGridView1.DataSource = students.Select(x => new { x.Name, x.Gender, x.Birthday, x.Age, x.Hight }).ToList();

运行效果:

在这里插入图片描述

2、来自自定义DataTable

既然是我们手动自定义的一个表,那么我们就必须给它定义行列和单元格内容。这的Datatable只是提供数据,与视图View无关,那么它的责任就是组织好数据给视图来显示,这在MVC中就属于model层。
下面的代码我们初始化了一个DataTable对象后就可以利用columns.add增加列了,增加完列我们用DataTable的newRow()方法直接增加行,没有它法。

     DataTable dt = new DataTable();
     dt.Columns.Add("col1", typeof(System.String));
     dt.Columns.Add("col2", typeof(System.String));
     dt.Columns.Add("col3", typeof(System.String));
     dt.Columns.Add("col4", typeof(System.String));
     dt.Columns.Add("col5", typeof(System.String));
     dt.Columns.Add("col6", typeof(System.String));

     for(int i = 0; i < 10; i++)
     {
         dt.Rows.Add(dt.NewRow());
         for(int j = 0; j < 6; j++)
             dt.Rows[i][j]="item" + j.ToString() + i.ToString();
     }
	dataGridView1.DataSource =dt;

我们上面所有的行,我们使用的格式都是String的,便于统一用循环添加,我们我们想要添加其他的格式的数据可以这样添加:

 DataTable dt = new DataTable();

 dt.Columns.Add("col1", typeof(System.Int32));
 dt.Columns.Add("col2", typeof(System.String));
 dt.Columns.Add("col3", typeof(System.DateTime));
 dt.Columns.Add("col4", typeof(System.Boolean));
 dt.Columns.Add("col5", typeof(System.Int16));
 dt.Columns.Add("col6", typeof(System.Decimal));

关于赋值,使用二维数组的方式直接给单元格赋值即可:

dt.Rows[i][j]="item" + j.ToString() + i.ToString();

最后,我们给DataGridView实例指定数据源DataSource 属性即可,这里我们指定为我们刚刚手动建立的DataTable。
运行效果:
在这里插入图片描述
看起来,和前面我们直接对DataGridView手动操作得到的表格没有什么两样,但实际我们此时已经使用了MVC的概念了,一个负责的是视图一个负责的是数据。

3、动态建立表格

我们首先定义两个List分别存放表格的字段类型和值

            //定义一个表格的字段类型
            List<string> typeDef = new List<string>();
            typeDef.Add("System.Int32");
            typeDef.Add("System.String");
            typeDef.Add("System.DateTime");
            typeDef.Add("System.Decimal");
            typeDef.Add("System.Boolean");

            //表格字段内容
            List<string> values = new List<string>();
            values.Add("1222");
            values.Add("Jone");
            values.Add("2022-05-12");
            values.Add("23.2");
            values.Add("false");
            dataGridView1.DataSource = initialDataTable(typeDef,values);

接下来,我们定义一个函数,专门来建立一个表格

  DataTable initialDataTable(List<String> strlist, List<String> vluelist)
        {

            DataTable dt = new DataTable();

            DataColumn col = new DataColumn();
            for (int i = 0; i < strlist.Count; i++)
            {
                col = new DataColumn();
                col.DataType = System.Type.GetType(strlist[i]);
                dt.Columns.Add(col);
            }

            for (int i = 0; i < 10; i++)
            {
                dt.Rows.Add(dt.NewRow());
                for (int j = 0; j < strlist.Count; j++)
                    dt.Rows[i][j] = vluelist[j];
            }

            return dt;

        }
    }

运行效果:
在这里插入图片描述

4、类和BindingList

类的特征属性直接显示在表格里可以通过BindingList来实现

BindingList<Student> list2 = new BindingList<Student>();
list2.Add(new Student("John", true, new DateTime(2012, 12, 4), 20, 15));
list2.Add(new Student("Jack", true, new DateTime(2022, 10, 12), 10, 125));
list2.Add(new Student("Tomy", true, new DateTime(1992, 3, 5), 30, 5));
dataGridView1.DataSource= list2;

运行效果:
在这里插入图片描述

5、来自文件字符流

有了上面的基础后,我们就可以建立一个导入文本文件的表格,并且可以自动识别文本文件中的字段类型。我们首先来看看效果:
在这里插入图片描述
导入文本表格要做好文本字段之间的分割Split,这里不详说了,首先要从读入的文本流中取出表格的各列的名称和类型,然后再取出内容,然后分别形成数组,贴出关键代码:

 			StreamReader sr = new StreamReader(filepath, Encoding.UTF8);
            typetext = sr.ReadLine();
            headtext = sr.ReadLine();
            string[] typer = typetext.Split(',');
            ArrayList content = new ArrayList();
            //开始读文本中的每条记录的内容
            while ((str=sr.ReadLine()) != null)
            {
                content.Add(str);
                Console.WriteLine(str); 
            }
            //定义一个表格的字段类型
            List<string> typeDef = new List<string>();
            for (int i = 0; i < typer.Length; i++)
            {
                typeDef.Add("System." + typer[i].ToString());
             }

            //表格字段内容
            ArrayList head = new ArrayList();
            string[] header = headtext.Split(',');
            for (int i = 0; i < header.Length; i++)
            {
                head.Add( header[i].ToString());
            }

将上述代码得到的三个列表传入下面的DataTable处理函数中即可得到DataGridView的DataSource需要的DataTable

       DataTable initialDataTable(List<String> typelist, ArrayList headerlist,ArrayList contentarry)
        {

            DataTable dt = new DataTable();
            DataColumn col = new DataColumn();
            for (int i = 0; i < headerlist.Count; i++)
            {
                col = new DataColumn();
                col.ColumnName = headerlist[i].ToString();
                col.DataType = System.Type.GetType(typelist[i]);
                dt.Columns.Add(col);
            }
            // 加入内容
            for (int i = 0; i < contentarry.Count; i++)
            {
                dt.Rows.Add(contentarry[i].ToString().Split(','));               
            }
            return dt;
        }

可以参考的文本:

String,Boolean,Int32,DateTime,Int32,Int32
Name,Gender,ID,Birthday,Score1,Score2
John, true,1908, 2012-12-4, 20, 16
Jack, false2015, 2022-10-12, 10, 125
Tomy, true, 2047,1992-3-5, 30, 15,
Mophy, true, 1147,2014-6-3, 40, 24
Tollor, false,2347,2102-2-15, 50, 55

6、来自数据库

如果有数据库,那是最好不过的啦,直接将查询所得的表赋值给DataGridView的DataSource即可。这里我们使用sqlite,事先要安装上sqlite,到Nuget中最快方式获得。
在这里插入图片描述
有了sqlite的环境,我们可以开始组织数据库读取了。这里我们调用的句子非常少,其实这是直接通过SQLiteDataAdapter 填充了一个新建的DataTable而已。

  //指定数据库地址(我这里就放在debug目录下)
  string constr = "Data Source=tbdb.db;";
   //设置SQL查询语句
  string sql = "select * from TestTab";
  SQLiteDataAdapter mAdapter = new SQLiteDataAdapter(sql, constr);
  DataTable dt = new DataTable();
  mAdapter.Fill(dt);
  dataGridView1.DataSource = dt;           

数据库中的表:
在这里插入图片描述
运行效果:
在这里插入图片描述

7、用到的student类

上面用到的student类,这里列出来省得大家重新编写:

class Student
{
    string _name = "";
    bool _gender =false;
    DateTime _birthday;
    int _age;
    decimal _hight;
    public string School;

    public Student() {

        School = "";
    }

    public  Student(string name, bool gender, DateTime birthday, int age, decimal hight)
    {
        Name = name;
        Gender = gender;
        Birthday = birthday;
        Age = age;
        Hight = hight;
        School = "";     
    }

    public string Name{get { return _name; }set { _name = value; }}
    public bool Gender{get { return _gender; } set { _gender = value; }}
    public DateTime Birthday{ get { return _birthday; } set { _birthday = value; } }
    public int Age { get { return _age; } set { _age = value; } }
    public decimal Hight { get { return _hight; } set { _hight = value; } }
    public List<int> Scores { get; set; }
}

其实关于DataGridView的操作还有很多,控件中最复杂的就属它了,所以如果说你要重新编写一个自定义控件,它也是最复杂的,这里我们只是讲了表格的数据填充,后面一篇我们会讲到样式设置和编辑,有时间我们还可以讲讲自定义DataGridView的编写。感兴趣的童鞋可以继续关注。
转发注明出处,码字不易。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/180191.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python3 PIL处理任意尺寸图片为1920*1080 图片模糊 虚化 图片合并居中叠加

各位好&#xff0c;我是宋哈哈&#xff0c;很久没更新文章了&#xff0c;其实这篇代码是我在年前已经写好了。代码呢&#xff0c;也比较冷门适合人很少。仅仅对会AE , PR 视频剪辑&#xff0c; 又要会 python 的人&#xff0c;而且在公司领导又要你来做相册视频&#xff0c;在公…

MSBuild 命令行编译Delphi

为了构建项目&#xff0c;IDE现在使用MSBuild而不是以前的内部生成系统。IDE中的build、compile和make命令调用Microsoft的新生成引擎&#xff1a;MSBuild&#xff0c;它提供了全面的依赖性检查。MSBuild项目文件基于XML&#xff0c;包含描述项目的特定项、属性、任务和目标的部…

[GWCTF 2019]枯燥的抽奖

目录 信息收集 知识回顾 解题思路 信息收集 查看源码&#xff0c;发现check.php <?php #这不是抽奖程序的源代码&#xff01;不许看&#xff01; header("Content-Type: text/html;charsetutf-8"); session_start(); if(!isset($_SESSION[seed])){ $_SESSIO…

html表格

1.基本标签 标签名说明table表示整体&#xff0c;用于包裹多个trtr表格每行&#xff0c;用于包裹tdtd表格单元格&#xff0c;用于包裹内容 注意点&#xff1a; 表格嵌套关系&#xff1a;table>tr>td 表格table的常见属性&#xff1a; 修饰table属性的标签 需要写道tab…

【FA-GAN:超分辨率MRI图像】

FA-GAN: Fused attentive generative adversarial networks for MRI image super-resolution &#xff08;FA-GAN&#xff1a;融合注意生成对抗网络的MRI图像超分辨率&#xff09; 高分辨率磁共振图像可以提供细粒度的解剖信息&#xff0c;但是获取这样的数据需要长的扫描时间…

UVA11426 - GCD - Extreme (II)(数论,欧拉函数)

题目链接&#xff1a;GCD - Extreme (II) - UVA 11426 - Virtual Judge (vjudge.net)​​​​​ 题意 给一个数N&#xff0c;求&#xff1a; ​​​​​​​ 其中&#xff0c;多组输入&#xff0c;输入以0结束&#xff0c;保证答案在long long范围内。 思路 很好的一道题…

移动web主轴设置和flex总结

移动web主轴设置和flex总结设置主轴方向修改主轴经常的使用场景&#xff1a;弹性盒子换行设置侧轴对齐方式flex 总结梳理主轴排列方式侧轴对齐方式-单行对齐侧轴对齐方式-多行弹性盒子换行设置主轴方向伸缩比设置主轴方向 主轴默认是水平方向, 侧轴默认是垂直方向 修改主轴方…

Linux常用命令——semanage命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) semanage 默认目录的安全上下文查询与修改 补充说明 semanage命令是用来查询与修改SELinux默认目录的安全上下文。SELinux的策略与规则管理相关命令&#xff1a;seinfo命令、sesearch命令、getsebool命令、set…

天地图矢量注记图坑

http://lbs.tianditu.gov.cn/server/MapService.html瓦片图案例见下文&#xff0c;注意其中的LAYER:&#xff0c;记住口诀&#xff0c;地址里用什么&#xff0c;这个layer就用什么。比如影像注记里&#xff0c;地址用了cia_w&#xff0c;那么这个layer后面必须是cia_w&#xff…

别总写代码,这130个网站比涨工资都重要

今天推荐一些学习资源给大家&#xff0c;当然大家可以留言评论自己发现的优秀资源地址 搞学习 找书籍 冷知识 / 黑科技 写代码 资源搜索 小工具 导航页&#xff08;工具集&#xff09; 看视频 学设计 搞文档 找图片 搞学习 TED&#xff08;最优质的演讲&#xff09;&#xff1…

解析JVM类加载器

文章目录1、何为类加载器2、三层类加载器3、双亲委派模型参考资料&#xff1a;《深入理解Java虚拟机》 1、何为类加载器 类加载过程中&#xff0c;加载阶段第一步操作就是通过一个类的全限定名获取此类的二进制字节流。实现这个动作的代码就是类加载器。 任意一个类都必须由加…

mybatis-plus1(前言技术)

目录 一、Mybatis-plus入门 1.什么是mybatis-plus 2.初体验 ① 准备数据库脚本 ② 初始化工程 ③ 编码 ④ 开始使用 3.日志 二、Mybatis-plus主键生成策略 1.更新 三、Mybatis-plus自动填充 1&#xff1a;通过数据库完成自动填充 2&#xff1a;使用程序完成自…

gensim中的word2vec使用

介绍 一句话&#xff0c;GensimGensimGensim中的word2vec类就是用来训练词向量的&#xff0c;这个类实现了词向量训练的两种基本模型skip−gramskip-gramskip−gram和CBOWCBOWCBOW,可以通过后面的参数设置来选择&#xff0c;。但是&#xff0c;在Gensim这个模块中训练词向量的…

什么是盒子模型?

什么是盒子模型&#xff1f; 盒子模型组成有 4 部分,分别为:内容 内边距 外边距(一般不计入盒子实际宽度) 边框 盒子模型有 2 种:标准盒子模型与怪异盒子模型 标准盒子模型content(内容)border(边框)padding(内边距) 怪异盒子模型content(内容)(已经包含了 padding 和 border) …

随手查——Lumerical

Lumerical小白学习的一些记录&#xff0c;以防自己忘记&#xff0c;持续更。。。 快速导航1、如何设置网格2、关于窗口的一些操作&#xff08;1&#xff09;窗口的最大化与复原&#xff08;2&#xff09;窗口的关闭与开启1、如何设置网格 【View】→【Drawing grid】→【Edit …

ctfshow代码审计篇

文章目录web301-SQL注入web302- sql写shellweb303- insertweb304- 报错注入web305- 反序列化蚁剑连接数据库web306- 反序列化web307- shell_exce()web308- ssrf打mysqlweb309- ssrf打fastcgiweb310- ssrffastcfgi写shellweb301-SQL注入 check.php $username$_POST[userid]; $u…

php实现短链接系统

依据第二种算法&#xff0c;URL长连接转短连接实现方法如下&#xff1a; 语言&#xff1a;PHP5.6 服务器环境&#xff1a;LNMP 假设&#xff1a;长连接地址&#xff1a;http://www.test.com/index.php 短连接地址&#xff1a;http://t.test.com/六位code码 第一步&#xff…

Ubuntu18上安装搜狗输入法

一、说明 在ubuntu上安装中文输入法会经常遇到问题。本文是作者经过历次艰苦卓绝的努力后&#xff0c;安装成功的总结。这里稍作记录&#xff0c;以便日后安装时查询。 二、版本选择 注意&#xff1a;目前的搜狗和ubuntu版本是有个配套问题&#xff0c;如下表所列&#xff1a; …

【Typescript学习】使用 React 和 TypeScript 构建web应用(一)预览成品、初始化react项目、常见类型

教程来自freecodeCamp&#xff1a;【英字】使用 React 和 TypeScript 构建应用程序 跟做&#xff0c;仅记录用 其他资料&#xff1a;https://www.freecodecamp.org/chinese/news/learn-typescript-beginners-guide/ 第一天 1 学习目标&#xff08;我个人的&#xff09; 入门 …

开启前端CSS学习之路-css001

&#x1f60a;博主页面&#xff1a;鱿年年 &#x1f449;博主推荐专栏&#xff1a;《WEB前端》&#x1f448; ​&#x1f493;博主格言&#xff1a;追风赶月莫停留&#xff0c;平芜尽处是春山❤️ 目录 前言 一、CSS简介 1.HTML的局限性 2.CSS-网页美容师 3.CSS语法规范…