我决定尝试第三方的 DataGridView 实现,特别是为了利用分层网格,即“网格中的网格”功能。虽然这工作得相当好,但我注意到我在正常 DataGridViews 中依赖的一些事件和属性在此实现中不存在,并且必须发现不同的方法来实现相同的目标。
一个这样的目标是,当我使用 CheckBoxColumn 并且用户“选中”或“取消选中”该框时,我需要将该更改推送到网格(以及随后的数据库),否则用户会有点击进入或离开单元格焦点以实际提交更改....有点不稳定。为了解决这个问题,我利用了“CurrentCellDirtyStateChanged”事件,并手动将检查或取消检查提交给网格,这反过来又触发了我的“CellValueChanged”事件:
void dataGridView_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
if ((dataGridView.IsCurrentCellDirty) & (dataGridView.CurrentCell.ColumnIndex == 0))
{
dataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
}
但是,第三方网格不存在此事件,CommitEdit 方法也不存在。为了实现相同的功能,我最终不得不这样做:
void GridView_ValueChanged(object sender, EventArgs e)
{
if(sender.GetType().ToString().Contains("RadCheckBoxEditor"))
{
RadCheckBoxEditor rad_chb = (RadCheckBoxEditor)sender;
GridCheckBoxCellElement checked_a_box = (GridCheckBoxCellElement)rad_chb.OwnerElement;
checked_a_box.Value = rad_chb.Value;
GridViewCellEventArgs new_args = new GridViewCellEventArgs(checked_a_box.RowInfo, checked_a_box.ColumnInfo, checked_a_box.Editor);
GridView_CellValueChanged(checked_a_box, new_args);
}
else
{
return;
}
}
我基本上捕获了脏值,将其分配给“CellValueChanged”处理程序可识别的类型的值,定义了我自己的事件参数,并显式调用了句柄。像这样的东西有任何潜在的气味吗?就是感觉不对。我注意到其他人建议创建一个独立的函数来访问共享代码,但是,这些示例似乎并不依赖于推送事件的特定事件。