Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在编辑Datagridview单元格值时访问其值_C#_Datagridview_Cell - Fatal编程技术网

C# 在编辑Datagridview单元格值时访问其值

C# 在编辑Datagridview单元格值时访问其值,c#,datagridview,cell,C#,Datagridview,Cell,我有一个带有datagridview的表单,当用户开始为第一行的第一个单元格输入值时,也可以按f2键提交该值,但我无法访问单元格值,除非用户点击tab键并转到另一个单元格 下面是我在f2被点击时访问单元格值的代码 protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { var key = new KeyEventArgs(keyData); ShortcutKey(t

我有一个带有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]。值返回null

对于
DataGridViewCell
有一个
OnKeyDown
处理程序:


但是,唯一的问题是,您必须基于
DataGridViewTextBoxCell
创建自己的自定义单元格才能获得预期的功能。因为此处理程序没有公开事件。

不如改为执行类似操作。钩住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控件,并像往常一样钩住它的所有事件。

@BFree感谢您的代码启发了我;)为什么不直接调用这个.dataGridView1.EndEdit(); 在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;
        }
    }
你可以试试这个

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