在DataGridView中将IsNewRow状态更改为false或在单元格上模拟击键

时间:2010-12-07 09:38:45

标签: c# winforms datagridview simulation

我在winforms应用程序中使用DGV。我想将行状态从New(IsNewRow)更改为已编辑。每当我们开始在DGV的最后一行输入值时,它会通过将当前行IsNewRow属性设置为false来在编辑行下面创建另一行。

在我的要求中,当用户位于最后一行并且按下F6时,我将几个单元格值从上面的行复制到当前行。此时,当前行仍处于新行状态(IsNewRow = true)。一旦我将值复制到上一行的当前行,我想将当前行的状态更改为已编辑,以便DGV在当前行下创建另一行作为新行。不确定哪个事件会让DGV创建一个新行,所以请帮助我。

无论如何我可以改变当前行的状态吗? IsNewRow属性是只读的,所以无法修改它。

更新:我找到了设置当前行状态的方法(IsNewRow = false)。使用以下方法:MyGridView.NotifyCurrentCellDirty(true);

至少我想模拟击键,这样我就可以通过编辑这一行来欺骗DGV来创建另一行。任何人都可以告诉我如何在DGV中这样做吗?

此DGV不是数据绑定。

以下是用于将值从上一行复制到当前行的代码:

  switch (e.KeyData)
  {
    case Keys.F6: //Copy the row above.
      if (MyGridView.CurrentRow != null && MyGridView.CurrentRow.Index > 0)
      {
        MyGridView.CurrentRow.Cells[CustomColumn.Index].Value
          = MyGridView.Rows[rowIndex - 1].Cells[Customer.Index].Value;

        MyGridView.CurrentRow.Cells[DateColumn.Index].Value
          = MyGridView.Rows[rowIndex - 1].Cells[DateColumn.Index].Value;

        MyGridView.CurrentRow.Cells[RefColumn.Index].Value
          = MyGridView.Rows[rowIndex - 1].Cells[RefColumn.Index].Value;
       }
  }

1 个答案:

答案 0 :(得分:1)

我不知道如何操作行状态来执行此操作,但您可以添加新行,然后设置当前行值。我发现当你添加一个新行时,它会显示在当前新行的上方,所以如果你没有重置当前行,你会在网格中得到一个空行。

尝试以下操作,看看它是否符合您的要求。我还更改了行索引测试,因此只有在用户位于新行时才会复制值。

  switch (e.KeyData)
  {
    case Keys.F6: //Copy the row above.
      if (MyGridView.NewRowIndex > 0 && MyGridView.NewRowIndex == rowIndex)
      {
        int colIndex = MyGridView.CurrentCell.ColumnIndex;

        MyGridView.Rows.Add();
        MyGridView.CurrentCell = MyGridView.Rows[rowIndex].Cells[colIndex];

        MyGridView.CurrentRow.Cells[CustomColumn.Index].Value
          = MyGridView.Rows[rowIndex - 1].Cells[Customer.Index].Value;

        MyGridView.CurrentRow.Cells[DateColumn.Index].Value
          = MyGridView.Rows[rowIndex - 1].Cells[DateColumn.Index].Value;

        MyGridView.CurrentRow.Cells[RefColumn.Index].Value
          = MyGridView.Rows[rowIndex - 1].Cells[RefColumn.Index].Value;
       }
  }