Member 11040029 Ответов: 0

Как поместить фокус на следующую ячейку в datagridview из ячейки текстового поля с включенным автозаполнением


У меня есть элемент управления datagridview (DGV) с 3 столбцами, все они имеют элемент управления редактированием типа textbox.

Позвольте мне объяснить два сценария:
Во-первых, в самом первом столбце включается функция автозаполнения. Когда я начинаю печатать, автозаполнение предлагает мне некоторые варианты и завершает его, как только я нажимаю клавишу Enter.
После нажатия клавиши enter фокус смещается на ячейку в том же столбце таблицы. следующий ряд, прямо под ним.

Во-вторых, для ячеек, где функция автозаполнения не включена, при нажатии клавиши enter фокус смещается на следующую ячейку в списке. такой же ряд. Эта функциональность предоставляется моей стороной, как вы найдете в приведенном ниже коде.

Теперь мое требование состоит в том, чтобы переключить фокус на следующую ячейку в той же строке при нажатии клавиши enter независимо от того, включена или выключена функция автозаполнения для ячейки.
Но это не происходит для ячеек, в которых происходит автозаполнение.

Научи меня, как этого достичь.

private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
      {
          try
          {
              TextBox _tbDrCr = e.Control as TextBox;
              if (_tbDrCr != null)
              {
                  switch (((DataGridView)sender).CurrentCell.OwningColumn.Name)
                  {
                      case "nature":
                          _tbDrCr.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
                          _tbDrCr.AutoCompleteSource = AutoCompleteSource.CustomSource;
                          _tbDrCr.AutoCompleteCustomSource = InitializeItemCollection(new String[] { "Dr", "Cr" });
                          _tbDrCr.KeyDown += _tbDrCr_KeyDown;
                          break;
                      case "nature_debit":
                      case "nature_credit":
                          _tbDrCr.KeyPress += _tbDrCr_KeyPress;
                          break;
                      default:
                          _tbDrCr.AutoCompleteMode = AutoCompleteMode.None;
                          break;
                  }
              }
              else
                  throw new InvalidCastException();
          }
          catch (InvalidCastException ex)
          {
              MessageBox.Show(ex.Message+ "\n"+ e.Control.GetType().ToString() +" to TextBox");
          }
      }




void _tbDrCr_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
                if (dataGridView1.CurrentCell.ColumnIndex < dataGridView1.Columns.Count - 1)
                {
                    dataGridView1.CurrentCell = dataGridView1[dataGridView1.CurrentCell.ColumnIndex + 1, dataGridView1.CurrentRow.Index];
                    dataGridView1.CurrentCell.Style.BackColor = Color.Yellow;
                }
        }



private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
           System.Diagnostics.StackTrace stack = new System.Diagnostics.StackTrace();
            MessageBox.Show(stack.ToString());
1].Value.ToString());
}

private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
{
           switch (e.KeyCode)
           {
               case Keys.Enter:
                   if (dataGridView1.CurrentCell.ColumnIndex < dataGridView1.Columns.Count - 1)
                   {
                       dataGridView1.CurrentCell = dataGridView1[dataGridView1.CurrentCell.ColumnIndex + 1, dataGridView1.CurrentRow.Index];
                       dataGridView1.CurrentCell.Style.BackColor = Color.Yellow;
                   }

                   break;
           }
}



private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
            if (dataGridView1.CurrentCell.ColumnIndex < dataGridView1.Columns.Count - 1)
            {
                dataGridView1.CurrentCell = dataGridView1[dataGridView1.CurrentCell.ColumnIndex + 1, dataGridView1.CurrentRow.Index];
                dataGridView1.CurrentCell.Style.BackColor = Color.Yellow;
            }                    
}


Что я уже пробовал:

Я попытался захватить клавишу enter в:
1. событие отключения ключа ячейки,
2. ключевое событие dgv down,
3. Ключевые превью DGV это событие,
4. Событие DGV по cellleave ,
5. событие cellendedit DGV, и после обработки всех этих событий выполнение все еще проходит через некоторые другие события, которые мне неизвестны.

Я прошел через трассировку стека, и глубина, которой я достиг, была до Метода CellEndEdit() для DGV, и после этого я не могу выяснить, что именно смещает фокус на новую строку. В cellendedit () я попытался переключить фокус на следующую ячейку вместо строки, но это было переопределено каким-то другим кодом в последующих шагах, который я не мог отследить.

Обновление 1:
После публикации этого que я пытался найти решение, и у меня получилось это сделать, но решение не кажется мне хорошим.
Я пытаюсь обработать нажатие клавиши enter в событии PreviewKeyDown для textboxcell, и все начинает работать так, как требуется.

Но, насколько мне известно,previewkeydown-это событие, которое происходит до события keydown. Если он работает в previewkeydown, то та же функция должна работать и в keydown, так как клавиша enter также захватывается в событии keydown. Но каким-то образом после захвата нажатия клавиши и события keydown поместите фокус на нужную ячейку, там есть какая-то другая вещь, которая снова смещает фокус на следующую строку.


Обновление 2:
После публикации обновления 1 я попытался и обнаружил, что событие KeyDown не запускается при нажатии клавиши Enter в ячейке текстового поля с включенным автозаполнением. Я попытался установить isinputkey в true для нажатия клавиши enter при событии previewkeydown для ячейки, но снова событие keydown не было запущено.
Теперь мне нужно только запустить событие keydown для нажатия клавиши enter, чтобы функциональность начала работать. Есть предложения?

0 Ответов