目录
- 引言
- 一、界面简介
- 二、初始化
- 三、添加一行数据
- 四、允许修改表格
- 五、复制选择的数据
- 六、复制所有数据
- 七、读一行数据
- 八、读所有数据
- 九、查找名字记录
- 十、删除一行数据
- 十一、删除多行数据
- 十二、清除所有行
- 十三、删除所有列
- 十四、其它:选中单元格
- 十五、最后
 
引言
  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;elsedataGridView.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";elseall_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工程实现和描述了一遍,时间有限,如有描述的不够明白的,朋友们都可以与我讨论和指正。





![[附源码]java毕业设计网易云音乐推荐系统](https://img-blog.csdnimg.cn/bdbea73a6ac845e0b08655f5676a7f7d.png)













