accéder à la valeur de la cellule Datagridview tandis que sa valeur est en cours de modification

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

  •  22-08-2019
  •  | 
  •  

Question

J'ai une forme avec un datagridview et lorsque l'utilisateur commencez à saisir la valeur pour la première cellule en première ligne, peut également appuyer sur f2 qui font valoir que la valeur, mais je ne peux pas valeur de la cellule d'accès à moins que l'onglet a frappé l'utilisateur et aller à une autre cellule

Voici mon code pour accéder à la valeur de la cellule lorsque f2 est frappé

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

Était-ce utile?

La solution 2

@BFree merci de votre code m'a inspiré;) pourquoi ne pas simplement appeler this.dataGridView1.EndEdit (); avant MessageBox.Show (dataGridView1.SelectedCells [0] .Value.ToString ());

ce code fonctionne très 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;
        }
    }

Autres conseils

Que diriez-vous de faire quelque chose comme ça à la place. Crochet dans l'événement « EditingControlShowing » du DataGridView et capturer F2 là. Une partie du code:

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'idée est simple, vous crochet dans l'événement EditingControlShowing. Chaque fois qu'une cellule passe en mode d'édition, qui est congédié. La chose est cool, il expose le contrôle effectif sous-jacent et vous pouvez le jeter à la commande WinForms réelle et crochet dans toutes ses événements comme vous le feriez normalement.

Vous pouvez essayer

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

Il est un gestionnaire de OnKeyDown pour le DataGridViewCell:

http://msdn.microsoft .com / fr-fr / bibliothèque / system.windows.forms.datagridviewcell.onkeydown.aspx

Cependant, le seul problème est que vous allez devoir créer votre propre cellule personnalisée en fonction de DataGridViewTextBoxCell pour obtenir la fonctionnalité voulue. Parce qu'il n'y a pas d'événement pour ce gestionnaire exposé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top