2013-01-23 13 views
0

我有一个databoundDataGridView。 要插入新行,我处理DefaultValuesNeeded在DataGridView中接受新的一行而无需手动更改其值

新行以我指定的值显示。到这里它工作正常。

此时该行尚未附加到底层的DataTable没关系

接受新行的唯一方法是将任何单元格设置为编辑模式,更改
的值并关闭编辑器。
现在新行被添加到DataTable

我的问题是,我想用最少的用户输入添加行。
如果用户决定的值都很好,他/她应该是能够确认
不改变某些单元格的值(和设置他们回到原来的值)

有没有办法来实现这一目标,例如通过按输入,陷阱命令并强制
DataGridView做如同单元格值更改一样?

我已经尝试更改dgv_KeyDown()中的值,但未成功。
有什么建议吗?

private void dgv_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Enter) 
    { 
     if (dgv.CurrentCell != null && dgv.CurrentCell.OwningRow.DataBoundItem == null) 
     { 
      //ToDo: Accept the new row 

      e.Handled = true; 
     } 
    } 
} 

回答

0

我的建议是,你可以使用CellValidating Even吨和RowValidating Event来实现这一任务。

private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) 
    { 
     if (dataGridView1.IsCurrentCellDirty) //or IsCurrentRowDirty 
     { 
      if (e.ColumnIndex == 1) 
      { 
       if (MessageBox.Show("You're about to change the value. Do you want to continue?\n\nPress ESC to cancel change.", 
            "Confirmation", MessageBoxButtons.OK, MessageBoxIcon.Information) != System.Windows.Forms.DialogResult.OK) 
       { 
        e.Cancel = true; 
       } 
      } 
     } 
    } 
+0

这并不完全是我打算做的。我想将不附加喷嘴的行添加到我的数据源中,而不是阻止更改值。 – TomB

0

我找到了解决方案。
我必须将单元状态设置为脏状态并进入编辑模式。否则当选择另一行时,内部状态将被破坏

private void dgv_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Enter) 
    { 
     if (dgv.CurrentCell != null && dgv.CurrentCell.OwningRow.DataBoundItem == null) 
     { 
      dgv.NotifyCurrentCellDirty(true); 
      dgv.BeginEdit(true); 
      e.Handled = true; 
     } 
    } 
} 
相关问题