【问题标题】:Get cell contents of a selected row in a DataGridView获取 DataGridView 中选定行的单元格内容
【发布时间】:2011-04-21 15:31:22
【问题描述】:

我有一个从数据库填充的DataGridView

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

我尝试了以下方法:

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

这样一直报错

索引超出范围。必须为非负数且小于集合的大小。

感谢任何帮助。

【问题讨论】:

    标签: c# winforms datagridview


    【解决方案1】:

    我刚刚在一个示例 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);
    }
    

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

    【讨论】:

    • 刚刚注意到您甚至提到了 rowenter - 我现在正在检查。
    • 已检查,我所说的适用于 RowEnter - 代码工作正常,但我想知道是否有更好的事件可以使用,比如 SelectionChanged
    • 我认为这可能与我绑定到 DVG 的方式有关。您认为最好的方法是什么。我试过 EF,我试过用 DVG 任务设置它,我现在正在尝试一个 DataAdapter。
    • .......因为它在表单加载之前从填写 DVG 到此行。它们都在不同的方法中,每个方法都只有一行。
    • 这些方法中的每一个(对于这种情况)都是等效的。问题是当您附加您的 SelectionChanged 事件时。我已经编辑了我的答案。
    【解决方案2】:

    这也有效:

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

    【讨论】:

      【解决方案3】:

      点击Datagridview列可以得到具体的列值

      private void DataGridview_CellContentClick(object sender, 
      DataGridViewCellEventArgs e) { int col = e.ColumnIndex; int row = 
      e.RowIndex; Var value=DataGridview.Rows[row].Cells[col].Value; }
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-12-05
          • 2010-10-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-14
          • 1970-01-01
          • 2013-06-23
          相关资源
          最近更新 更多