Frage

Ich habe ein Formular mit einem Datagridview und wenn Benutzer Startwert für in der ersten Reihe ersten Zelle eintritt, kann auch f2 drücken, die diesen Wert unterwerfen, aber ich kippe Wert Zugriff Zelle, es sei denn Benutzer Tab getroffen und in eine andere Zelle gehen

Folgende ist mein Code für den Zugriff auf Zellenwert, wenn f2 getroffen wird

 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] .Wert null zurück

War es hilfreich?

Lösung 2

@BFree dank Code inspiriert mich;) warum nicht nur this.dataGridView1.EndEdit Aufruf (); vor MessageBox.Show (dataGridView1.SelectedCells [0] .Value.ToString ());

Dieser Code funktioniert gut:

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

Andere Tipps

Wie wäre es so etwas wie dies stattdessen tun. Haken in die Datagridview der „EditingControlShowing“ Ereignis und erfassen die F2 dort. Einige 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);
        }
    }

}

Die Idee ist einfach, Sie in das EditingControlShowing Ereignis verknüpfen. Jedes Mal, wenn eine Zelle Bearbeitungsmodus eintritt, dass wird ausgelöst. Die kühle Sache ist, macht es die tatsächliche zugrundeliegende Steuerung und Sie können es auf die tatsächliche WinForms Kontrolle gegossen und Haken in all seinen Veranstaltungen wie gewohnt.

Sie können versuchen, diese

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

Es gibt einen OnKeyDown Handler für das DataGridViewCell:

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

Doch das einzige Problem ist, dass Sie Ihre eigene Zelle DataGridViewTextBoxCell Basis haben werden erstellen, um die beabsichtigte Funktionalität zu erhalten. Denn es gibt kein Ereignis für diesen Handler ausgesetzt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top