Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DataGridView捕获用户行选择_C#_Winforms - Fatal编程技术网

C# DataGridView捕获用户行选择

C# DataGridView捕获用户行选择,c#,winforms,C#,Winforms,我在处理DataGridView中的选择时遇到问题。 “我的网格”视图包含“金额”列。表单上有一个文本框,它应该显示所选网格视图行的总数。因此,我需要在用户选择/取消选择gridview行时捕获事件,并相应地计算(添加/减去)金额。我找到了两种方法: 使用RowEnter和RowLeave事件。 当用户选择/取消选择一行时,这些功能可以正常工作。但是,当用户一次选择多行时,只会为最后一行触发事件。因此,从我的总金额中,只有最后一行的金额被加/减。因此,我的结果是错误的 使用RowStateCha

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

  • 使用
    RowEnter
    RowLeave
    事件。 当用户选择/取消选择一行时,这些功能可以正常工作。但是,当用户一次选择多行时,只会为最后一行触发事件。因此,从我的总金额中,只有最后一行的金额被加/减。因此,我的结果是错误的

  • 使用
    RowStateChanged
    事件。 这适用于多行。但是,如果用户在datagrid中滚动,则会触发该事件


  • 有人处理过这样的情况吗。我想知道我应该使用哪个datagrid事件,这样我的代码只有在用户选择/取消选择包括多行的行时才会执行。

    您可以在使用属性的同时使用第一个方法(row-enter-row-leave)。也就是说,当您检测到这些事件时,您需要计算,而不是使用事件参数中的行,通过所选的行循环并获取总数。

    找到了解决方案。我可以使用
    RowStateChanged
    ,并且仅当选中行的
    StateChanged
    时才能运行代码

    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
    }
    

    您可以通过以下方式简单地捕获,但仅限于单行选择:

    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();
    }
    

    我认为你可以考虑选择改变的事件:

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

    我使用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?如果网格处于单元格选择模式,则不会触发它(除非单击行标题)
        private void dataGridView1_SelectionChanged(object sender, EventArgs e)
        {
            if (dataGridView1.SelectedCells.Count > 0)
                Do_Something_With_It(dataGridView1.SelectedCells[0].RowIndex);
        }