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



我想从我的主窗体重新访问我的一些子用户控件。我想访问我从 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

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

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

在您的示例中,我将在表单级别定义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实例,则不需要这样做。

因此,如果我理解正确,您可以在主窗体上的面板中创建WatchListUC(UserControl)?我感到困惑的是这个登录代码在哪里?这也是你的主形式吗?

Main Form
   | - Panel
        | - WatchListUC

只要您从主窗体中的代码创建 WatchListUC,您需要做的就是将其保存到方法范围之外的变量中。

最新更新