DataGridView捕捉用户行选择

19

我在处理 DataGridView 中的选择时遇到了困难。 我的网格视图包含一个金额列。表单上有一个文本框,应该显示所选网格视图行的总金额。因此,我需要捕获用户选择/取消选择网格视图行时触发的事件,并相应地计算(添加/减去)金额。我找到了两种方法:

  1. 使用 RowEnterRowLeave 事件。 当用户仅选择/取消选择单个行时,这些事件运行良好。但是,当用户同时选择多个行时,事件仅针对最后一行触发。因此,只有最后一行中的金额被添加/减去,导致我的结果错误。

  2. 使用 RowStateChanged 事件。 这适用于多个行。但是,即使用户滚动数据网格,事件也会被触发。

是否有人处理过这种情况?我想知道我应该使用哪个数据网格事件,以便仅在用户选择/取消选择行(包括多个行)时执行我的代码。

6个回答

29

找到解决方案了。我可以使用 RowStateChanged,并且只在行的 StateChangedSelected 时运行我的代码...

private void dgridv_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e)
{
    // For any other operation except, StateChanged, do nothing
    if (e.StateChanged != DataGridViewElementStates.Selected) return;

    // Calculate amount code goes here
}

9

我使用SelectionChanged事件或CellValueChanged事件:

        dtGrid.SelectionChanged += DataGridView_SelectionChanged;
        this.dtGrid.DataSource = GetListOfEntities;
        dtGrid.CellValueChanged += DataGridView_CellValueChanged;


    private void DataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
        DataGridViewRow row = dtGrid.Rows[e.RowIndex];
        SetRowProperties(row);
    }

    private void DataGridView_SelectionChanged(object sender, EventArgs e)
    {
        var rowsCount = dtGrid.SelectedRows.Count;
        if (rowsCount == 0 || rowsCount > 1) return;

        var row = dtGrid.SelectedRows[0];
        if (row == null) return; 
        ResolveActionsForRow(row);
    }

什么是SetRowProperties? - John

6

我认为您可以考虑使用SelectionChanged事件:

private void DataGridView1_SelectionChanged(object sender, EventArgs e) {
  textbox1.Text = DataGridView1.SelectedRows.Count.ToString();
}

如果网格处于单元格选择模式,则不会触发它(除非您单击行标题)。 - Alex P.

3

您可以使用SelectionChanged事件,并检索所选单元格的行索引:

    private void dataGridView1_SelectionChanged(object sender, EventArgs e)
    {
        if (dataGridView1.SelectedCells.Count > 0)
            Do_Something_With_It(dataGridView1.SelectedCells[0].RowIndex);
    }

2
您可以通过以下方式简单地捕获此内容,但仅限于单行选择:
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
    MessageBox.Show("Selected row is=" + e.RowIndex);
    //  you can perform (any operation) delete action on selected row like

    dataGridView1.Rows.RemoveAt(e.RowIndex);
    dataGridView1.Refresh();
}

4
当用户使用键盘输入一行时,输入不足。 - Alireza

0

您可以使用第一种方法(行进入行离开)以及SelectedRows属性。也就是说,当您检测到这些事件并且需要进行计算时,不要使用事件参数中的行,而是循环遍历所选行并获取您的总数。


我无法这样做,因为我需要从最初选择但现在未被选择的记录中减去金额。 - Rashmi Pandit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接