C# DataGridView控件的基础应用实例

引言

  DataGridView我把他叫做网格数据控件 。我们在显示表格数据的时候,经常会用想到用它, 他就像Excel表格一样。我们知道只要是数据表,就一定逃不掉表的增删查改操作。
  该篇,我在VS2019的环境下通过demo实例来实现DataGridView控件的一系列功能,包括添加一行数据、切换允许修改单元格、复制选择数据、复制所有数据、读一行数据、读取所有数据、查找记录、删除一行数据、删除一行数据、删除多行数据、清除所有行以及清除所有列。


一、界面简介

  我新建了一个Form窗体。左上角最大的控件就是DataGridView,将demo功能定义到按键的单击事件中,另外添加了 一个文本框textBox和两个下拉菜单comBox来输入姓名、性别和班级。富文本框用来输出部分功能的输出使用。请见下图。
在这里插入图片描述


二、初始化

  初始化包括参数初始化和表头初始化。
  (1)参数初始化可以使用代码修改,也可以通过属性栏修改默认值,属性比较多,可以自己去尝试,下面我只举几个用代码控制的例子。
  (2)表头初始化的目的是添加列,没有列是无法添加对应的行数据的,我们可以不用规定列的宽度和表头内容,但是必须定义列数量,dataGridView.Columns.Add(new DataGridViewTextBoxColumn())就只实现这个功能的。如实例中,我们就添加了4个列。

        private void InitDataGridView ()
        {

            //根据Header和所有单元格的内容自动调整行的高度
            dataGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
            //设置内容对齐方式和字体 
            dataGridView.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;            
            //dataGridView_Report.Font = new Font("宋体", 10);
            //设置所有单元格都不可编辑
            dataGridView.ReadOnly = true;
            //设置标题头列宽
            dataGridView.RowHeadersWidth = 15; 
            //不可以增加空行
            dataGridView.AllowUserToAddRows = false;   
            //添加表头
            for (int i = 0; i < 4; i++)
            {
                dataGridView.Columns.Add(new DataGridViewTextBoxColumn());
            }
            //指定标题列宽
            dataGridView.Columns[0].Width = 60;
            dataGridView.Columns[1].Width = 100;
            dataGridView.Columns[2].Width = 80;
            dataGridView.Columns[3].Width = 150;
            //添加标题字符
            dataGridView.Columns[0].HeaderText = "序号";
            dataGridView.Columns[1].HeaderText = "姓名";
            dataGridView.Columns[2].HeaderText = "性别";
            dataGridView.Columns[3].HeaderText = "班级";
              
        }

三、添加一行数据

  添加一行数据,首先,要明确你要在表格的哪个位置添加几行数据,否则,无法知道往什么位置insert多少个数据。其次,必须清楚每一列的数据类型,一一对应才可以写对数据。另外,ClearSelection()方法可以去除默认的选择,防止始终有选择的焦点在控件上,可以让界面清静一点。

		private void button_add_Click(object sender, EventArgs e)
        {
            //排除异常输入
             if(textBox_Name.Text == string.Empty || comboBox_Sex.Text ==string.Empty|| comboBox_Class.Text == string.Empty)
            {
                return;
            }
            //得到总行数 
            int num = dataGridView.Rows.Count; 
            //向第一行插入一行数据
            this.dataGridView.Rows.Insert(0, 1);
            //写第一行第二列数据//插入名字
            this.dataGridView.Rows[0].Cells[1].Value = textBox_Name.Text;
            //写第一行第三列数据//插入性别
            this.dataGridView.Rows[0].Cells[2].Value = comboBox_Sex.Text;
            //写第一行第四列数据//插入班级
            this.dataGridView.Rows[0].Cells[3].Value = comboBox_Class.Text;
            //写第所有行第一列数据//插入显示序号
            for (int i = 0; i < num + 1; i++)
            {
                this.dataGridView.Rows[i].Cells[0].Value = i + 1;
            }
            //去除选择
            dataGridView.ClearSelection();
        }


四、允许修改表格

  允许修改表格是由属性ReadOnly决定的。因此,非常容易改变和修改。实例中用CheckBox的改变事件来控制属性的true 或false。

   private void checkBox_Modify_CheckedChanged(object sender, EventArgs e)
        {
            if(checkBox_Modify.Checked == true)
                 dataGridView.ReadOnly = false;
            else
                dataGridView.ReadOnly = true;
        }


五、复制选择的数据

  DataGridView控件是可以允许选择一个单元格或者多个单元格,跨行的单元格,我们通过
选择后,背景色将变成默认的蓝色。我们注意要先排除没有被选择的情况。这里的Clipboard.SetDataObject()方法,和Ctrl+C的功能是一样的。我们就可以利用这个省去用户键盘操作。


 		private void button_Copy_Click(object sender, EventArgs e)
        {
            //排除异常
            if (dataGridView.CurrentCell == null)
                return;
            //单元格格式化内容复制到粘贴板
            Clipboard.SetDataObject(dataGridView.GetClipboardContent());             
        }

