如何重新访问我之前在子控件中声明的用户控件?

时间:2015-04-23 01:40:16

标签: c# winforms

我想从我的主窗体中重新访问我的一些子usercontrol ..我想访问该对象" watch"我已经从WatchListUC中声明了watch = new WatchListUC();

来自我的主要我在主窗体的面板上声明了这个用户控件

 private void MyList_Load(object sender, EventArgs e)
    {
        LogInScreen screen = new LogInScreen();
        panel2.Controls.Clear();
        panel2.Controls.Add(screen);
        loadDB();
        grid.ContextMenuStrip = OpenDetails;

    }


然后我创建了一个登录,然后我就可以调用WatchListUC watch = new WatchListUC();我想稍后回忆一下

登录屏幕上的

是代码

private void LogIn_Click(object sender, EventArgs e)
    {
        SuspendLayout();
        try
        {
            MySqlConnection conn = new MySqlConnection(myConnection);
            conn.Open();
            MySqlCommand command = new MySqlCommand("SELECT * FROM maindatabase.users where user=?parameter1 and pass=?parameter2;", conn);
            command.Parameters.AddWithValue("?parameter1", User.Text);
            command.Parameters.AddWithValue("?parameter2", Pass.Text);
            MySqlDataReader reader = command.ExecuteReader();

            int ctr = 0;
            while (reader.Read())
            {
                ctr++;
               // controlnum = reader["idnum"].ToString();
                MyList.AccountControlNum = int.Parse(reader["idnum"].ToString());
               // MessageBox.Show(MyList.AccountControlNum.ToString());
            }
            if (ctr == 1)
            {
                this.Parent.Controls.Remove(this);
                MyList my = MyList.ActiveForm as MyList;
                UserAccount acc = new UserAccount();
                my.panel2.Controls.Add(acc);
                my.label1.Text = reader["user"].ToString()+" 'List";
                WatchListUC watch = new WatchListUC();
                my.panel3.Controls.Clear();
                my.panel3.Controls.Add(watch);
                FinishListUC finish = new FinishListUC();
                my.panel4.Controls.Clear();
                my.panel4.Controls.Add(finish);
              //  MessageBox.Show("Success!");
            }
            else
            {
                MessageBox.Show("Invalid Username or Password!");
            }

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


现在在我的主要表格上我如何在" insertWL()"之后重新访问方法??

void ConfirmedWL()
    {
        SuspendLayout();
        try
        {
            MySqlConnection conn = new MySqlConnection(myConnection);
            conn.Open();
            MySqlCommand command = new MySqlCommand("SELECT * FROM maindatabase.watchlist where ControlNum=?CN and idnum=?ID;", conn);
            command.Parameters.AddWithValue("?CN", int.Parse(a.ToString()));
            command.Parameters.AddWithValue("?ID", MyList.AccountControlNum);
            MySqlDataReader reader = command.ExecuteReader();

            int ctr = 0;
            while (reader.Read())
            {
                ctr++;

            }
            if (ctr == 1)
            {
                MessageBox.Show("Already Existed!");
            }
            else
            {
                insertWL();                    
                //WatchListUC watch1 = panel3.Controls.Find("watch", true).DefaultIfEmpty() as WatchListUC;
                //watch1.dvgRefresh();

              //here i want to recall the watch so i can call the method dvgRefresh();
            }


            conn.Close();
            ResumeLayout();
        }
        catch { }
    }<br>

我希望有人可以帮助我,这是我的全部代码和屏幕截图 http://www.mediafire.com/download/1l18e6v8158mi16/Help_please.rar

1 个答案:

答案 0 :(得分:1)

watch是可视对象,可以像每个对象一样使用。

这意味着您可以将其引用存储在最适合您的范围内的任何变量中。

在您的示例中,我将在表单级别定义WatchListUC watch;

LogIn_Click

然后,在watch = new WatchListUC(); my.panel3.Controls.Clear(); my.panel3.Controls.Add(watch); 事件方法中,这样做没有错:

ConfirmedWL

最后,在watch方法中,只需使用您拥有的... else { insertWL(); watch.dvgRefresh(); } 实例。

watch

这种方法的缺点是您必须小心控制生命周期:

    如果没有实例化,则
  • null将为NullReferenceException,如果您尝试使用.Dispose()而不在其中添加新控件,则会导致WatchListUC
  • 此外,请记住在完成操作时动态创建的控件上调用__init__.py。如果您计划在应用程序生命周期中只有一个{{1}}实例,则不需要这样做。