Изменение статуса IsNewRow на false в DataGridView или имитация нажатия клавиши в ячейке

Я использую DGV в приложении winforms. Я хотел изменить статус строки с 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;
       }
  }

person JPReddy    schedule 07.12.2010    source источник
comment
Спасибо, что поделились MyGridView.NotifyCurrentCellDirty(true);   -  person Sal    schedule 04.11.2019


Ответы (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;
       }
  }
person Jeff Ogata    schedule 07.12.2010
comment
Это было гениально и просто. Я не знаю, почему я пропустил такую ​​простую функцию Rows.Add(). Вы дали очень простое и идеальное решение. Спасибо, чувак, все отлично сработало. Я боролся с этим, чтобы сделать это с последних 4 часов. - person JPReddy; 07.12.2010
comment
@JPReddy, отлично, рад, что смог помочь. - person Jeff Ogata; 07.12.2010