【问题标题】:Navigating between user controls in same form在相同形式的用户控件之间导航
【发布时间】:2017-12-13 07:39:32
【问题描述】:

我有一个 Windows 窗体,它允许不同的用户控件通过不同的按钮显示和隐藏。

我希望此用户控件能够直接相互通信并更改值等。

例如下面的usercontrol1

用户将填写表单,然后当他们单击继续时,usercontrol1 应该关闭并且 usercontrol2 现在应该可见,并且用户信息被选中并显示如下

到目前为止,我有下面的代码

private void btnProceed_Click(object sender, EventArgs e)
    {
        string name = tbName.ToString();
        string email = tbEmail.ToString();
        string phone = tbPhone.ToString();
        string color = tbColor.ToString();

        this.Hide();

        UserControl2 u2 = new UserControl2();

        MainForm f1 = new MainForm();
        f1.panelMain.Controls.Add(u2);

        f1.listView1.Items.Add(new ListViewItem(new[]{
                            name,
                            email,
                            phone,
                            color}));
    }

它不起作用。只有 usercontol1 是隐藏的,我留下了一个空白。 我做错了什么?

(使用visual studio 13和c#语言)

【问题讨论】:

  • 因为您正在创建 MainForm 的新实例并将新的用户控件添加到该实例。如果您添加 f1.Show();,您将看到它。但是我假设您想将新的用户控件添加到 MainForm 的现有实例中
  • @steve Yes ....如何在不创建 MainForm 的新实例的情况下添加控件?
  • 以最简单的方式将当前 MainForm 的实例传递给 UserControl 构造函数,将该实例保存在 UserControl 的全局变量中,并在需要切换两个用户控件时使用该实例。这对于正确处理其他任务将是有问题的。我建议重新设计您的应用程序,让 MainForm 决定在需要时显示哪个用户控件。

标签: c# forms visual-studio navigation user-controls


【解决方案1】:

您正在将新的用户控件添加到 MainForm 的新实例中。您看不到它,因为这个新实例从未显示。为了以最简单的方式避免这个问题,您将当前 MainForm 的实例传递给 UserControl 构造函数,将该实例保存在 UserControl 的全局变量中,并在需要切换两个用户控件时使用该实例。

在 MainForm.cs 中(当你创建第一个用户控件时)

UserControl1 uc = new UserControl1(this);
.....

在 UserControl1.cs 中

public class UserControl1
{
   MainForm _current;
   public UserControl1(MainForm f)
   {
       InitializeComponent();
       _current = f;
   }
   private void btnProceed_Click(object sender, EventArgs e)
   {
       .....
       UserControl2 u2 = new UserControl2();
       _current.panelMain.Controls.Add(u2);
       u2.listView1.Items.Add(new ListViewItem(new[]{
                        name,
                        email,
                        phone,
                        color}));
   }
}

这将有问题正确处理其他任务。我建议重新设计您的应用程序,让 MainForm 决定在需要时显示哪个用户控件。

在这种方法中,当用户单击 UserControl1 时,您使用事件在 MainForm.cs 中获得通知,因此您可以在 MainForm.cs 中获得此信息

UserControl1 uc = new UserControl1();
uc.UserClick += UserAdded;
.....

其中 UserAdded 是 MainForm 的一个方法,它通过类 UserInfoArgs 接收有关新用户的信息

public void UserAdded(UserControl1 sender, UserInfoArgs args)
{
    sender.Hide();
    UserControl2 u2 = new UserControl2();
    this.panelMain.Controls.Add(u2);
    u2.listView1.Items.Add(new ListViewItem(new[]{
                        args.name,
                        args.email,
                        args.phone,
                        args.color}));
}

在 UserControl1 中添加委托、事件并在需要向 MainForm 传达有关新用户的信息时引发事件。

public class UserControl1
{
     public delegate void onClick(UserControl1 sender, UserInfoArgs args);
     public event onClick UserClick;
     ....
     private void btnProceed_Click(object sender, EventArgs e)
     {
         UserInfoArgs args = new UserInfoArgs()
         {
             name = tbName.Text,
             email = tbEmail.Text,
             phone = tbPhone.Text,
             color = tbColor.Text
         };
         if(UserClick != null)
            UserClick(this, args);

}
public class UserInfoArgs
{
     public string name {get;set;}
     public string email {get;set;}
     public string phone {get;set;}
     public string color {get;set;}
}

【讨论】:

    【解决方案2】:

    我认为为此使用 backgroundworker 控件实际上适用于您的情况。

    private void btnProceed_Click(object sender, EventArgs e)
    {
        string name = tbName.ToString();
        string email = tbEmail.ToString();
        string phone = tbPhone.ToString();
        string color = tbColor.ToString();
    
        string a = " "+name+" "+email+" "+phone+" "+color;
    
         backgroundWorker1.RunWorkAsync(a);//passing the variables to the backgroundWorker
    }
    

    然后在 backgroundWorker_doWork() 中,你可以随意填充你得到的数据。

    【讨论】:

      【解决方案3】:

      你把事情复杂化了。您可以将 UI 上的两个控件放在同一位置,然后将第二个控件的 Visible 属性设置为 False

      让第一个用户控件为按钮的单击公开一个事件(或者只公开按钮,以便您可以访问其Click 事件),以便您可以从主窗体中检测到鼠标点击。然后,当调用该按钮的侦听器时;主窗体可以从第一个控件中取出数据,用它来初始化第二个控件,然后隐藏第一个,显示第二个。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多