2009-05-18 4 views
2

У меня есть форма с datagridview и когда пользователь начинает вводить значение для первой ячейки в первой строке, также можно нажать f2, которые передают это значение, но я не могу получить значение ячейки доступа, если пользователь вкладки хита и перейти в другую ячейкудоступ к значению ячейки Datagridview при редактировании его значения

следующей мой код для доступа значения ячейки при f2 ударил

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
     var key = new KeyEventArgs(keyData); 

     ShortcutKey(this, key); 

     return base.ProcessCmdKey(ref msg, keyData); 
    } 


    protected virtual void ShortcutKey(object sender, KeyEventArgs key) 
    { 
     switch (key.KeyCode) 
     { 
      case Keys.F2: 
       MessageBox.Show(dataGridView1.SelectedCells[0].Value.ToString()); 
       break; 
     } 
    } 

dataGridView1.SelectedCells [0] .Value возвращает нуль

ответ

2

@BСпасибо, что ваш код вдохновил меня;) почему бы просто не назвать this.dataGridView1.EndEdit(); до MessageBox.Show (dataGridView1.SelectedCells [0] .Value.ToString());

этот код прекрасно работает:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
     var key = new KeyEventArgs(keyData); 

     ShortcutKey(this, key); 

     return base.ProcessCmdKey(ref msg, keyData); 
    } 


    protected virtual void ShortcutKey(object sender, KeyEventArgs key) 
    { 
     switch (key.KeyCode) 
     { 
      case Keys.F2: 
dataGridView1.EndEdit(); 
       MessageBox.Show(dataGridView1.SelectedCells[0].Value.ToString()); 
       break; 
     } 
    } 
+0

Это работало отлично для меня, спасибо! – anon58192932

0

Существует OnKeyDown обработчика для DataGridViewCell:

http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridviewcell.onkeydown.aspx

Однако единственная проблема заключается в том, что вы будете иметь, чтобы создать свою собственную ячейку на основе из DataGridViewTextBoxCell, чтобы получить предполагаемую функциональность. Потому что для этого обработчика нет события.

5

Как сделать что-то подобное вместо этого. Захватите событие DataGridView «EditingControlShowing» и зафиксируйте F2. Некоторый код:

public partial class Form1 : Form 
{ 
    private DataTable table; 
    public Form1() 
    { 
     InitializeComponent(); 
     this.dataGridView1.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(HandleEditingControlShowing); 
     this.table = new DataTable(); 
     table.Columns.Add("Column"); 
     table.Rows.Add("Row 1"); 
     this.dataGridView1.DataSource = table; 
    } 


    private void HandleEditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 
    { 
     var ctl = e.Control as DataGridViewTextBoxEditingControl; 
     if (ctl == null) 
     { 
      return; 
     } 

     ctl.KeyDown -= ctl_KeyDown; 
     ctl.KeyDown += new KeyEventHandler(ctl_KeyDown); 

    } 

    private void ctl_KeyDown(object sender, KeyEventArgs e) 
    { 
     var box = sender as TextBox; 
     if (box == null) 
     { 
      return; 
     } 

     if (e.KeyCode == Keys.F2) 
     { 
      this.dataGridView1.EndEdit(); 
      MessageBox.Show(box.Text); 
     } 
    } 

}

Идея проста, вы крюк в случае EditingControlShowing. Каждый раз, когда ячейка переходит в режим редактирования, это срабатывает. Самое приятное, что он предоставляет фактический базовый элемент управления, и вы можете применить его к фактическому управлению winforms и подключить все его события, как обычно.

1

Вы можете попробовать это

string str = dataGridView.CurrentCell.GetEditedFormattedValue 
      (dataGridView.CurrentCell.RowIndex, DataGridViewDataErrorContexts.Display) 
      .ToString(); 
Смежные вопросы