C# DataGridview.ContainesFocus返回错误

C# DataGridview.ContainesFocus返回错误,c#,datagridview,datatable,C#,Datagridview,Datatable,我正在使用WinFormDataGridView进行数据输入。问题是,当我的用户输入了一行但没有单击它时,该行不会保存到网格的数据源(内存中的数据表)。因此,当用户提交表单时,我希望检测DataGridview是否具有焦点,并模拟按键(tab?),或将焦点设置为其他控件,或执行其他操作以保存当前行而不更改数据 DataGridView.ContainsFocus总是返回false,就像DataGridView.Focused一样。还有其他我应该使用的财产吗?我应该如何保存这行数据 编辑:关于如何

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

DataGridView.ContainsFocus
总是返回false,就像
DataGridView.Focused
一样。还有其他我应该使用的财产吗?我应该如何保存这行数据


编辑:关于如何创建DataTable并将其绑定到datagridview,请参见此问题。来看看我在这个datagrid中遇到的另一个问题。

Windows窗体控件可以直接连接到数据源,但设计为与控件一起使用。这用于将表单控件的输入封送至数据源或从数据源封送至数据源

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

一旦它出现在表单上,就可以使用设计器将其设置为datagridview的数据源。然后,您可以使用事件处理程序(例如,form load事件处理程序)提供datatable作为绑定源的数据源

绑定源为您提供了更精细的控制,可以控制如何以及何时将数据从表单控件传输到基础数据源。简单地使用绑定源可能会解决您的问题。如果不是,则在尝试保存数据之前调用绑定源上的EndEdit方法将导致任何未完成的编辑写入datatable

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

为form.Load和saveButton添加事件处理程序。单击如下所示:

   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_中检查数据表,那么您对数据所做的任何更改都会保持不变

如果您希望Visual Studio为您编写所有代码:

  • 使用“添加数据源…”向导添加新数据源
  • 从“数据源”窗口中,将表拖到窗体上

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

    Windows窗体控件可以直接连接到数据源,但设计为与控件一起使用。这用于将表单控件的输入封送至数据源或从数据源封送至数据源

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

    一旦它出现在表单上,就可以使用设计器将其设置为datagridview的数据源。然后,您可以使用事件处理程序(例如,form load事件处理程序)提供datatable作为绑定源的数据源

    绑定源为您提供了更精细的控制,可以控制如何以及何时将数据从表单控件传输到基础数据源。简单地使用绑定源可能会解决您的问题。如果不是,则在尝试保存数据之前调用绑定源上的EndEdit方法将导致任何未完成的编辑写入datatable

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

    为form.Load和saveButton添加事件处理程序。单击如下所示:

       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_中检查数据表,那么您对数据所做的任何更改都会保持不变

    如果您希望Visual Studio为您编写所有代码:

  • 使用“添加数据源…”向导添加新数据源
  • 从“数据源”窗口中,将表拖到窗体上

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

    如果他们确实在单击提交按钮,那么focus已经离开了网格。这就是为什么网格聚焦是错误的。更改没有提交到数据源肯定还有另一个原因。@IgbyLargeman-好的,我应该查找什么?您能在这里提供一点关于工作流的详细信息吗。您说用户尚未单击某一行,但正在触发保存。是什么触发的?我在过去也遇到过类似的事情,但是很久以前,所以细节很模糊。像往常一样,一些代码确实会有帮助。@DavidHall-我不确定这里要包含什么代码,我的部分类超过1000行。“保存”只是用户单击提交按钮,从所有控件获取值并将其传递给我的数据库代码。用户在datagridview中键入了一些内容,但该行尚未提交。我试图将它们从自身中保存,因为这一行根本无法保存,并且没有错误消息。我甚至不知道如何在这个问题上发出错误消息。那么您是否有绑定源或数据表?您从哪里获取要保存的数据?正如Igby正确地说的那样,单击Submit按钮将导致网格失去焦点,在正常情况下,这将导致行提交。如果用户将标签从网格中移出,这是否有效?正如我所说,我也遇到过类似的问题,但那是两年多前我在上一份工作中遇到的,所以我想不起确切的原因或解决方法。如果你