在子窗体关闭后更新DataGridView
我知道很多类似的问题都在那里。 但是,我对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(); }
现在,当单击“保存”按钮时,我在子窗体上调用此方法。
private void SaveProductButton_Click(object sender, EventArgs e) { SaveProduct(); Products products = new Products(); products.UpdateProductsList(); }
但是,单击“保存”按钮时,这不起作用。 奇怪的是,当我将此方法添加到主窗体上的本地按钮时,它的工作没有问题。
我还向UpdateProductsList
添加了一个MessageBox
,我确信它已被调用,数据也被插入数据库中,但DataGridView
不显示新记录。
那么,我哪里出错了?
当您使用ShowDialog
显示子表单时,您不需要从子表单调用LoadData
,而是可以检查ShowDialog
的结果,如果它是DialogResult.OK
,则调用该方法。
同样在您的子表单中,在保存数据后的保存按钮中,设置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;
注意
- 调用
ShowDialog
,直到对话框关闭后才会执行其后的代码。 - 如果使用
ShowDialog
显示表单,则设置Form
DialogResult
属性将关闭表单。 - 您可以在保存按钮中将
DialogResult
设置为OK
,并在取消按钮中将其设置为Cancel
。 - 目前您的问题出在保存按钮的代码中,您已创建列表表单的新实例并调用其
UpdateProductsList
方法。 它对您可以看到的列表表单的打开实例没有任何影响。 这是一个不同的东西。
这只是一个示例,您如何从子窗体中调用主窗体中的公共方法:
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(); } }