我刚刚在一个示例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中获取选定项的方式。
最后,你可能需要在转换数值类型时进行检查,因为Value可能不一定是int类型。可以像下面这样进行检查:
int orderid;
if (!int.TryParse(cellcollection.Value.ToString(), out orderid))
{
}
什么时候会触发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);
}
请注意,为使此方法有效,您需要删除设计师生成的事件附件,并引用设计师生成的方法。