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

标签 c# datagridview cell

我有一个带有 datagridview 的表单,当用户开始为第一行的第一个单元格输入值时,也可以按 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].Value 返回 null

最佳答案

不如做这样的事情。连接到 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 控件,并像往常一样连接到它的所有事件。

关于c# - 在编辑其值时访问 Datagridview 单元格值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/877505/

相关文章:

c# - 将 DataGridView 绑定(bind)到数据库中的表

c# - 该进程无法访问该文件,因为它正被另一个进程使用

c# - SQL 删除语句不适用于从 dataGridView 选择行

c# - NLog 在日志文件中包含 EventId

c# - 如何使用 C# 在 datagridview 中读取/加载文本 (*.txt) 文件值 ..?

ios - 分组 UITableview 删除外部分隔线

xcode - 以编程方式将 checkboxcell 添加到 NSTableView

css - 在表格上使用上下文样式将虚线边框应用于特定单元格

C# WebAPI 解析带有额外大括号的 Json 数据

c# - 不存在从对象类型 System.Windows.Forms.DateTimePicker 到已知托管提供程序 native 类型的映射