Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 关闭子窗体后更新DataGridView_C#_.net_Forms_Winforms_Datagridview - Fatal编程技术网

C# 关闭子窗体后更新DataGridView

C# 关闭子窗体后更新DataGridView,c#,.net,forms,winforms,datagridview,C#,.net,Forms,Winforms,Datagridview,我知道有很多类似的问题。但是,我对C#真的很陌生,所以,我不知道如何解决这个问题 我在主窗体上有一个DataGridView,我有一个对话框来添加新记录。因此,我想在对话框关闭时重新加载/刷新主窗体上的DataGridView。(按对话框上的保存按钮) 我在主窗体上有一个公共方法,如下所示,我使用此方法加载数据: public void UpdateProductsList() { String query = "SELECT * FROM product"; con = new Sql

我知道有很多类似的问题。但是,我对C#真的很陌生,所以,我不知道如何解决这个问题

我在主窗体上有一个
DataGridView
,我有一个对话框来添加新记录。因此,我想在对话框关闭时重新加载/刷新主窗体上的
DataGridView
。(按对话框上的保存按钮)

我在主窗体上有一个公共方法,如下所示,我使用此方法加载数据:

public void UpdateProductsList()
{
  String query = "SELECT * FROM product";
  con = new SqlConnection(conString);
  con.Open();
  SqlDataAdapter sda = new SqlDataAdapter(query, con);    
  DataTable dt = new DataTable();
  sda.Fill(dt);
  dataGridView1.DataSource = dt; 
}
我使用以下代码打开子窗体:

private void AddProductButton_Click(object sender, EventArgs e)
{
    Add_product obj = new Add_product();
    obj.ShowDialog();
}
public class Products : Form
{
    public void UpdateProductList()
    {
        // do something here
    }

    private void buttonOpenChildFormClick(object sender, EventArgs e)
    {
        using (var addProduct = new Add_product(this)) //send this reference of MainForm to ChildForm
        {
            addProduct.ShowDialog();
        }
    }
}

public class Add_product : Form
{
    private readonly Products _products;

    public Add_product(Products products) //send reference of MainForm to ChildForm
    {
        _products = products;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        _products.UpdateProductList();
    }
}
现在,当单击Save按钮时,我在子窗体上调用此方法

private void SaveProductButton_Click(object sender, EventArgs e)
{
    SaveProduct();
    Products products = new Products();
    products.UpdateProductsList();
}
但是,单击“保存”按钮时,此操作不起作用。奇怪的是,当我将此方法添加到主窗体上的本地按钮时,它可以正常工作

我还向
UpdateProductsList
添加了一个
MessageBox
,我确信它被调用了,数据也被插入了数据库中,但是
DataGridView
没有显示新记录


那么,我哪里出错了?

这只是一个示例,您是如何从子窗体调用主窗体中的public方法的:

private void AddProductButton_Click(object sender, EventArgs e)
{
    Add_product obj = new Add_product();
    obj.ShowDialog();
}
public class Products : Form
{
    public void UpdateProductList()
    {
        // do something here
    }

    private void buttonOpenChildFormClick(object sender, EventArgs e)
    {
        using (var addProduct = new Add_product(this)) //send this reference of MainForm to ChildForm
        {
            addProduct.ShowDialog();
        }
    }
}

public class Add_product : Form
{
    private readonly Products _products;

    public Add_product(Products products) //send reference of MainForm to ChildForm
    {
        _products = products;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        _products.UpdateProductList();
    }
}

这只是一个示例,说明如何从子窗体调用主窗体中的public方法:

private void AddProductButton_Click(object sender, EventArgs e)
{
    Add_product obj = new Add_product();
    obj.ShowDialog();
}
public class Products : Form
{
    public void UpdateProductList()
    {
        // do something here
    }

    private void buttonOpenChildFormClick(object sender, EventArgs e)
    {
        using (var addProduct = new Add_product(this)) //send this reference of MainForm to ChildForm
        {
            addProduct.ShowDialog();
        }
    }
}

public class Add_product : Form
{
    private readonly Products _products;

    public Add_product(Products products) //send reference of MainForm to ChildForm
    {
        _products = products;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        _products.UpdateProductList();
    }
}

当您使用
ShowDialog
显示子窗体时,您不需要从子窗体调用
LoadData
,而是可以检查
ShowDialog
的结果,如果它是
DialogResult。确定
,调用该方法

同样在子窗体中,在保存数据后的保存按钮中,设置
this.DialogResult=DialogResult.OK

显示子表单

