【问题标题】:DataGridView capturing user row selectionDataGridView 捕获用户行选择
【发布时间】:2009-06-22 13:59:04
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    找到了解决办法。仅当行的 StateChangedSelected 时,我才能使用 RowStateChanged 并运行我的代码...

    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
    }
    

    【讨论】:

      【解决方案2】:

      我觉得可以考虑SelectionChanged事件:

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

      【讨论】:

      • 如果网格处于单元格选择模式,它将不会被触发(除非您单击行标题)
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        我使用 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?
        【解决方案5】:

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

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

        【讨论】:

        • 当用户使用键盘输入一行时不够
        【解决方案6】:

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

        【讨论】:

        • 我不能这样做,因为我需要从那些最初选择但现在没有选择的记录中减去数量。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        • 2013-11-07
        相关资源
        最近更新 更多