操作DataGridView控件详解.docx
《操作DataGridView控件详解.docx》由会员分享,可在线阅读,更多相关《操作DataGridView控件详解.docx(16页珍藏版)》请在冰豆网上搜索。
操作DataGridView控件详解
在项目中,老程序员都知道显示数据的控件的操作灵活性很重要。
VisualStudio2008里面提供了一个很强大的数据显示控件------------DataGridView。
DataGridView与VB、VC中的DataGrid控件功能很相似,但比起更加强大,操作更灵活,废话不说了。
操作DataGridView有两种方式,一种是使用控件绑定的方式,操作的时候只要更改DataSet控件的数据集就能够实现DataGridView数据的灵活显示;另一种方式是全部使用代码来手工操作DataGridView控件的显示,尽量少用控件,使代码看起来更连贯,操作更灵活。
控件方法来操作DataGridView控件:
(控件方法略,比较简单,拖控件,绑定即可)
代码方法来操作DataGridView控件
通过上两节,老程序员对数据的简单操作已经很熟练了。
现在在第一个实例“helloword!
”的基础上,继续DataGridView控件的手工操作实习。
添加一个控件,文本命名如图:
我们在上面看到的数据显示时这样的:
列的头部是数据库表的列段名,因为我们是将SQL查询的数据集直接绑定到DataGridView控件的。
下来我们来改变它的头部,同时,来指定DataGridView控件各个列绑定的数据成员。
privatevoidbutton4_Click(objectsender,EventArgse)
{
//定义数据库连接字符
stringstr_con=@"DataSource=26-3B72903E783B\SQLEXPRESS;IntegratedSecurity=SSPI;InitialCatalog=testDB;";
//定义SQL语句字符串
stringsql="select*fromdanwei";
//stringsql=string.Format("insertintodanwei(danwei)values('{0}')",textBox1.Text);
//定义并实例化数据库连接类型变量
SqlConnectionconn=newSqlConnection(str_con);
//打开数据库连接
conn.Open();
SqlCommandcomm=newSqlCommand(sql,conn);
SqlDataAdapterda=newSqlDataAdapter(comm);
DataSetds=newDataSet();
da.Fill(ds,"danwei");
dataGridView1.DataSource=ds;
dataGridView1.DataMember="danwei";
//---------------以上代码可以直接拷贝button3的代码--------------------
//设置dataGridView1控件第一列的列头文字
dataGridView1.Columns[0].HeaderText="序号";
//设置dataGridView1控件第一列的列宽
dataGridView1.Columns[0].Width=80;
//设置dataGridView1控件第二列的列头文字
dataGridView1.Columns[1].HeaderText="单位";
//设置dataGridView1控件第二列绑定的数据集中第一个数据表的第二列的数据
//前面说了,ds数据集是一个多表的集合
dataGridView1.Columns[1].DataPropertyName=ds.Tables[0].Columns[1].ToString();
//设置dataGridView1控件第二列的列宽
dataGridView1.Columns[1].Width=300;
conn.Close();
}
运行后,按下DataGridViewOpar按钮显示如下:
比较原来的;
发现就是列头变了,以及下面的滚动条长了,其实数据绑定了。
可以将绑定值在代码中互换一下,再看看;
上面代码改为:
….//省略前面已有的代码
dataGridView1.Columns[0].DataPropertyName=ds.Tables[0].Columns[1].ToString();
dataGridView1.Columns[1].DataPropertyName=ds.Tables[0].Columns[0].ToString();
运行后:
单位和序号的值就换位置了。
自动添加序号:
动态添加数据的时候,有时候读取数据库的数据ID号不是顺序的,这时就需要自己添加自动递增的序号。
如图:
这里的序号不是序列的,中间跳了个2,做为统计到底有几个单位不直观。
我们添加一段代码:
//dataGridView1.Columns[0].DataPropertyName=ds.Tables[0].Columns[1].ToString();
//dataGridView1.Columns[1].DataPropertyName=ds.Tables[0].Columns[0].ToString();
//dataGridView1.Columns[1].Width=300;
//自动整理序列号
intcoun=dataGridView1.RowCount;
for(inti=0;i{dataGridView1.Rows[i].Cells[0].Value=i+1;dataGridView1.Rows[i].Cells["danweiid"].Value=i+1;}//因为第一个列值被修改了,所以后面的列值索引就从0开始//所以单位的值应该对应的是第0列dataGridView1.Columns[0].DataPropertyName=ds.Tables[0].Columns[0].ToString();}运行后,显示: 综上,老程序员已经可以知道:1, DataGridView控件如何用代码绑定数据集;2, DataGridView控件如何如果将指定的列绑定到数据集里的指定数据列;3, DataGridView控件如何动态编辑它的列值;其实通过上面的实习,老程序员已经算很灵活的操作DataGridView了,不过为了在项目中更加顺手,老程序员通过查找资料和测试,整理了DataGridView控件的用法详解合集。附录如下:(以下代码在如下情况下配置:添加一个ListBox控件,在里面显示获取到的值。添加一个button3按钮控件,以下功能代码均在该按钮控件的Click事件下触发)1,当前选择的的单元格属性取得、变更privatevoidbutton3_Click(objectsender,EventArgse){//当前选择的的单元格属性取得、变更listBox1.Items.Add("当前选择的表格值(代码:dataGridView1.CurrentCell.Value)="+dataGridView1.CurrentCell.Value);listBox1.Items.Add("当前选择的表格值(代码:dataGridView1.CurrentCell.ColumnIndex)="+dataGridView1.CurrentCell.ColumnIndex);listBox1.Items.Add("当前选择的表格值(代码:dataGridView1.CurrentCell.RowIndex)="+dataGridView1.CurrentCell.RowIndex);//设置[1,1]单元格为当前选择的单元格dataGridView1.CurrentCell=dataGridView1[1,1];listBox1.Items.Add("当前选择的表格值(代码:dataGridView1.CurrentCell.RowIndex)="+dataGridView1.CurrentCell);}运行时,需要先按DataGridViewOpar,它会创建DataGridView数据视图实例,然后再按DataGridViewOparGather按钮。2,DataGridView编辑属性//全部单元格只读dataGridView1.ReadOnly=true;//指定行列单元格只读dataGridView1.Columns[1].ReadOnly=true;dataGridView1.Rows[2].ReadOnly=true;dataGridView1[0,0].ReadOnly=true;//编辑指定单元格privatevoiddataGridView1_CellBeginEdit(objectsender,DataGridViewCellCancelEventArgse){stringmsg=String.Format("编辑表格({0},{1})",e.ColumnIndex,e.RowIndex);this.Text=msg;} privatevoiddataGridView1_CellEndEdit(objectsender,DataGridViewCellEventArgse){stringmsg=String.Format("完成编辑({0},{1})",e.ColumnIndex,e.RowIndex);this.Text=msg;}3,DataGridView禁止用户追加新行dataGridView1.AllowUserToAddRows=false;4,判断当前选中行是否为新追加的行if(dataGridView1.CurrentRow.IsNewRow=true){MessageBox.Show("你选定的是新行");}5,DataGridView设定删除行//允许用户删除行操作dataGridView1.AllowUserToDeleteRows=true;//双击DataGridView属性框中事件列表中的以下两个事件,添加代码如下//提示是否删除指定行数据privatevoiddataGridView1_UserDeletingRow(objectsender,DataGridViewRowCancelEventArgse){DialogResultdiaR=MessageBox.Show("是否删除该行?","确认",MessageBoxButtons.OKCancel,MessageBoxIcon.Question);if(diaR==DialogResult.OK){e.Cancel=false;}}//提示删除了哪一行数据privatevoiddataGridView1_UserDeletedRow(objectsender,DataGridViewRowEventArgse){System.Text.StringBuildermessageBoxCS=newSystem.Text.StringBuilder();messageBoxCS.AppendFormat("{0}={1}","行号为",e.Row);messageBoxCS.AppendLine();DialogResultdiaR=MessageBox.Show("删除了"+messageBoxCS.ToString(),"确认");}6,设置不显示指定行,设置删除选定的行或列//显示指定行或列dataGridView1.Columns[0].Visible=false;dataGridView1.Rows[0].Visible=false;dataGridView1.ColumnHeadersVisible=false;dataGridView1.RowHeadersVisible=false; //删除指定行dataGridView1.Columns.Remove("danwei");dataGridView1.Columns.RemoveAt(0);dataGridView1.Rows.RemoveAt(0);//删除选定的多行foreach(DataGridViewRowrindataGridView1.SelectedRows){if(r.IsNewRow==false){dataGridView1.Rows.Remove(r);}}7,取得选定的行、列、单元格//选定的单元格foreach(DataGridViewCellcindataGridView1.SelectedCells){stringcr=string.Format("{0},{1}",c.ColumnIndex,c.RowIndex);listBox1.Items.Add("选定的单元格位置是:"+cr);}//选定的行/列foreach(DataGridViewRowcindataGridView1.SelectedRows){listBox1.Items.Add("选定的行是:"+c.RowIndex);}foreach(DataGridViewColumncindataGridView1.SelectedColumns){listBox1.Items.Add("选定的列是:"+c.ColumnIndex);}//指定选定单元格dataGridView1[0,0].Selected=true;dataGridView1.Rows[0].Selected=true;dataGridView1.Columns[0].Selected=true; //设置行首和左上角的文字dataGridView1.Rows[0].HeaderCell.Value="第1行";dataGridView1.TopLeftHeaderCell.Value="左上角";8,手动追加列//手动追加列dataGridView1.AutoGenerateColumns=false;dataGridView1.DataSource=ds;DataGridViewTextBoxColumntxtCol=newDataGridViewTextBoxColumn();txtCol.DataPropertyName="danwei";txtCol.Name="col1";txtCol.HeaderText="单位";dataGridView1.Columns.Add(txtCol);9,单元格内输入值正确性判断在DataGridView控件的属性处,选择以下事件。错误文本请求:privatevoiddataGridView1_CellErrorTextNeeded(objectsender,DataGridViewCellErrorTextNeededEventArgse){if((dataGridView1.Columns[e.ColumnIndex].Name=="ID")&&(dataGridView1.Columns["ID"].ToString()=="")){dataGridView1.Rows[e.RowIndex].ErrorText="值类型错误";}}输入值有效性检查:privatevoiddataGridView1_CellValidated(objectsender,DataGridViewCellEventArgse){dataGridView1.Rows[e.RowIndex].ErrorText="输入值无效";}10,列中显示选择框控件CheckBox//列中显示选择框CheckBoxDataGridViewCheckBoxColumncolumn1=newDataGridViewCheckBoxColumn();{column1.HeaderText="选择框";column1.Name="checkbox";column1.AutoSizeMode=DataGridViewAutoSizeColumnMode.DisplayedCells;column1.FlatStyle=FlatStyle.Standard;//显示选择框的三种状态column1.ThreeState=true;}dataGridView1.Columns.Add(column1);11,插入新的一列到指定单元格列//插入新的一列到指定单元格列dataGridView1.Columns.Insert(3,column1);12,单元格添加下拉框//单元格添加下拉框DataGridViewComboBoxColumndcombo=newDataGridViewComboBoxColumn();dcombo.Items.Add("中国");dcombo.Items.Add("美国");dcombo.Items.Add("德国");dcombo.Items.Add("日本");dcombo.Items.Add("英国");dcombo.Items.Add("法国");dcombo.Name="combo";//显示的位置列//dcombo.DisplayIndex=1;dcombo.HeaderText="国家";//绑定数据库的值时使用以下属性//dcombo.DataPropertyName="danwei";dataGridView1.Columns.Add(dcombo); 以上显示的下拉框,选择时需要点击三次,第一次选中单元格,第二次启用编辑,第三次打开下拉框。如果需要一次点击打开下拉框,可以启用DataGridView的事件CellEnter();代码如下:privatevoiddataGridView1_CellEnter(objectsender,DataGridViewCellEventArgse){//实现单击显示列表框if(dataGridView1.Columns[e.ColumnIndex]isDataGridViewComboBoxColumn&&e.RowIndex!=-1){SendKeys.Send("{F4}");}}13,单元格显示按钮控件和显示超级链接同上,只不过使用的类为:DataGridViewButtonColumndbotton;相关代码://显示按钮控件DataGridViewButtonColumncol=newDataGridViewButtonColumn();col.Name="Button";col.UseColumnTextForButtonValue=true;col.Text="按钮";dataGridView1.Columns.Add(col);触发的事件为:privatevoiddataGridView1_CellContentClick(objectsender,DataGridViewCellEventArgse){if(dataGridView1.Columns[e.ColumnIndex].Name=="Button"){MessageBox.Show("触发了按钮");}} 超级链接是:DataGridViewLinkColumn连接代码同上。单元格列显示图像的是:DataGridViewImageColumn代码如下://显示图像DataGridViewImageColumndgvI=newDataGridViewImageColumn();dgvI.Name="Image";dgvI.ValuesAreIcons=false;dgvI.Image=newBitmap("c:\\windows\\BlueLace16.bmp");dgvI.ImageLayout=DataGridViewImageCellLayout.Zoom;dgvI.Description="测试的图片";dataGridView1.Columns.Add(dgvI);dataGridView1["Image",0].Value=newBitmap("c:\\windows\\BlueLace16.bmp"); 等等,用法都是相同的。
dataGridView1.Rows[i].Cells[0].Value=i+1;
dataGridView1.Rows[i].Cells["danweiid"].Value=i+1;
//因为第一个列值被修改了,所以后面的列值索引就从0开始
//所以单位的值应该对应的是第0列
dataGridView1.Columns[0].DataPropertyName=ds.Tables[0].Columns[0].ToString();
运行后,显示:
综上,老程序员已经可以知道:
1, DataGridView控件如何用代码绑定数据集;
2, DataGridView控件如何如果将指定的列绑定到数据集里的指定数据列;
3, DataGridView控件如何动态编辑它的列值;
其实通过上面的实习,老程序员已经算很灵活的操作DataGridView了,不过为了在项目中更加顺手,老程序员通过查找资料和测试,整理了DataGridView控件的用法详解合集。
附录如下:
(以下代码在如下情况下配置:
添加一个ListBox控件,在里面显示获取到的值。
添加一个button3按钮控件,以下功能代码均在该按钮控件的Click事件下触发)
1,当前选择的的单元格属性取得、变更
privatevoidbutton3_Click(objectsender,EventArgse)
//当前选择的的单元格属性取得、变更
listBox1.Items.Add("当前选择的表格值(代码:
dataGridView1.CurrentCell.Value)="+dataGridView1.CurrentCell.Value);
dataGridView1.CurrentCell.ColumnIndex)="+dataGridView1.CurrentCell.ColumnIndex);
dataGridView1.CurrentCell.RowIndex)="+dataGridView1.CurrentCell.RowIndex);
//设置[1,1]单元格为当前选择的单元格
dataGridView1.CurrentCell=dataGridView1[1,1];
dataGridView1.CurrentCell.RowIndex)="+dataGridView1.CurrentCell);
运行时,需要先按DataGridViewOpar,它会创建DataGridView数据视图实例,然后再按DataGridViewOparGather按钮。
2,DataGridView编辑属性
//全部单元格只读
dataGridView1.ReadOnly=true;
//指定行列单元格只读
dataGridView1.Columns[1].ReadOnly=true;
dataGridView1.Rows[2].ReadOnly=true;
dataGridView1[0,0].ReadOnly=true;
//编辑指定单元格
privatevoiddataGridView1_CellBeginEdit(objectsender,
DataGridViewCellCancelEventArgse)
stringmsg=String.Format("编辑表格({0},{1})",
e.ColumnIndex,e.RowIndex);
this.Text=msg;
privatevoiddataGridView1_CellEndEdit(objectsender,
DataGridViewCellEventArgse)
stringmsg=String.Format("完成编辑({0},{1})",
3,DataGridView禁止用户追加新行
dataGridView1.AllowUserToAddRows=false;
4,判断当前选中行是否为新追加的行
if(dataGridView1.CurrentRow.IsNewRow=true)
MessageBox.Show("你选定的是新行");
5,DataGridView设定删除行
//允许用户删除行操作
dataGridView1.AllowUserToDeleteRows=true;
//双击DataGridView属性框中事件列表中的以下两个事件,添加代码如下
//提示是否删除指定行数据
privatevoiddataGridView1_UserDeletingRow(objectsender,DataGridViewRowCancelEventArgse)
DialogResultdiaR=MessageBox.Show("是否删除该行?
","确认",MessageBoxButtons.OKCancel,MessageBoxIcon.Question);
if(diaR==DialogResult.OK)
e.Cancel=false;
//提示删除了哪一行数据
privatevoiddataGridView1_UserDeletedRow(objectsender,DataGridViewRowEventArgse)
System.Text.StringBuildermessageBoxCS=newSystem.Text.StringBuilder();
messageBoxCS.AppendFormat("{0}={1}","行号为",e.Row);
messageBoxCS.AppendLine();
DialogResultdiaR=MessageBox.Show("删除了"+messageBoxCS.ToString(),"确认");
6,设置不显示指定行,设置删除选定的行或列
//显示指定行或列
dataGridView1.Columns[0].Visible=false;
dataGridView1.Rows[0].Visible=false;
dataGridView1.ColumnHeadersVisible=false;
dataGridView1.RowHeadersVisible=false;
//删除指定行
dataGridView1.Columns.Remove("danwei");
dataGridView1.Columns.RemoveAt(0);
dataGridView1.Rows.RemoveAt(0);
//删除选定的多行
foreach(DataGridViewRowrindataGridView1.SelectedRows)
if(r.IsNewRow==false)
dataGridView1.Rows.Remove(r);
7,取得选定的行、列、单元格
//选定的单元格
foreach(DataGridViewCellcindataGridView1.SelectedCells)
stringcr=string.Format("{0},{1}",c.ColumnIndex,c.RowIndex);
listBox1.Items.Add("选定的单元格位置是:
"+cr);
//选定的行/列
foreach(DataGridViewRowcindataGridView1.SelectedRows)
listBox1.Items.Add("选定的行是:
"+c.RowIndex);
foreach(DataGridViewColumncindataGridView1.SelectedColumns)
listBox1.Items.Add("选定的列是:
"+c.ColumnIndex);
//指定选定单元格
dataGridView1[0,0].Selected=true;
dataGridView1.Rows[0].Selected=true;
dataGridView1.Columns[0].Selected=true;
//设置行首和左上角的文字
dataGridView1.Rows[0].HeaderCell.Value="第1行";
dataGridView1.TopLeftHeaderCell.Value="左上角";
8,手动追加列
//手动追加列
dataGridView1.AutoGenerateColumns=false;
DataGridViewTextBoxColumntxtCol=newDataGridViewTextBoxColumn();
txtCol.DataPropertyName="danwei";
txtCol.Name="col1";
txtCol.HeaderText="单位";
dataGridView1.Columns.Add(txtCol);
9,单元格内输入值正确性判断
在DataGridView控件的属性处,选择以下事件。
错误文本请求:
privatevoiddataGridView1_CellErrorTextNeeded(objectsender,DataGridViewCellErrorTextNeededEventArgse)
if((dataGridView1.Columns[e.ColumnIndex].Name=="ID")&&(dataGridView1.Columns["ID"].ToString()==""))
dataGridView1.Rows[e.RowIndex].ErrorText="值类型错误";
输入值有效性检查:
privatevoiddataGridView1_CellValidated(objectsender,DataGridViewCellEventArgse)
dataGridView1.Rows[e.RowIndex].ErrorText="输入值无效";
10,列中显示选择框控件CheckBox
//列中显示选择框CheckBox
DataGridViewCheckBoxColumncolumn1=newDataGridViewCheckBoxColumn();
column1.HeaderText="选择框";
column1.Name="checkbox";
column1.AutoSizeMode=
DataGridViewAutoSizeColumnMode.DisplayedCells;
column1.FlatStyle=FlatStyle.Standard;
//显示选择框的三种状态
column1.ThreeState=true;
dataGridView1.Columns.Add(column1);
11,插入新的一列到指定单元格列
//插入新的一列到指定单元格列
dataGridView1.Columns.Insert(3,column1);
12,单元格添加下拉框
//单元格添加下拉框
DataGridViewComboBoxColumndcombo=newDataGridViewComboBoxColumn();
dcombo.Items.Add("中国");
dcombo.Items.Add("美国");
dcombo.Items.Add("德国");
dcombo.Items.Add("日本");
dcombo.Items.Add("英国");
dcombo.Items.Add("法国");
dcombo.Name="combo";
//显示的位置列
//dcombo.DisplayIndex=1;
dcombo.HeaderText="国家";
//绑定数据库的值时使用以下属性
//dcombo.DataPropertyName="danwei";
dataGridView1.Columns.Add(dcombo);
以上显示的下拉框,选择时需要点击三次,第一次选中单元格,第二次启用编辑,第三次打开下拉框。
如果需要一次点击打开下拉框,可以启用DataGridView的事件CellEnter();
代码如下:
privatevoiddataGridView1_CellEnter(objectsender,DataGridViewCellEventArgse)
//实现单击显示列表框
if(dataGridView1.Columns[e.ColumnIndex]isDataGridViewComboBoxColumn&&e.RowIndex!
=-1)
SendKeys.Send("{F4}");
13,单元格显示按钮控件和显示超级链接
同上,只不过使用的类为:
DataGridViewButtonColumndbotton;
相关代码:
//显示按钮控件
DataGridViewButtonColumncol=newDataGridViewButtonColumn();
col.Name="Button";
col.UseColumnTextForButtonValue=true;
col.Text="按钮";
dataGridView1.Columns.Add(col);
触发的事件为:
privatevoiddataGridView1_CellContentClick(objectsender,DataGridViewCellEventArgse)
if(dataGridView1.Columns[e.ColumnIndex].Name=="Button")
MessageBox.Show("触发了按钮");
超级链接是:
DataGridViewLinkColumn
连接代码同上。
单元格列显示图像的是:
DataGridViewImageColumn
//显示图像
DataGridViewImageColumndgvI=newDataGridViewImageColumn();
dgvI.Name="Image";
dgvI.ValuesAreIcons=false;
dgvI.Image=newBitmap("c:
\\windows\\BlueLace16.bmp");
dgvI.ImageLayout=DataGridViewImageCellLayout.Zoom;
dgvI.Description="测试的图片";
dataGridView1.Columns.Add(dgvI);
dataGridView1["Image",0].Value=newBitmap("c:
等等,用法都是相同的。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1