我刚刚在一个示例 datagridview 应用程序中尝试过这个,它工作得很好,所以肯定有一些你没有告诉我们的事情发生。
要做的第一件事是将你的一个大语句分解成离散的小语句,这样你就可以准确地看到失败的地方。
出于调试目的,您可以将上面的代码改写成这样:
var cellindex = dgUnprocessedCards.SelectedCells[0].RowIndex;
var cellcollection = dgUnprocessedCards.Rows[cellindex].Cells[0];
int orderId = (int)dgUnprocessedCards.Value;
此外,您应该能够执行以下操作来实现您想要的:
int orderId = (int)dataGridView1.SelectedRows[0].Cells[0].Value;
这使用了更简洁的 SelectedRows 集合,我想说的是从 datagridview 访问所选项目的更常用方式。
最后,您可能想要检查您的值转换,因为值可能不一定是 int。比如:
int orderid;
if (!int.TryParse(cellcollection.Value.ToString(), out orderid))
{
// Some logic to deal with the fact that Value was not an int
}
SelectionChanged 事件何时引发?
现在 - 正如您所提到的,您的选择更改事件在将数据加载到网格时触发。这似乎不会导致我的测试版本出现问题,但可能是您的问题的一部分。
为什么会发生这种情况不应该与您使用的数据源类型有关,而是与您附加选择更改事件处理程序的时间有关。这是因为数据绑定会引发选择更改事件。
如果您为 DataBindingComplete 事件添加事件处理程序并在其中附加您的 SelectionChanged 或 RowEnter 事件处理程序,您应该不会看到在数据绑定期间调用的处理程序。
void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
this.dataGridView1.RowEnter += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_RowEnter);
this.dataGridView1.SelectionChanged += new System.EventHandler(this.dataGridView1_SelectionChanged);
}
请注意,您需要删除设计器生成的事件附件并引用设计器生成的方法才能使其正常工作。