Accedendo valore della cella Datagridview mentre il suo valore si modifica
-
22-08-2019 - |
Domanda
Ho una forma con una datagridview e quando l'utente inizia inserendo rapporto prima cella nella prima riga,, può anche premere f2 che sostengono che valore, ma smusso valore della cella accesso meno che l'utente scheda colpito e andare in un'altra cella
che segue è il mio codice per l'accesso ai valore di una cella quando viene colpito 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 restituisce null
Soluzione 2
@BFree grazie il codice mi ha ispirato;) perché non basta chiamare this.dataGridView1.EndEdit (); prima MessageBox.Show (dataGridView1.SelectedCells [0] .Value.ToString ());
questo codice funziona bene:
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;
}
}
Altri suggerimenti
Che ne dite di fare qualcosa di simile, invece. Agganciare in evento "EditingControlShowing" del DataGridView e catturare la F2 lì. Alcuni codice:
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'idea è semplice, si collega nell'evento EditingControlShowing. Ogni volta che una cellula entra in modalità di modifica, che viene licenziato. La cosa interessante è, che espone il controllo effettivo sottostante e può lanciare al controllo effettivo WinForms, e gancio in tutti i suoi eventi come si farebbe normalmente.
Si può provare questo
string str = dataGridView.CurrentCell.GetEditedFormattedValue
(dataGridView.CurrentCell.RowIndex, DataGridViewDataErrorContexts.Display)
.ToString();
C'è un gestore OnKeyDown
per la DataGridViewCell
:
http://msdn.microsoft .com / it-it / library / system.windows.forms.datagridviewcell.onkeydown.aspx
Tuttavia, l'unico problema è che si sta andando ad avere per creare il proprio cellulare personalizzato basato su DataGridViewTextBoxCell
per ottenere la funzionalità desiderata. Perché non c'è nessun evento esposto per questo gestore.