acceder valor de la celda Datagridview mientras que su valor está siendo editado
-
22-08-2019 - |
Pregunta
Tengo un formulario con un DataGridView y cuando el usuario empiece a introducir el valor para la primera celda de la primera fila, también puede presionar F2, que sostienen que el valor, pero no puedo valor de la celda de acceso a menos de usuario pestaña golpeó e ir a otra celda
Lo que sigue es mi código para acceder valor de la celda cuando se golpea 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 devuelve null
Solución 2
@BFree gracias a su código me inspiraron;) ¿por qué no llamar this.dataGridView1.EndEdit (); antes MessageBox.Show (dataGridView1.SelectedCells [0] .Value.ToString ());
este código funciona 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;
}
}
Otros consejos
¿Qué hay de hacer algo como esto en su lugar. Enganche en el evento "EditingControlShowing" del DataGridView y capturar la F2 allí. Algunos código:
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);
}
}
}
La idea es simple, puede enchufarse en el caso EditingControlShowing. Cada vez que una célula entra en el modo de edición, que es despedido. Lo interesante es, que expone el control subyacente real y se puede echarlo al control WinForms real, y el gancho en todos los eventos Es como lo haría normalmente.
Puede probar este
string str = dataGridView.CurrentCell.GetEditedFormattedValue
(dataGridView.CurrentCell.RowIndex, DataGridViewDataErrorContexts.Display)
.ToString();
Hay un controlador para el OnKeyDown
DataGridViewCell
:
http://msdn.microsoft .com / es-es / library / system.windows.forms.datagridviewcell.onkeydown.aspx
Sin embargo, el único problema es que usted va a tener que crear su propia celda personalizado basado de DataGridViewTextBoxCell
para obtener la funcionalidad deseada. Debido a que no hay ningún evento expuesta por este controlador.