我有一个包含多个 DataGridViews 的应用程序。我想在所有这些事件上运行类似的事件,以检查当用户完成编辑单元格或选择了不同的单元格时数据是否已更改。为此,我在 CellEndEdit 和 CellValidating 事件中添加了一种方法。
我已将代码抽象到我的更改检查方法签名的位置:
ProcessIsChangedCheck<TypedTableBase<DataRow>, DataRow>
(dgv, validatingEventArgs.ColumnIndex,
validatingEventArgs.RowIndex,
getOriginal);
getOriginal 是Func<Decimal, TypedTableBase<DataRow>>
我的想法是,我只想在每个表中添加相同的事件,并根据 DataGridView 显示的数据类型查找 getOriginal 方法。< / p>
我尝试过以下字典方法:
//private Dictionary<Type, Func<Decimal, TypedTableBase<DataRow>>> _getOriginalLookup;
private Dictionary<Type, Func<Decimal, dynamic>> _getOriginalLookup;
private Func<Decimal, TypedTableBase<DataRow>> LookupGetOriginal(Type type)
{
//lazy load the lookuo table
if (null == _getOriginalLookup)
{
Dictionary<Type, Func<Decimal, TypedTableBase<DataRow>>> orig =
new Dictionary<Type, Func<Decimal, TypedTableBase<DataRow>>>(3)
{
{
typeof (csedformsDataSet.AREARow),
//(Func<Decimal, TypedTableBase<DataRow>>)
aREATableAdapter.GetAreaForID
},
{
typeof (csedformsDataSet.FIELDRow),
//(Func<Decimal, TypedTableBase<DataRow>>)
fIELDTableAdapter.GetForFieldID
},
{
typeof (csedformsDataSet.PROMPTRow),
//(Func<Decimal, TypedTableBase<DataRow>>)
pROMPTTableAdapter.GetByID
}
};
/*,
{
typeof (csedformsDataSet.DIARYRow),
//(Func<Decimal, TypedTableBase<DataRow>>)
dIARYTableAdapter.GetByID
}*/
_getOriginalLookup = orig;
}
return (Func<Decimal, TypedTableBase<DataRow>>) _getOriginalLookup[type];
}
然而,这会导致投射错误。
注意:
每种方法都粗略地返回不同的类型
NamedDataTable : TypedTableBase<NamedRow> where NamedRow : DataRow
形成我能说出来的问题似乎源于 TypedTableBase 上的嵌套类型。
使用字典实现我已经描述过我的事件处理程序如下:
private void CheckIfCellChanged(object sender,
DataGridViewCellEventArgs e)
{
DataGridView dgv = (DataGridView)sender;
DataRowView drv = (DataRowView)dgv.Rows[0].DataBoundItem;
Func<Decimal, TypedTableBase<DataRow>> getOriginal =
LookupGetOriginal(drv.Row.GetType());
ProcessIsChangedCheck<TypedTableBase<DataRow>, DataRow>
(dgv, e.ColumnIndex, e.RowIndex,
getOriginal);
Refresh();
}
那么如何正确定义我的字典以便它编译并根据DataGridView数据的数据类型查找并动态传入getOriginal方法?