我决定尝试第三方的DataGridView实现,特别是为了利用分层网格,即“网格内的网格”功能。虽然这很好用,但我注意到我在这个实现中不存在我依赖普通DataGridViews的一些事件和属性,并且必须找到实现相同目标的不同方法。
一个这样的目标是,当我使用CheckBoxColumn并且用户“检查”或“取消检查”该框时,我需要在发生时将该更改推送到网格(以及随后的数据库),否则用户必须按Enter键或离开单元格焦点才能实际提交更改....有点不可思议。为了解决这个问题,我利用了'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'处理程序可识别的类型的值,定义了我自己的事件args,并显式调用了句柄。这样的东西有没有潜在的气味?这只是感觉不对。我注意到其他人建议创建一个独立的函数来访问共享代码,但是,这些示例似乎并不依赖于推送事件的特定事件。