DataGridview.ContainsFocus返回错误

本文关键字:错误 返回 ContainsFocus DataGridview | 更新日期: 2023-09-27 18:26:24

我使用winform DataGridView进行数据输入。问题是,当我的用户输入了一行但没有点击它时,该行不会被保存到网格的数据源(内存中的数据表)。因此,当我的用户提交表单时,我想检测DataGridview是否有焦点,并模拟按键(tab?)或将焦点设置为其他控件,或者执行其他操作来保存当前行而不更改数据。

DataGridView.ContainsFocus总是返回false,DataGridView.Focused也是如此。我应该使用另一处房产吗?我应该如何保存这一行数据?

编辑:请参阅这个问题使用DataGridViewComboboxColumn输入我如何创建DataTable并将其绑定到datagridview的问题。数据网格视图不允许用户删除行,以查看我在这个数据网格中遇到的另一个问题。

DataGridview.ContainsFocus返回错误

Windows窗体控件可以直接连接到数据源,但设计用于BindingSource控件。这用于整理表单控件与数据源之间的输入。

它是一个组件,您可以在设计器中将其拖到窗体上,然后将其设置为datagridview控件的数据源。

一旦它出现在表单上,就可以使用设计器将其设置为数据网格视图的数据源。然后可以使用事件处理程序,例如表单加载事件处理程序来提供一个数据表作为绑定源的数据源。

绑定源为您提供了更精细的控制,可以控制数据如何以及何时从表单控件传输到基础数据源。只需使用绑定源就可以解决您的问题。如果没有,那么在尝试保存数据之前,对绑定源调用EndEdit方法应该会导致任何未完成的编辑被写入数据表。

举个简单的例子,创建一个新的Windows窗体项目。在表单中,添加名为"datagridview1"的datagridview、名为peopleBindingsource的BindingSource和名为saveButton的命令按钮。将gridview1的数据源设置为peopleBindingSource。

为窗体添加事件处理程序。加载并保存按钮。单击如下:

   public DataTable GetData()
    {
        DataTable t = new DataTable();
        t.Columns.Add("FirstName", typeof(string));
        t.Columns.Add("LastName", typeof(string));
        t.Rows.Add("Joe","Bloggs");
        t.Rows.Add("Fred","Bloggs");
        return t;
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        dataGridView1.AutoGenerateColumns = true;
        DataTable people = GetData();
        peopleBindingSource.DataSource = people;
    }
    private void SaveButton_Click(object sender, EventArgs e)
    {
        DataTable t = peopleBindingSource.DataSource as DataTable;
    }

运行应用程序,您应该会发现,如果您在SaveButton_Click中检查数据表,则对数据所做的任何更改都是持久的。

如果您喜欢Visual Studio为您编写所有代码:

  1. 使用"添加数据源…"向导添加新的数据源
  2. 从"数据源"窗口中,将一个表拖到窗体上

Visual studio将添加必要的DataGridView、BindingSource等,并将它们全部连接起来。然后,您可以检查代码,看看它们是如何组合在一起的。