Pergunta

Eu tenho um formulário com um datagridview e quando o usuário começar a digitar valor para primeira célula na primeira linha, também pode pressionar F2, que apresentarem esse valor, mas i valor da célula acesso não pode menos que guia hit usuário e ir para outra célula

seguinte é o meu código para acessar valor de célula quando F2 é atingido

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

Foi útil?

Solução 2

@BFree graças seu código inspirou-me;) porque não basta chamar this.dataGridView1.EndEdit (); antes MessageBox.Show (dataGridView1.SelectedCells [0] .Value.ToString ());

este código funciona muito bem:

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

Outras dicas

Que tal fazer algo assim em seu lugar. Gancho em evento "EditingControlShowing" do DataGridView e capturar o F2 lá. Algum 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);
        }
    }

}

A idéia é simples, você ligar para o evento EditingControlShowing. Cada vez que uma célula entra no modo de edição, que é demitido. O legal é, ele expõe o controle subjacente real e você pode lançá-lo para o controle winforms real, e um gancho em todos os eventos é como faria normalmente.

Você pode tentar este

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

Há um manipulador OnKeyDown para o DataGridViewCell:

http://msdn.microsoft .com / en-us / library / system.windows.forms.datagridviewcell.onkeydown.aspx

No entanto, o único problema é que você vai ter que criar o seu próprio celular personalizado com base de DataGridViewTextBoxCell para obter a funcionalidade pretendida. Porque não há nenhum evento expostos para este manipulador.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top