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

标签 c# winforms

我想从我的主窗体重新访问我的一些子用户控件..我想访问我从 WatchListUC watch = new WatchListUC(); 声明的对象“watch”;

从我的主要我已经在主窗体的面板上声明了这个用户控件

 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 实例,则不需要这样做。

关于c# - 如何重新访问之前在子控件中声明的用户控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29812074/

相关文章:

c# - 类型转换异常

c# - winform的优化

c# - 需要按特定顺序处理对象 : is this a code smell?

c# - 为什么所选项目没有显示在我的所有者绘制的 ListView 控件中?

c# - 从 TreeView 中的图标设置图像

c# - 在控件 C# 中获取 c.SelectedItem

c# - 如何在 pdf 文档的所有页面上插入背景图像?

c# - 检查对象是否为 C# 中的非特定泛型类型

c# - 编辑时未选择 MVC 级联下拉列表

C#、winform - 使用向上和向下箭头键选择列表框?