20.3 使用技巧6
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的
20.3.9 解决下拉框恼人的点击
不知道读者有没有注意过,从下拉框单元格选择的时候,总共会点三下鼠标才能选中下拉框中的一个值:第一次选中单元格,第二次打开下拉框,第三次才能选中值。比一般的ComboBox选择多一个步骤。
要解决以上问题只需要方法很简单,当单元格获得焦点的时候(DataGridView.CellEnter 事件),发送“F4”按键值即可。
【例 20.18】【项目:code20-018】减少下拉框点击。
请在【例 20.15】的基础上修改dgv_CellContentClick方法内的代码:
private void dgv_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
if(dgv[e.ColumnIndex, e.RowIndex].GetType()==typeof( DataGridViewComboBoxCell))
{
SendKeys.Send("{F4}");
return;
}
}
20.3.10 下拉框单元格改变其他单元格的值
如何实现从下拉框单元格的值改变后,更改其它列的值。很简单的实现,使用DataGridView.CellValueChanged事件即可,该事件会在单元格的值更改时发生。
【例 20.19】【项目:code20-019】减少下拉框点击。
private void Form1_Load(object sender, EventArgs e)
{
//在空白的DataGridView上增加一列
DataGridViewTextBoxColumn newColumnTxt = new DataGridViewTextBoxColumn();
newColumnTxt.HeaderText = "ID";
newColumnTxt.Name = "ColumnText";
dgv.Columns.Add(newColumnTxt);
//设置3行数据
for(int i = 1;i<= 3;i++)
{
int rowIndex = dgv.Rows.Add();
dgv.Rows[rowIndex].Cells[0].Value = i;
}
//新增下拉框列
DataGridViewComboBoxColumn newcolumnCb = new DataGridViewComboBoxColumn();
newcolumnCb.HeaderText = "学校";
newcolumnCb.Items.Add("第1中学");
newcolumnCb.Items.Add("第2中学");
newcolumnCb.Items.Add("第3中学");
newcolumnCb.Name = "ColumnComboBox";
dgv.Columns.Add(newcolumnCb);
}
private void dgv_CellEnter(object sender, DataGridViewCellEventArgs e)
{
if(dgv[e.ColumnIndex, e.RowIndex].GetType()==typeof( DataGridViewComboBoxCell))
{
SendKeys.Send("{F4}");
return;
}
}
//单元格的值更改时
private void dgv_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
dgv[0, e.RowIndex].Value = dgv[e.ColumnIndex, e.RowIndex].Value;
}
以上代码将在新增的下拉框列的值发生改变后,将第1列对应行的单元格的值修改为和它相同。
运行结果如下图所示:
图20-24 下拉框选择值后相应改变别的单元格
相信读者们很快会发现有这样一个问题:当下拉框更改了值,但是第一行数据不会立即改变,只有当下拉框所在单元格失去焦点后,第一列的值才和下拉框单元格的值一致。在Msdn中做了详细说明:DataGridView.CellValueChanged事件发生在的用户指定的值已提交,这通常发生在焦点离开该单元格时。
要实现在从下拉框选择后就立即更改另一列的值,就得用上DataGridView.CurrentCellDirtyStateChanged事件,当单元格被标记为已修改但尚未保存更改时发生。
请在【例 20.19】代码基础上增加以下代码:
//当单元格被标记为已修改但尚未保存更改时发生
private void dgv_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
dgv[0, dgv.CurrentCell.RowIndex].Value = dgv.CurrentCell.EditedFormattedValue;
}
并同时删除【例 20.19】中DataGridView.CellValueChanged事件的代码。
学习更多vb.net知识,请参看vb.net 教程 目录
学习更多C#知识,请参看C#教程 目录