最近用了DataGridView,深有体会,最深刻一点是它的事件。我想很多人都希望编辑表格单元的同时更新其他东西,就好像TextBox的TextChanged事件,但DataGridView却没有提供类似TextChanged那样的事件。我想用下面的一个例子说明如何达到实时更新的效果。
上面的Form有一个DataGridView实例dataGridView1和一个Label实例label1。dataGridView1有3个字段,分别是班级(DataGridViewComboBoxColumn)、姓名(DataGridViewTextBoxColumn)和成绩(DataGridViewTextBoxColumn)。
现在要实现一个效果,就是如果更改了dataGridView1中任意一个cell(单元格)的值,label1的text就更新为那个cell的值。代码如下:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.dataGridView1.EditingControlShowing +=
new DataGridViewEditingControlShowingEventHandler(dataGridView1_EditingControlShowing);
}
//编辑cell时激发的事件
void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
if (e.Control.GetType().Equals(typeof(DataGridViewComboBoxEditingControl)))//cell为类ComboBox时
{
e.CellStyle.BackColor = Color.FromName("window");
DataGridViewComboBoxEditingControl editingControl = e.Control as DataGridViewComboBoxEditingControl;
editingControl.SelectedIndexChanged += new EventHandler(editingControl_SelectedIndexChanged);
}
else if (e.Control.GetType().Equals(typeof(DataGridViewTextBoxEditingControl)))//cell为类TextBox时
{
e.CellStyle.BackColor = Color.FromName("window");
DataGridViewTextBoxEditingControl editingControl = e.Control as DataGridViewTextBoxEditingControl;
editingControl.TextChanged += new EventHandler(editingControl_TextChanged);
}
}
//TextBox的TextChanged事件
void editingControl_TextChanged(object sender, EventArgs e)
{
this.label1.Text = dataGridView1.CurrentCell.EditedFormattedValue.ToString();
}
//Combox的SelectedIndexChanged事件
void editingControl_SelectedIndexChanged(object sender, EventArgs e)
{
this.label1.Text = dataGridView1.CurrentCell.EditedFormattedValue.ToString();
}
}
有几点要说明的
1. EditingControlShowing 是DataGridView自带的事件,当某个cell被编辑时就会激发该事件。接着就到了dataGridView1_EditingControlShowing 函数,然后(if…else if…)判断那个cell是DataGridViewComboBoxEditingControl还是DataGridViewTextBoxEditingControl 控件类型。判断好控件类型之后就可以用该类型自带的事件,例如DataGridViewComboBoxEditingControl 自带的SelectedIndexChanged 事件。
2. 为什么用dataGridView1.CurrentCell.EditedFormattedValue而不是dataGridView1.CurrentCell.Value,因为处于编辑状态的cell的Value是没有同时更新的,我们更改的是它的EditedFormattedValue。这个区别当然有好处,这里不谈。
3. 为什么要加一句e.CellStyle.BackColor = Color.FromName("window") ?实践是检验真理的标准,不妨去掉这句运行一下就清楚了。
下面是效果图: