我创建了一个在DataGridView控件中显示一些数据的应用程序。数据存储在SQL数据库中。由于此特定显示有很多参数,我在同一项目中创建了另一个(子)表单,帮助用户在数据库中添加或替换数据。添加和交替函数都可以正常工作,但DataGridView中的数据保持不变。我知道如何刷新DataGridView的DataSource,但我不知道如何从另一种形式触发该函数。
我使用此函数刷新DataGridView的DataSource:
private void RefreshMyDGV()
{
command.CommandText = "SELECT * FROM MyDataBase";
SDA.SelectCommand = command;
SDA.Fill(myDataTable);
dataGridView1.DataSource = MyDataTable;
}
我尝试将此函数更改为公共静态函数,因此我可以从其他(子)格式访问它,但编译器会抛出错误“非静态字段需要对象引用,方法或财产“。
我还尝试将DataGridView定义为public,然后从另一种形式访问它:
((Form1)fr1).dataGridView1.DataSource = myDataTable;
但这也不起作用。
请建议一种方法来做到这一点。 感谢。
答案 0 :(得分:4)
问题在于您正在使用函数static
。您不需要这样做 - 只需将其设为public
。
请参阅此文档,了解静态方法和实例方法之间的区别:
http://msdn.microsoft.com/en-us/library/aa645629(v=vs.71).aspx
为了调用公共函数,您需要从子表单引用父表单 instance (而不仅仅是类)。在属于LogicalParent
类型ParentForm
的子表单中添加一个属性(替换您实际的父表单类型)(已经有名为Parent
和ParentForm
的属性,但是它们被使用了对于别的东西,你不应该使用它们):
public ParentForm LogicalParent{ get; set; }
现在,在父窗体上,当您打开子窗体的新实例时,请在调用Show函数之前设置此属性:
ChildForm l_childForm = new ChildForm();
l_childForm.LogicalParent = this;
l_childForm.Show();
现在,在子表单上,您可以引用父表单。您现在可以调用公共函数:
this.LogicalParent.RefreshMyDGV();
替代:
在父表单上,将对父表单的引用传递给ShowDialog
函数:
ChildForm l_childForm = new ChildForm();
l_childForm.ShowDialog(this);
现在,在子窗口中,您可以通过Owner
属性访问父窗体。但是您需要将Owner
属性转换为父窗体的类型。所以,在孩子形式:
((ParentForm)this.Owner).RefreshMyDGV();
MDI:
如果您正在使用MDI环境(如果您不知道这是什么,请忽略它),那么您可以像使用上面的ParentForm
属性一样使用Owner
属性(您需要将其强制转换为父类型)。 MDI环境解释起来比较复杂,因为你没有说过你正在使用的东西我不会在这里解释。如果您需要更多信息,请访问:http://msdn.microsoft.com/en-us/library/xyhh2e7e.aspx
答案 1 :(得分:0)
我会将RefreshMyDGV()方法公开。然后,您可以通过子表单上的父级访问它。
由于您更改了数据,因此重置绑定应该可以解决问题。
dataGridView1.ResetBindings()
答案 2 :(得分:0)
您可以使用子表单的DialogResult
然后代替childform.Show();
您使用childform.ShowDialog();
ParentForm现在将继续等待DialogResult
如果您成功更改了子窗体中的数据库,则可以设置Dialogresult
在childForm中:
try
{
//alter database
//set DialogResult
this.Dialogresult = DialogResult.OK;
}
catch(System.Exception)
{
//Error Message
this.Dialogresult = DialogResult.NO;
}
在parentForm中:
ChildForm cf = new ChildForm();
cf.ShowDialog();
if(cf.DialogResult = DialogResult.OK)
{
//SET DATASOURCE
}