DataGridView捕获用户行选择

时间:2009-06-22 13:59:05

标签: c# winforms

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

  1. 使用RowEnterRowLeave个事件。 当用户选择/取消选择单行时,这些工作正常。但是,当用户一次选择多行时,该事件仅针对最后一行触发。因此,从我的总金额中,只添加/减去最后一行中的金额。因此,我的结果是错误的。

  2. 使用RowStateChanged事件。 这适用于多行。但是,如果用户滚动数据网格,事件将被触发事件。

  3. 是否有人处理过这种情况。我想知道我应该使用哪个datagrid事件,以便我的代码仅在用户选择/取消选择包含多行的行时执行。

6 个答案:

答案 0 :(得分:20)

找到解决方案。我可以使用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
}

答案 1 :(得分:5)

我使用 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);
    }

答案 2 :(得分:3)

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

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

答案 3 :(得分: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 :(得分:0)

您可以使用第一种方法(行输入行离开)和SelectedRows属性。这意味着,当您检测到这些事件时,您需要计算而不是使用事件参数中的行,而是遍历SelectedRows并获得总计。

答案 5 :(得分:0)

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

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