从子表单调用父表单中的方法以父表单

时间:2016-09-15 20:55:50

标签: c# winforms datagridview

我有父表格和子表单。

父表单中有一个数据网格视图元素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访问方法时加载数据?

1 个答案:

答案 0 :(得分:1)

我解决了这个问题。我需要在创建子表单时将父对象引用传递给子表单。

由于我正在创建一个新的parentForm对象来访问它的方法,所以这个新对象不是已经实例化的父表单对象,这就是为什么它没有按预期工作,并且由于控制台显示调试文本,它结束了误导我的调试。

这是代码:

在父母表格中:

private parentForm obj_parentform = null;

在儿童表格中:

创建属性以保存对其父级的引用:

public constructor(parentForm parent) {
    obj_parentform = parent;
}

在构造函数中设置对父窗体的引用:

obj_parentform.loadGrid("child");

现在让我们从子窗体中调用父方法:

{{1}}