2009-06-22 80 views
9

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

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

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

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

回答

15

找到解决方案。我可以使用RowStateChanged和运行我的代码只有StateChanged该行是Selected ...

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 
} 
0

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

+0

我不能这样做,因为我需要从最初选择的,而不是现在选择那些记录减额。 – 2009-06-22 14:11:15

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

用户用键盘输入一行时不够用 – Alireza 2013-11-12 11:42:04

2

我觉得你可以考虑SelectionChanged事件:

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

我用的SelectionChanged甚至T或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); 
    } 
+0

什么是SetRowProperties? – John 2016-11-15 19:59:40