使用DataTable数据源确定DataGridView中的行类型



我一直在写一个小的winforms程序使用DataGridView控件,使用列表<>作为数据源。我使用下面的MouseClick事件来显示一个特定的上下文菜单,这取决于网格中显示的数据(目前有三个选项)。

private void DataGridView_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
int currentMouseOverRow = dataGridView.HitTest(e.X, e.Y).RowIndex;
// Clicking on a row?
if (currentMouseOverRow >= 0 && currentMouseOverRow <= dataGridView.Rows.Count - 1)
{
ContextMenuStrip m;
if (dataGridView.SelectedRows[0].DataBoundItem.GetType() == typeof(DataGrid))
m = gridViewContextDataMenuStrip;
else if (dataGridView.SelectedRows[0].DataBoundItem.GetType() == typeof(InfoGrid))
m = gridViewContextInfoMenuStrip;
else
return;
m.Show(dataGridView, new Point(e.X, e.Y));
}
}
}

这是预期的工作,一切都很好。但后来我想添加列排序,所以我将数据源从List<>DataTable。

现在MouseClick事件不再工作,因为DataBoundItem.GetType()现在不再返回预期的类型。我一直在寻找如何修改代码以从DataTable行获得正确的类型,以便该方法再次开始工作,但到目前为止还没有运气。谁能给我指个正确的方向?

许多谢谢。

回答Caius的问题后,我回到将IEnumerables转换为DataTable的代码。它点击了,当然不会有链接回到原来的数据类型,因为列和行被反射复制到一个全新的DataTable。

作为一个快速修复(这可能会持续),我添加了第二个参数来传递一个包含"数据类型"的字符串,并将其设置为DataTable.TableName。使用这个我可以检查在MouseDown方法来区分不同的数据表。

感谢您的阅读。

相关内容

最新更新