DataGridView捕获用户行选择

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

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

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

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

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

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

我想你可以考虑SelectionChanged事件:

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

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

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

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

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

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