2009-05-18 7 views
2

J'ai un formulaire avec un datagridview et quand l'utilisateur commence à entrer la valeur pour la première cellule dans la première rangée, peut également appuyer sur f2 qui soumettent cette valeur, mais je ne peux pas accéder à la valeur onglet frappé l'utilisateur et passez à une autre celluleaccéder à la valeur de cellule Datagridview pendant que sa valeur est éditée

suivant est mon code pour accéder à la valeur de la cellule lorsque f2 est frappé

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 retourne null

Répondre

2

@BFree merci votre code m'a inspiré;) pourquoi ne pas simplement appeler this.dataGridView1.EndEdit(); avant MessageBox.Show (dataGridView1.SelectedCells [0] .Value.ToString());

ce code fonctionne très bien:

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

Cela a parfaitement fonctionné pour moi, merci! – anon58192932

5

Que diriez-vous de faire quelque chose comme ceci à la place. Accrocher dans l'événement "EditingControlShowing" de DataGridView et capturer le F2 là. Certains code:

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); 
     } 
    } 

}

L'idée est simple, vous crochet dans l'événement EditingControlShowing. Chaque fois qu'une cellule passe en mode édition, elle est déclenchée. La chose cool est, il expose le contrôle sous-jacent réel et vous pouvez le lancer au contrôle Winforms réelle, et accrocher dans tous ses événements comme vous le feriez normalement.

1

Vous pouvez essayer

string str = dataGridView.CurrentCell.GetEditedFormattedValue 
      (dataGridView.CurrentCell.RowIndex, DataGridViewDataErrorContexts.Display) 
      .ToString(); 
Questions connexes