获取DataGridView中所选行的单元格内容

时间:2011-04-21 15:31:23

标签: c# winforms datagridview

我从数据库填充了DataGridView

我正在尝试获取RowEnter事件中所选行的内容。我已将网格的选择模式设置为FullRowSelect

我尝试了以下内容:

int orderId = (int)dgUnprocessedCards.Rows[dgUnprocessedCards.SelectedCells[0].RowIndex].Cells[0].Value;

这继续抛出错误

  

指数超出范围。必须是非负数且小于集合的大小。

感谢任何帮助。

3 个答案:

答案 0 :(得分:12)

我刚刚在一个示例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))
{
    // Some logic to deal with the fact that Value was not an int
}

什么时候引发了SelectionChanged事件?

现在 - 正如您所提到的,您的选择会在将数据加载到网格时更改事件。这似乎不会导致我的测试版本出现问题,但可能是您问题的一部分。

为什么会发生这种情况不应该与您正在使用的数据源类型相关,而是与附加选择更改的事件处理程序时相关。这是因为数据绑定会引发选择更改事件。

如果为DataBindingComplete事件添加eventhandler并在那里附加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);
}

请注意,您需要删除设计器生成的事件附件,并引用设计器生成的方法才能使其生效。

答案 1 :(得分:1)

这也有效:

int orderId = (int)dgUnprocessedCards.SelectedCells[0].OwningRow.Cells[0].Value;

答案 2 :(得分:0)

我试图做的工作正常,但绑定是调用选择更改事件。所以我完成了David Hall所建议的(附加和分离事件),我也将它放在try catch块中,现在它完美地工作了。