从另一种形式刷新dataGridView的DataSource

时间:2012-10-26 13:03:53

标签: c# winforms datagridview

我创建了一个在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;

但这也不起作用。

请建议一种方法来做到这一点。 感谢。

3 个答案:

答案 0 :(得分:4)

问题在于您正在使用函数static。您不需要这样做 - 只需将其设为public

请参阅此文档,了解静态方法和实例方法之间的区别:
http://msdn.microsoft.com/en-us/library/aa645629(v=vs.71).aspx

为了调用公共函数,您需要从子表单引用父表单 instance (而不仅仅是类)。在属于LogicalParent类型ParentForm的子表单中添加一个属性(替换您实际的父表单类型)(已经有名为ParentParentForm的属性,但是它们被使用了对于别的东西,你不应该使用它们):

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
}