доступ к значению ячейки Datagridview во время редактирования его значения - PullRequest
2 голосов
/ 18 мая 2009

У меня есть форма с сеткой данных, и когда пользователь начинает вводить значение для первой ячейки в первой строке, я также могу нажать клавишу f2, чтобы передать это значение, но я не могу получить доступ к значению ячейки, если пользователь не нажмет на вкладку и не перейдет в другую ячейку

ниже приведен мой код для доступа к значению ячейки при нажатии 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]. Значение возвращает ноль

Ответы [ 4 ]

5 голосов
/ 18 мая 2009

Как насчет того, чтобы сделать что-то подобное вместо этого? Подключитесь к событию «EditingControlShowing» DataGridView и перехватите там F2. Какой-то код:

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

}

Идея проста, вы подключаетесь к событию EditingControlShowing. Каждый раз, когда ячейка входит в режим редактирования, она срабатывает. Круто то, что он предоставляет действующий базовый элемент управления, и вы можете привести его к фактическому элементу управления winforms и подключиться ко всем его событиям, как обычно.

2 голосов
/ 18 мая 2009

@ BFree спасибо, твой код вдохновил меня;) почему бы просто не вызвать this.dataGridView1.EndEdit (); before MessageBox.Show (dataGridView1.SelectedCells [0] .Value.ToString ());

этот код работает просто отлично:

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;
        }
    }
1 голос
/ 22 сентября 2014

Вы можете попробовать это

string str = dataGridView.CurrentCell.GetEditedFormattedValue
             (dataGridView.CurrentCell.RowIndex, DataGridViewDataErrorContexts.Display)
             .ToString();
0 голосов
/ 18 мая 2009

Для DataGridViewCell имеется обработчик OnKeyDown:

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

Однако единственная проблема заключается в том, что вам придется создать собственную ячейку на основе DataGridViewTextBoxCell, чтобы получить намеченную функциональность. Потому что для этого обработчика нет событий.

...