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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top