在编辑单元格的值时访问Datagridview单元格的值

3

我有一个带有DataGridView的表单,当用户开始为第一行中的第一个单元格输入值时,可以按下F2提交该值,但是除非用户按下Tab并进入另一个单元格,否则我无法访问单元格值。

以下是我的代码,用于在按下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返回null

4个回答

6
不妨尝试这种做法。在 DataGridView 的 "EditingControlShowing" 事件中挂钩并捕获 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

@BFree,谢谢您的代码,它给了我启示 ;) 为什么不在MessageBox.Show(dataGridView1.SelectedCells[0].Value.ToString())之前调用this.dataGridView1.EndEdit()呢?

这段代码完全可行:

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
你可以尝试这个。
string str = dataGridView.CurrentCell.GetEditedFormattedValue
             (dataGridView.CurrentCell.RowIndex, DataGridViewDataErrorContexts.Display)
             .ToString();

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接