【问题标题】:Refreshing dataGridView's DataSource from another form从另一个表单刷新 dataGridView 的 DataSource
【发布时间】:2013-06-12 18:37:59
【问题描述】:

我制作了一个在 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;

但这也没有用。

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

【问题讨论】:

  • 当您说“我试图将此函数更改为公共静态函数,以便能够从另一个(子)表单访问它”时,听起来您没有参考原始表单的实例。真的吗?在那种情况下,什么是 fr1?您应该能够使刷新网格的函数成为公共实例成员并毫无问题地调用该实例成员。如果将数据源设置为 null 会发生什么 - 它会清除网格吗?

标签: c# winforms datagridview


【解决方案1】:

问题是您正在创建函数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 环境(如果您不知道那是什么,请忽略它),那么您可以像使用上面的 Owner 属性一样使用 ParentForm 属性(您需要将其转换为父类型)。 MDI环境解释起来比较复杂,既然你没说你用的就是这个,这里就不解释了。如果您需要更多信息,请访问:http://msdn.microsoft.com/en-us/library/xyhh2e7e.aspx

【讨论】:

  • 我这样做了,它再次抛出“需要非静态字段”错误
  • 对不起,这个网站显然有一些问题,它没有告诉我你的全部答案。添加 LogicalParent 效果很好,问题就解决了。非常感谢。
  • @NDraskovic - 网站没有问题。我发布了初步回复,然后在后续更新中添加了更多细节。如果您没有刷新页面,那么您将看不到编辑(因此我的回复,建议您刷新页面)
【解决方案2】:

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

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

dataGridView1.ResetBindings()

【讨论】:

  • 通过父级访问是什么意思?你能给我一个代码示例吗?
【解决方案3】:

你可以使用子表单的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
}

【讨论】:

    猜你喜欢
    • 2012-05-25
    • 2015-01-16
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    相关资源
    最近更新 更多