【问题标题】:how do i call a method from a usecontrol to a another usercontrol?如何将一个方法从一个用户控件调用到另一个用户控件?
【发布时间】:2015-05-22 02:51:43
【问题描述】:

我有一个用户控件,我在其中添加/更新数据并将其保存到数据库中,我希望数据网格使用我的方法 refreshDVG1();

    public void refreshDVG1()
    {
        try
        {
            dataGridView1.CurrentCell.Selected = this.dataGridView1[0, 0].Selected;
            datset.Clear();
            sda.Fill(datset);
            dataGridView1.Refresh();
            if (dataGridView1.RowCount < 1)
            {

                    datset.Clear();

                    string row = "NO items found";
                    datset.Rows.Add(row);


            }
        }
        catch(Exception ex)
        {
            MessageBox.Show("" + ex);
        }

    }`



但它似乎没有工作并尝试在datagridview的同一用户控件上的按钮上使用该方法并且它工作正常所以我不知道为什么我收到错误btw我收到的错误是我收到一个空引用对象或一些东西..我是 c# 的新手,所以我把这个搞砸了,希望你能帮助我解决这个问题

更新代码,请注意这是来自不同的用户控件,两个用户控件都在同一个表单上

<br><i>private void UpdateAcc_Click(object sender, EventArgs e)
        {
            SuspendLayout();
            using (MySqlConnection conn = new MySqlConnection(myConnection))
            {
                string query = "UPDATE `deqor`.`users` SET `first_name`=?name, `middle_name`=?mname, `last_name`=?lname WHERE `userid`=?para;";
                conn.Open();
                using (MySqlCommand cmd = new MySqlCommand(query, conn))
                {
                    try
                    {
                        cmd.Parameters.AddWithValue("?name", Fname.Text);
                        cmd.Parameters.AddWithValue("?mname", Mname.Text);
                        cmd.Parameters.AddWithValue("?lname", Lname.Text);
                        cmd.Parameters.AddWithValue("?para", manageACC.staticNumData);
                        cmd.ExecuteNonQuery();
                        MessageBox.Show("success");

                            //MainForm main = Form.ActiveForm as MainForm;
                            manageACC main1 = this.Parent.Parent.Parent.Parent as manageACC;
                            main1.refreshDVG1();

                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("error" + ex);
                    }

                }

                conn.Close();
            }
            ResumeLayout();
        }

【问题讨论】:

    标签: c# mysql visual-studio-2010


    【解决方案1】:

    有不同的方法来实现这种方法,其中一个是您可以在第二个用户控件上创建事件并在单击按钮时引发它,然后在表单容器中处理该事件并在处理程序中调用第一个用户控件方法。 另一种方法是您可以在第二个中传递第一个 UserControl 并直接调用该方法。

    您可以在this place找到另一个解决方案

    这取决于您的代码、架构和项目结构。无法回答您的问题。

    如果您想找到最佳解决方案,可以添加更多详细信息。

    public partial class edit : UserControl
    {
         public EventHandler DataUpdated; 
    }
    
    private void UpdateAcc_Click(object sender, EventArgs e)
    {
       // Saving Data In DB
    
       //MainForm main = Form.ActiveForm as MainForm;
       //manageACC main1 = this.Parent.Parent.Parent.Parent as manageACC;
       //main1.refreshDVG1();
       //Instead of commented code raise the event
       if(DataUpdated != null)
          DataUpdated(this, System.eventArgs.Empty);
    }
    

    然后在主窗体代码后面处理DataUpdated事件:

    //edit1 imagine is id of second usercontrol instance
    edit1.DataUpdated += (s,e) => 
    {
        //you have usercontrol1 instance here, so just call method directly here
        //manageACC1imagine is id of first usercontrol instance
        manageACC1.refreshDVG1();
    }
    

    【讨论】:

    • 如果没问题,我可以将表格的整个代码(不是整个项目)发送给您,并将其存储在记事本上,您可以检查它是否适合您
    • 如何在此处附加 rar 文件,其中包含 2 个代码和屏幕截图
    • 最好上传到某处并把链接放在这里
    • 好的,我看到了你的代码,如果我是你,我使用我已经提到的第一个选项,在主窗体中创建事件和句柄,你知道如何实现它吗?
    • uhhm 我在哪里把edit1.DataUpdated += (s,e) => ??在我的主要形式?还是在主用户控件中?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多