按钮上表示的文字就是所在单元格所表示的文字(所就是说,使用FormattedValue属性取得的文字列)。但是,如果DataGridViewButtonColumn.UseColumnTextForButtonValue为True时,在DataGridViewButtonColumn.Text属性中设定的文字列,就会在所有的按钮上被表示出来。
#### 下面的代码是在DataGridView中追加按钮列的例子。所有按钮上的文字列为「点击阅览」。
//DataGridViewButtonColumn作成
DataGridViewButtonColumn column = new DataGridViewButtonColumn();
//设定列的名字
column.Name = "Button";
//在所有按钮上表示"点击阅览"
column.UseColumnTextForButtonValue = true;
column.Text = "点击阅览";
//向DataGridView追加
DataGridView1.Columns.Add(column);
#### 获得按钮被点击
点击DataGridViewButtonColumn的按钮时,会触发DataGridView.CellContentClick事件。这个事件处理器可以检测被点击的按钮是否在列中,如果在就会被触发。
下面的例子就是当按钮被点击时,取得是第几行的按钮被点击了。
//CellContentClick事件处理器
private void DataGridView1_CellContentClick(object sender,
DataGridViewCellEventArgs e)
{
DataGridView dgv = (DataGridView)sender;//这行语句也可以不要,如果已经创建了dgv,详见航道系统的代码。
//如果是"Button"列,按钮被点击
if (dgv.Columns[e.ColumnIndex].Name == "Button")//此处索引列可以使name、也可以使headertext,看具体的设置。
{
MessageBox.Show(e.RowIndex.ToString() +
"行的按钮被点击了。");
}
}
#### 按钮的无效状态
如果想让DataGridViewButtonColumn的按钮为无效状态(Button控件的Enabled属性设定为False时的状态),原则上说是不可能的。如果真的想设定,在「禁用 Windows 窗体 DataGridView 控件的按钮列中的按钮」中有详细的说明。
#### 往列里面加入字符,只能在text的类型中使用。
//foreach (DataGridViewRow row in dgvPic.Rows)
// {
// row.Cells[Column1.Index].Value = "OK";
// }
##### datagridview清空数据
DataTable dt = (DataTable)dgvData.DataSource;
dt.Rows.Clear();
dgvData.DataSource = dt;
###### 对datagridview中的行进行判断,实现具体的操作,是比较好的方法。
//foreach (DataGridViewRow gvr in this.dgvPic.Rows)
//{
// if (gvr.Cells [0].Value =="图c")dbo.ObjectPic.PictureName ,
// dgvPic.Rows.Remove(gvr );
// //gvr.Visible = false;
//}
##### C#向DataGridView中添加列2009年11月04日 17:43 //添加更新和删除列
private void AddDeleteAndUpdateColumn(DataGridView dgv)
{
//删除列
DataGridViewImageColumn dgvcDelete = new DataGridViewImageColumn(true);
dgvcDelete.Name = "delete";
dgvcDelete.HeaderText = "删除";
dgv.Columns.Add(dgvcDelete);
//更新列
DataGridViewImageColumn dgvcUpdate = new DataGridViewImageColumn(false);
dgvcUpdate.Name = "update";
dgvcUpdate.HeaderText = "重命名";
//判断图片是否存在,存在则加载,否则提示未找到!
if (File.Exists("update.jpg"))
dgvcUpdate.Image = Image.FromFile("update.jpg");
else
MessageBox.Show("图片未找到!");
dgvcUpdate.ImageLayout = DataGridViewImageCellLayout.Zoom;
dgv.Columns.Add(dgvcUpdate);
}
添加一列DataGridViewCheckBoxColumn列代码:
this.dataGridView1.AutoGenerateColumns = false;
this.dataGridView1.Columns.Insert(0, new DataGridViewCheckBoxColumn());
//为CheckBox添加初始值,后面会用到的;
for (int i = 0; i < this.dataGridView1.Rows.Count; i++)
{
this.dataGridView1.Rows[i].Cells[0].Value = false;
}
this.dataGridView1.Columns[0].Resizable = DataGridViewTriState.False;
this.dataGridView1.Columns[0].Frozen = true;
this.dataGridView1.Columns[0].Width = 25;
上面简单的代码就可以让你自动为展示数据表的dataGridView添加了一个checkbox。
添加一列DataGridViewLinkColumn列代码:
DataGridViewLinkColumn dc = new DataGridViewLinkColumn();
dc.Text = "详细";
dc.AutoSizeMode=System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCellsExceptHeader;
dc.LinkBehavior = System.Windows.Forms.LinkBehavior.NeverUnderline;
dc.UseColumnTextForLinkValue = true;
dc.Frozen = true;
dc.Width = 21;
this.dataGridView1.Columns.Insert(1, dc); //insert函数第一个参数表示列的int型。
添加列的代码你可以放在设置dataGridView的DataSource后。
我在这里冻结了checkBox和link列:
foreach (DataGridViewColumn c in this.dataGridView1.Columns)
{
if (c.Index != 0 && c.Index != 1)
{
c.ReadOnly = true;
}
}
呵呵。简单吧。这样,当你的列很长,你拖动横向滚动条时,被冻结的列是不会随着拖动而滚动的。
下面说一下我在测试dataGridView中遇到的一点小问题。
我在设置好访问ORACLE库,得到了一个DataTable,而后直接让
this.dataGridView1.DataSource = dt; //dt是oracle中的表。也就是我的DataTable。
这样的话,我再在后面添加checkBox列的时候就会在下面多了一条只有一个check的空行。开始的时候怎么也不理解,其实这叫“新加行”。
那天夜里为了去掉这个“新加行”搞了很久。当时的思路之一是控制这最后的新加行,不让其选择有反映,可想了想,这样用户要是看着,感觉也不好。如果在创建的时候直接不让其显示或者显示出来,把它隐藏掉就好了。于是,在创建后做循环,当取到最后一行时,我进行了visible = true,运行发生异常。又看到有remove()和removeat()函数,于是测试,在创建好后删除最后一行。可又异常了,于是陷入了死胡同。为什么不行呢?难道是这个“新加行”是必须的。
最后没办法,上CSDN上询问,开了100的高分,后来想想有点奢侈了。
重分之下必有勇夫,时间不大,一个3颗星的大哥给了答案,我看了查点吐血。把代码粘出来以祭奠我可怜的100分。
DataView dv = dt.DefaultView;
dv.AllowNew = false;
this.dataGridView1.DataSource = dv;
这就OK了!看了以后,想想也对,表当然是允许建新行的(insert),可视图是从表得来的没有存储空间的一段SQL代码,所以也就不会涉及到增、删、改。
好了,下面说说对于checkBox的显示和取值,最简单的,如果我勾了这个checkBox,怎么取得选中这行的其他列的值呢?
这里说3个事件:
l CellContentClick
单击单元格内容时发生。
代码如下,不详细描述了。第一列是checkbox,第二列是link。
//e.RowIndex != -1就是点在了列头(headerText)上;
if (e.ColumnIndex == 0 && e.RowIndex != -1)
{
dataGridView1.Rows[e.RowIndex].Cells[0].Value = (bool)dataGridView1.Rows[e.RowIndex].Cells[0].EditedFormattedValue;
}
if (e.ColumnIndex == 1 && e.RowIndex != -1)
{
//点“详细”后,将井号与年月记录下来;
string strJH = dataGridView1.Rows[e.RowIndex].Cells["JH"].Value.ToString();
string strNY = dataGridView1.Rows[e.RowIndex].Cells["NY"].Value.ToString();
FrmDetail fd = new FrmDetail(strJH, strNY);
}
l CellValueChanged
单元格的值发生了改变。
取了井号列和年月列。
if (e.ColumnIndex == 0 && e.RowIndex != -1)
{
string strJHNY = dataGridView1.Rows[e.RowIndex].Cells["JH"].Value.ToString()+"^"+dataGridView1.Rows[e.RowIndex].Cells["NY"].Value.ToString();
bool bValue = (bool)dataGridView1.Rows[e.RowIndex].Cells[0].Value;
//后面进行一些其他操作;
}
####### 在cellcententclick 事件中可以使用一下的代码
//如果是"Button"列,按钮被点击 可以是该索引列的HeaderText,也可以是name,看具体是设置。
//if (dgvPic.Columns[e.ColumnIndex].HeaderText == "操作")
//{
// MessageBox.Show(e.RowIndex.ToString() +
// "行的按钮被点击了。");
//}
##### 下面的和上面的有点相似
private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
if(e.ColumnIndex=="删除按钮的索引")
{
这里发送sql语句删除此条记录
}
}
#### 删除行
方法1 : dgv.Rows.RemoveAt(dgv.CurrentRow.Index); 这个就可以删除了 ,这个可以,在航道里面试过。
方法:
int count = dataGridViewX1.SelectedColumns.Count;
for (int i=count ;i>0;i--)
{
dataGridViewX1.Columns.Remove(dataGridViewX1.Columns[i]);
}
int count = dataGridViewX1.SelectedColumns.Count;
for (int i=0;i
dataGridViewX1.Columns.Remove(dataGridViewX1.SelectedColumns[0]);
}
##### 删除列 这是删除的代码..
如果直接选中删除一切正常..但改变列的顺序再删除,可以正常删除.但删除之后点击任意单元格都会抛出:
指定的参数已超出有效值的范围.参数名:columnindex
在调试状态下看.不论是否改变单元格顺序.SelectedColumns的值都是一样的.
我并没有使用CellContentClick之类的事件,更没用到columnindex
我现在用 try 截获了这个异常但没有进行处理..现在运行起来没用任何问题.但这个异常不知道是什么原因.还望赐教
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。