accéder à la valeur de la cellule Datagridview tandis que sa valeur est en cours de modification
-
22-08-2019 - |
Question
J'ai une forme avec un datagridview et lorsque l'utilisateur commencez à saisir la valeur pour la première cellule en première ligne, peut également appuyer sur f2 qui font valoir que la valeur, mais je ne peux pas valeur de la cellule d'accès à moins que l'onglet a frappé l'utilisateur et aller à une autre cellule
Voici 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 renvoie null
La solution 2
@BFree merci de 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;
}
}
Autres conseils
Que diriez-vous de faire quelque chose comme ça à la place. Crochet dans l'événement « EditingControlShowing » du DataGridView et capturer F2 là. Une partie du 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 d'édition, qui est congédié. La chose est cool, il expose le contrôle effectif sous-jacent et vous pouvez le jeter à la commande WinForms réelle et crochet dans toutes ses événements comme vous le feriez normalement.
Vous pouvez essayer
string str = dataGridView.CurrentCell.GetEditedFormattedValue
(dataGridView.CurrentCell.RowIndex, DataGridViewDataErrorContexts.Display)
.ToString();
Il est un gestionnaire de OnKeyDown
pour le DataGridViewCell
:
Cependant, le seul problème est que vous allez devoir créer votre propre cellule personnalisée en fonction de DataGridViewTextBoxCell
pour obtenir la fonctionnalité voulue. Parce qu'il n'y a pas d'événement pour ce gestionnaire exposé.