我使用winform DataGridView进行数据输入。问题是,当我的用户输入了一行但没有点击它时,该行不会被保存到网格的数据源(内存中的数据表)。因此,当我的用户提交表单时,我想检测DataGridview是否具有焦点,并模拟按键(选项卡?)或将焦点设置为其他控件或执行其他操作以保存当前行而不更改数据。
DataGridView.ContainsFocus
总是返回false,DataGridView.Focused
也是如此。我应该使用另一种房产吗?我该如何保存这一行数据?
编辑:请参阅此问题Trouble using DataGridViewComboboxColumn for input,了解我如何创建DataTable并将其绑定到datagridview。并datagridview not allowing user to delete row看到我对同一个数据网格的另一个问题。
答案 0 :(得分:3)
Windows窗体控件可以直接连接到数据源,但设计用于BindingSource控件。这用于将表单控件的输入与数据源进行编组。
这是一个可以在设计器中拖动到表单上的组件,然后您可以将其设置为datagridview控件的数据源。
一旦它出现在表单上,您就可以使用设计器将其设置为datagridview的数据源。然后,您可以使用事件处理程序,例如,表单加载事件处理程序,以提供数据表作为绑定源的数据源。
绑定源为您提供了更好的控制,可以更好地控制数据从表单控件传输到底层数据源的方式和时间。只需使用绑定源可以解决您的问题。如果没有,那么在尝试保存数据之前调用绑定源上的EndEdit方法应该会导致任何未完成的编辑被写入数据表。
举一个简单的例子,创建一个新的Windows窗体项目。在表单中,添加一个名为“datagridview1”的datagridview,一个名为peopleBinding source的BindingSource,以及一个名为saveButton的命令按钮。将gridview1的数据源设置为peopleBindingSource。
为form.Load和saveButton.Click添加事件处理程序,如下所示:
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为您编写所有代码:
Visual Studio将添加必要的DataGridView,BindingSource等,并将它们连接起来。然后,您可以检查代码以查看它们是如何组合在一起的。