目录
引言
DataGridView我把他叫做网格数据控件 。我们在显示表格数据的时候,经常会用想到用它, 他就像Excel表格一样。我们知道只要是数据表,就一定逃不掉表的增删查改操作。
该篇,我在VS2019的环境下通过demo实例来实现DataGridView控件的一系列功能,包括添加一行数据、切换允许修改单元格、复制选择数据、复制所有数据、读一行数据、读取所有数据、查找记录、删除一行数据、删除一行数据、删除多行数据、清除所有行以及清除所有列。
一、界面简介
我新建了一个Form窗体。左上角最大的控件就是DataGridView,将demo功能定义到按键的单击事件中,另外添加了 一个文本框textBox和两个下拉菜单comBox来输入姓名、性别和班级。富文本框用来输出部分功能的输出使用。请见下图。
二、初始化
初始化包括参数初始化和表头初始化。
(1)参数初始化可以使用代码修改,也可以通过属性栏修改默认值,属性比较多,可以自己去尝试,下面我只举几个用代码控制的例子。
(2)表头初始化的目的是添加列,没有列是无法添加对应的行数据的,我们可以不用规定列的宽度和表头内容,但是必须定义列数量,dataGridView.Columns.Add(new DataGridViewTextBoxColumn())就只实现这个功能的。如实例中,我们就添加了4个列。
private voidInitDataGridView(){//根据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 voidbutton_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 voidcheckBox_Modify_CheckedChanged(object sender, EventArgs e){if(checkBox_Modify.Checked == true)
dataGridView.ReadOnly = false;else
dataGridView.ReadOnly = true;}
五、复制选择的数据
DataGridView控件是可以允许选择一个单元格或者多个单元格,跨行的单元格,我们通过
选择后,背景色将变成默认的蓝色。我们注意要先排除没有被选择的情况。这里的Clipboard.SetDataObject()方法,和Ctrl+C的功能是一样的。我们就可以利用这个省去用户键盘操作。
private voidbutton_Copy_Click(object sender, EventArgs e){//排除异常if(dataGridView.CurrentCell == null)return;//单元格格式化内容复制到粘贴板
Clipboard.SetDataObject(dataGridView.GetClipboardContent());}
六、复制所有数据
复制所有数据和复制指定数据一样,只是我们可以将控件的所有数据自动全选上。再直接拷贝到粘贴板。简直不要太简单。
private voidbutton_SelectAll_Click(object sender, EventArgs e){
dataGridView.SelectAll();//单元格格式化内容复制到粘贴板
Clipboard.SetDataObject(dataGridView.GetClipboardContent());}
七、读一行数据
读一行数据,前提条件是需要首先选择好一行数据的,点击每行的最左边就可以选择整行数据的,否者我们就不执行后面的操作。
获取选择的索引后将数据按照整列的数据逐一拷贝到数组中,最后显示。当然也可以不使用逐一读取,通过数据复制的方法将数据格式化数据送到粘贴板后再进行操作。
如果选择了多行,甚至是跨行多行,索引Index则是指向最后一个行,所以,代码将复制最后的那一行。
private voidbutton_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 voidbutton_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 voidbutton_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 voidbutton_Delete_Click(object sender, EventArgs e){//判断是否选中一行if(dataGridView.SelectedRows.Count ==0)return;//删除一行
dataGridView.Rows.RemoveAt(dataGridView.CurrentRow.Index);}
十一、删除多行数据
SelectedRows是获取用户选定的行的集合。通过选择集合的循环,可以逐个删除(remove)掉对应的所有行(row)。感觉这个方法还是非常快捷的。
private voidbutton_DeleteMultRow_Click(object sender, EventArgs e){foreach(DataGridViewRow row in dataGridView.SelectedRows){if(!row.IsNewRow){
dataGridView.Rows.Remove(row);}}}
十二、清除所有行
清除所有行的方法 Rows.Clear()是我们需要清除所有数据时使用的,清除后表头是不会删除的。
private voidbutton_Clear_Click(object sender, EventArgs e){//删除所有行
dataGridView.Rows.Clear();}
十三、删除所有列
清除所有列的方法Columns.Clear() 是我们需要清除所有数据和表头时使用的,清除后表头会删除掉的,也就是没有了列,要重新添加数据时需要初始化列才可以的。
private voidbutton_ClearColumns_Click(object sender, EventArgs e){//删除包括标题在内的所有列
dataGridView.Columns.Clear();}
十四、其它:选中单元格
下面实例实现的是指定选中第0行第1列。此单元格将高亮。
dataGridView.CurrentCell = dataGridView.Rows[0].Cells[1];
十五、最后
上面讲到的是我平时有用到的DataGridView控件的方法,抽空用demo工程实现和描述了一遍,时间有限,如有描述的不够明白的,朋友们都可以与我讨论和指正。
版权归原作者 火星papa 所有, 如有侵权,请联系我们删除。