以相同的形式在用户控件之间导航

时间:2017-12-13 07:39:33

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

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

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

例如下面的usercontrol1

enter image description here

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

enter image description here

到目前为止,我有以下代码

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#语言)

3 个答案:

答案 0 :(得分:0)

我认为使用 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()中,您可以根据需要填充您正在获取的数据。

答案 1 :(得分:0)

你太复杂了。您可以将UI上的两个控件分层放在同一位置,并将第二个控件的Visible属性设置为False

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

答案 2 :(得分:0)

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

在MainForm.cs中(当你创建第一个usercontrol时)

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;}
}