六、复制所有数据

  复制所有数据和复制指定数据一样,只是我们可以将控件的所有数据自动全选上。再直接拷贝到粘贴板。简直不要太简单。

        private void button_SelectAll_Click(object sender, EventArgs e)
        {
            dataGridView.SelectAll();
            //单元格格式化内容复制到粘贴板
            Clipboard.SetDataObject(dataGridView.GetClipboardContent());
        }

七、读一行数据

  读一行数据,前提条件是需要首先选择好一行数据的,点击每行的最左边就可以选择整行数据的,否者我们就不执行后面的操作。
  获取选择的索引后将数据按照整列的数据逐一拷贝到数组中,最后显示。当然也可以不使用逐一读取,通过数据复制的方法将数据格式化数据送到粘贴板后再进行操作。
  如果选择了多行,甚至是跨行多行,索引Index则是指向最后一个行,所以,代码将复制最后的那一行。

        private void button_Read_Click(object sender, EventArgs e)
        {
            //判断是否选中一行
            if (dataGridView.SelectedRows.Count == 0)
                return;
            //获取选择的索引
            int index = dataGridView.CurrentRow.Index;
            string line = "";
            for (int i = 1; i < dataGridView.ColumnCount; i++)
            {
                line += dataGridView.Rows[index].Cells[i].Value.ToString();
                if (i == dataGridView.ColumnCount - 1)
                    line += "\n";
            }
            //显示在富文本中
            display_in_richTextBox(line);
        }

八、读所有数据

  读取所有数据和复制所有数据有点类似,这里直接使用两个for循环将每个单元格的数据格式化输出连接到字符串中。

    	private void button_ReadAll_Click(object sender, EventArgs e)
        {            
            string all_data = "";
            for(int i = 0; i < dataGridView.Rows.Count; i++)//行循环
            {
                for (int j = 0; j < dataGridView.ColumnCount; j++) //列循环
                {  
                    all_data += dataGridView.Rows[i].Cells[j].Value.ToString();
                    if (j == dataGridView.ColumnCount - 1)
                        all_data += "\n";
                    else
                        all_data += "\t";
                }                
            }
           //显示数据
            display_in_richTextBox(all_data); 
        }

九、查找名字记录

  查找某个列的记录中是否有对应的数据存在,这里我按照顺序的方法直接找到对应数据,并将焦点跳到搜索到的位置。查找的算法方法很多,还可以多次查找,模糊查找、这里只是为了说明控件实现,就不使用其它方法来复杂代码了。

        //位置定义
        int position = 0;

		private void button_Search_Click(object sender, EventArgs e)
        {
            //获取行数
            int Count = dataGridView.Rows.Count;
            //得到的要搜索的内容
            string find_name = textBox_Name.Text;
            //循环搜读对比
            for (int i = position; i < Count; i++)
            {   
                if (find_name == dataGridView.Rows[i].Cells[1].Value.ToString())//对比
                {
                    //选择指定单元格
                    dataGridView.CurrentCell = dataGridView.Rows[i].Cells[1];
                    //返回
                    return;
                } 
                
            }
            //没有找到
        }


十、删除一行数据

  删除一行数据同样是需要先规定是选中了至少有1行以上,删除行才有意义。
  如果选择了多行,甚至是跨行多行,索引Index则是指向最后一个行,因此这种情况,代码将删除最后的那一行。

  		private void button_Delete_Click(object sender, EventArgs e)
        {
            //判断是否选中一行
            if (dataGridView.SelectedRows.Count == 0)
                return;
            //删除一行
            dataGridView.Rows.RemoveAt(dataGridView.CurrentRow.Index);
            
        }

十一、删除多行数据

   SelectedRows是获取用户选定的行的集合。通过选择集合的循环,可以逐个删除(remove)掉对应的所有行(row)。感觉这个方法还是非常快捷的。

        private void button_DeleteMultRow_Click(object sender, EventArgs e)
        {
            foreach (DataGridViewRow row in dataGridView.SelectedRows)
            {
                if (!row.IsNewRow)
                {
                    dataGridView.Rows.Remove(row);
                }
            }
        }

十二、清除所有行

   清除所有行的方法 Rows.Clear()是我们需要清除所有数据时使用的,清除后表头是不会删除的。

 	    private void button_Clear_Click(object sender, EventArgs e)
        {
            //删除所有行
            dataGridView.Rows.Clear();
        }

十三、删除所有列

   清除所有列的方法Columns.Clear() 是我们需要清除所有数据和表头时使用的,清除后表头会删除掉的,也就是没有了列,要重新添加数据时需要初始化列才可以的。

  	private void button_ClearColumns_Click(object sender, EventArgs e)
      {
          //删除包括标题在内的所有列
          dataGridView.Columns.Clear();
      } 

十四、其它:选中单元格

   下面实例实现的是指定选中第0行第1列。此单元格将高亮。

dataGridView.CurrentCell = dataGridView.Rows[0].Cells[1];

十五、最后

   上面讲到的是我平时有用到的DataGridView控件的方法,抽空用demo工程实现和描述了一遍,时间有限,如有描述的不够明白的,朋友们都可以与我讨论和指正。

  • 31
    点赞
  • 345
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

火星papa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值