无法刷新datagridview-需要对象引用



每次form2关闭时,我都会尝试刷新form1上的数据网格视图。

在表单2中,我有一个关闭事件处理程序,它调用静态方法RefreshGridView(位于表单1中)。

private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
Form1.RefreshGridView();
}

在表单1上,我有一个静态方法RefreshGridView来刷新网格,如下所示。

public static void RefreshGridView()
{
BindingSource bs = new BindingSource();
bs.DataSource = dataGridView1.DataSource;
dataGridView1.DataSource = bs;
}

然而,每次我尝试运行我的代码时,我都会在以下行收到这些错误消息:

bs.DataSource = dataGridView1.DataSource;

错误:非静态字段、方法或属性"PGPTool.Form1.dataGridView1"需要对象引用。

dataGridView1.DataSource = bs;

错误:非静态字段、方法或属性"PGPTool.Form1.dataGridView1"需要对象引用。

我该如何着手解决此问题?

RefreshGridView不应该是静态方法,它应该是实例方法。并且CCD_ 4的实例应该被提供给CCD_ 5。这是因为您希望此方法更改form1上的元素,这些元素是实例的一部分。(例如,如果您有两个form1实例,静态方法将不知道要修改哪个。或者如果您有没有实例,它就没有任何要修改。)

因此,应该将方法更改为:

public void RefreshGridView()

form2中,您应该有一种方法来保存对form1的引用。类似这样的东西:

private Form1 Form1Instance { get; set; }

既然每次form2关闭时都想调用该引用上的某些内容,那么假设form2每次创建时都应该需要form1的引用是否安全?如果是这样,那么您可以在form2的构造函数中强制执行。类似这样的东西:

public Form2(Form1 form1Instance)
{
// perform any error checking and/or null checking on form1Instance here
Form1Instance = form1Instance;
}

然后在form2上的事件中,您可以调用该实例上的方法:

Form1Instance.RefreshGridView();

如果不希望Form2被赋予对Form1的引用,还有另一种方法:事件侦听器。只有当Form1负责创建Form2的实例,或者某个中心代码负责创建这两个实例时,这些才会起作用。

以下是您的操作方法(如果Form1正在创建Form2的实例):

Form2 f2 = new Form2();
f2.FormClosed += (o, e) => { RefreshGridView(); };
//show f2 or do whatever else you need to do with it

如果其他类正在这样做,你必须这样修改:

//f1 is the instance of Form1
Form2 f2 = new Form2();
f2.FormClosed += (o, e) => { f1.RefreshGridView(); };
//show f2 or do whatever else you need to do with it

正如我在评论中提到的和David在回答中提到的,您需要修改RefreshGridView()方法的签名以删除static关键字。

将Form2视为一个对话框,这会容易得多。处理完Form2后,请致电DialogResult.OK。它也会关闭它。

如果你的form1数据网格视图已经绑定到你的bs绑定源,你可能不需要创建新的绑定源,只需再次查询你的数据。

public void RefreshGridView()
{
var q = //your query
bs.dataSource = q
}

回到Form1,你有这样的东西,每次你想打开Form2:时都会调用它

private void openForm2()
{
var f2 = new Form2(); //create new form2
var formResult = f2.ShowDialog(); //open as Dialog and check result after close event
if (formResult == DialogResult.OK) //check form2 dialog result
{
//form2 gave OK, I can update my DGV and display msg
MessageBox.Show("DGV will be updated", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
//update my DGV
RefreshGridView();
}
else
{
//form2 passed Cancel or something else, not good
MessageBox.Show("Form2 Closed but nothing happened.", "", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}   

相关内容

最新更新