acceder valor de la celda Datagridview mientras que su valor está siendo editado

StackOverflow https://stackoverflow.com/questions/877505

  •  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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top