using (var f = new ChildForm())
{
    if(f.ShowDialog()== System.Windows.Forms.DialogResult.OK)
        this.LoadData(); /*Load data in list form*/
}
this.SaveData(); /*Save Data in child form */
this.DialogResult = System.Windows.Forms.DialogResult.OK;
在子窗体中保存按钮

using (var f = new ChildForm())
{
    if(f.ShowDialog()== System.Windows.Forms.DialogResult.OK)
        this.LoadData(); /*Load data in list form*/
}
this.SaveData(); /*Save Data in child form */
this.DialogResult = System.Windows.Forms.DialogResult.OK;
注意

  • 调用时,它后面的代码直到对话框关闭后才会执行
  • 如果使用
    ShowDialog
    显示表单,则设置
    表单的属性将关闭表单
  • 您可以在“保存”按钮中将对话框结果设置为“确定”,并在“取消”按钮中将其设置为“取消”

  • 目前,您的问题在于保存按钮的代码,您已经创建了列表表单的一个新实例,并调用了它的
    UpdateProductsList
    方法。它对您可以看到的列表表单的打开实例没有任何影响。这是一个不同的地方

当您使用
ShowDialog
显示子窗体时,您不需要从子窗体调用
LoadData
,而是可以检查
ShowDialog
的结果,如果它是
DialogResult。确定
,则调用该方法

同样在子窗体中,在保存数据后的保存按钮中,设置
this.DialogResult=DialogResult.OK

显示子表单

using (var f = new ChildForm())
{
    if(f.ShowDialog()== System.Windows.Forms.DialogResult.OK)
        this.LoadData(); /*Load data in list form*/
}
this.SaveData(); /*Save Data in child form */
this.DialogResult = System.Windows.Forms.DialogResult.OK;
在子窗体中保存按钮

using (var f = new ChildForm())
{
    if(f.ShowDialog()== System.Windows.Forms.DialogResult.OK)
        this.LoadData(); /*Load data in list form*/
}
this.SaveData(); /*Save Data in child form */
this.DialogResult = System.Windows.Forms.DialogResult.OK;
注意

  • 调用时,它后面的代码直到对话框关闭后才会执行
  • 如果使用
    ShowDialog
    显示表单,则设置
    表单的属性将关闭表单
  • 您可以在“保存”按钮中将对话框结果设置为“确定”,并在“取消”按钮中将其设置为“取消”

  • 目前,您的问题在于保存按钮的代码,您已经创建了列表表单的一个新实例,并调用了它的
    UpdateProductsList
    方法。它对您可以看到的列表表单的打开实例没有任何影响。这是一个不同的地方

为什么要创建新表单“Products Products=new Products();”?只需将现有主窗体的引用发送到对话框。您能告诉我如何操作吗?我对这个OOP和C有点陌生#当您使用
ShowDialog
显示子窗体时,您不需要从子窗体调用
UpdateProductList
,相反,您可以检查
ShowDialog
的结果,如果它是
DialogResult。确定
,调用该方法。另外,在子窗体的“保存”按钮中,设置
this.DialogResult=DialogResult.OK
。当前,您的问题在于“保存”按钮的代码,您已经创建了列表窗体的新实例,并调用了它的
UpdateProductsList
方法。它对您可以看到的列表表单的打开实例没有任何影响。这是一个不同的观点。作为旁注,
Add\u product
Products
不适合作为表单的名称。当您查看这些名称时,它们就像方法名称一样,
ProductAddForm
ProductListForm
是更好的选择。为什么要创建新表单“Products=new Products();”?只需将现有主窗体的引用发送到对话框。您能告诉我如何操作吗?我对这个OOP和C有点陌生#当您使用
ShowDialog
显示子窗体时,您不需要从子窗体调用
UpdateProductList
,相反,您可以检查
ShowDialog
的结果,如果它是
DialogResult。确定
,调用该方法。另外,在子窗体的“保存”按钮中,设置
this.DialogResult=DialogResult.OK
。当前,您的问题在于“保存”按钮的代码,您已经创建了列表窗体的新实例,并调用了它的
UpdateProductsList
方法。它对您可以看到的列表表单的打开实例没有任何影响。这是一个不同的观点。作为旁注,
Add\u product
Products
不适合作为表单的名称。当你看这些名称时,它们就像方法名称,
ProductAddForm
ProductListForm
是更好的选择。我这样做了,但它说
对象引用没有设置为对象的实例。
在哪里?哪一行?在您的情况下,您必须将“this”添加到此行:“add_product obj=new add_product(this);”Whay return empty form?我这样做了,但它说
对象引用未设置为对象的实例。
在哪里?哪一行?