1

我制作了一个在 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 定义为公共的,然后从另一种形式访问它:

((Form1)fr1).dataGridView1.DataSource = myDataTable;

但这也没有用。

请提出一种方法来做到这一点。谢谢。

4

3 回答 3

4

问题是你正在制作函数static。你不需要那样做——只要去做public

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

为了调用公共函数,您需要从子表单中引用父表单实例(不仅仅是类)。向您的子表单添加一个名为LogicalParenttype的属性ParentForm(替换您的实际父表单的类型)(已经有名为Parentand的属性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 环境(如果您不知道那是什么,请忽略它),那么您可以像使用上面的ParentForm属性一样使用该Owner属性(您需要将其强制转换为父类型)。MDI环境解释起来比较复杂,既然你没说你用的就是这个,这里就不解释了。如果您需要更多信息,请访问:http: //msdn.microsoft.com/en-us/library/xyhh2e7e.aspx

于 2012-10-26T13:24:43.840 回答
0

我会将 RefreshMyDGV() 方法公开。然后,您可以通过子表单上的父级访问它。

由于您更改了数据,因此重置绑定应该可以解决问题。

dataGridView1.ResetBindings()
于 2012-10-26T13:22:47.707 回答
0

您可以使用子窗体的 DialogResult

然后代替childform.Show();

你会用 childform.ShowDialog();

ParentForm 现在将在继续之前等待 DialogResult

在子窗体中成功更改数据库的位置,您可以设置 Dialogresult

在子窗体中:

try
{

//alter database

//set DialogResult
this.Dialogresult = DialogResult.OK;

}

catch(System.Exception)
{
//Error Message
this.Dialogresult = DialogResult.NO;
}

在父窗体中:

ChildForm cf = new ChildForm();
cf.ShowDialog();

if(cf.DialogResult = DialogResult.OK)
{
    //SET DATASOURCE
}
于 2013-06-12T10:37:59.953 回答