我有父表格和子表单。
父表单中有一个数据网格视图元素dgv
。
加载父窗体时,行会添加到此dgv
。
创建行的数据是从MySQL数据库获得的。
父表单上的按钮会加载子表单。
子窗体更改数据库表内容,然后调用父方法以重新加载dgv
,以便用户看到更改完成后关闭子窗体。
调用父方法的子表单:
parentForm obj_parentform = new parentForm();
obj_parentform.loadGrid("from_child");
我为调试目的创建的父窗体中有另一个按钮,它调用本地方法,因为它采用相同的形式。
private void btn_debug_Click(object sender, EventArgs e) {
this.loadGrid("btn");
}
方法:
public void loadGrid(string caller) {
try {
this.dgv.Rows.Clear();
Console.WriteLine("### - caller: " + caller);
string link = "database;datasource;port;username;password";
MySqlConnection conn = new MySqlConnection(link);
String query = "SELECT * FROM table";
MySqlCommand cmd = new MySqlCommand(query, conn);
conn.Open();
MySqlDataReader dr = cmd.ExecuteReader();
if(dr.HasRows) {
while(dr.Read()) {
this.dgv.Rows.Add(
Convert.ToString(dr.GetValue(0)),
Convert.ToString(dr.GetValue(1)),
Convert.ToString(dr.GetValue(2)),
Convert.ToString(dr.GetValue(3)),
Convert.ToString(dr.GetValue(4))
);
}
}
cmd.Dispose();
conn.Close();
}catch(Exception ex) {
MessageBox.Show(ex.Message);
}
}
现在当子表单改变表中的数据并调用父方法时,我可以看到控制台显示:
### - caller: from_child
但是dgv
显示相同的行,即使输入方法也不会进行任何更改。
之后,我按下调试按钮,控制台显示:
### - caller: btn
并重新加载dgv
,现在会显示以前从子表单中执行的更改。
两个调用都在进入方法,但为什么dgv
仅在从调试btn
访问方法时加载数据?
答案 0 :(得分:1)
我解决了这个问题。我需要在创建子表单时将父对象引用传递给子表单。
由于我正在创建一个新的parentForm对象来访问它的方法,所以这个新对象不是已经实例化的父表单对象,这就是为什么它没有按预期工作,并且由于控制台显示调试文本,它结束了误导我的调试。
这是代码:
在父母表格中:
private parentForm obj_parentform = null;
在儿童表格中:
创建属性以保存对其父级的引用:
public constructor(parentForm parent) {
obj_parentform = parent;
}
在构造函数中设置对父窗体的引用:
obj_parentform.loadGrid("child");
现在让我们从子窗体中调用父方法:
{{1}}