C# 在表单之间传递值;精炼

C# 在表单之间传递值;精炼,c#,winforms,forms,variables,radio-button,C#,Winforms,Forms,Variables,Radio Button,基本上;Form1有2个按钮,Form2有1个按钮。 当你点击Form2的按钮时,它会检查你点击了Form1上的哪个按钮,打开Form3或Form4取决于你点击了哪个按钮(在Form1上) 所以我使用了Mark Halls在表单之间传递变量的第一种方法。现在是我的封闭精炼的下半部分 表格1 表格2 在Form2上有两个单选按钮,我能熟练地使用该代码在打开表单时设置选项卡控件的焦点吗?例如,如果选中radClient,则在打开winform后将焦点设置在tabcontrol上,如果选中radSt

基本上;Form1有2个按钮,Form2有1个按钮。 当你点击Form2的按钮时,它会检查你点击了Form1上的哪个按钮,打开Form3或Form4取决于你点击了哪个按钮(在Form1上)


所以我使用了Mark Halls在表单之间传递变量的第一种方法。现在是我的封闭精炼的下半部分

表格1

表格2

在Form2上有两个单选按钮,我能熟练地使用该代码在打开表单时设置选项卡控件的焦点吗?例如,如果选中radClient,则在打开winform后将焦点设置在tabcontrol上,如果选中radStudent,则在打开winform后将焦点设置在tabcontrol(其他页面)上。。。我想如果没有检查收音机,就不要打开winform

我相信这将确定重点

// Sets focus to first tab.
tabRegister.SelectedTab = tabRegister.TabPages[0];
// Sets focus to second tab.
tabRegister.SelectedTab = tabRegister.TabPages[1];

正如我在评论中所建议的,我知道在表单之间传递数据的最好方法之一是使用事件

基本上,在“子”窗体中,您声明了一个事件,该事件将由“主”窗体处理或收听

请参阅我评论中的参考答案,如果您有关于如何调整的具体问题,请立即询问


干杯

在您的示例中,我看到的第一个问题是您正在关闭父窗体,该窗体将关闭Form1并处理Form2,我要做的是隐藏Form1而不是关闭它,然后我将在Form2上创建一个公共属性,以传入所选的按钮。但是,任何时候打开和关闭多个表单都可能会变得混乱,我要做的就是为其他表单创建用户控件,并在面板中交换它们。第一个例子是如何按照您要求的方式进行

表格

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void btnLogin_Click(object sender, EventArgs e)
    {
        ShowForm2("login");
    }

    private void btnRegister_Click(object sender, EventArgs e)
    {
        ShowForm2("register");
    } 


    private void ShowForm2(string formtype)
    {
        Form2 f2 = new Form2(); // Instantiate a Form2 object.
        f2.CheckButtonClick = formtype;
        f2.Show(this); // Show Form2 and  
        this.Hide(); // closes the Form1 instance.  

    }
}
表格2

ublic partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    public string CheckButtonClick { get; set; }

    private void button1_Click(object sender, EventArgs e)
    {
        if (CheckButtonClick == "login")
        {
            Form3 f3 = new Form3(); // Instantiate a Form3 object.  
            f3.Show(); // Show Form3 and  
            this.Close(); // closes the Form2 instance.  
        }
        else if (CheckButtonClick == "register")
        {
            Form4 f4 = new Form4(); // Instantiate a Form4 object.  
            f4.Show(); // Show Form4 and  
            this.Close(); // closes the Form2 instance.  
        } 

    }
}
public partial class UserControl2 : UserControl
{
    public delegate void ControlFinishedHandler(object sender, EventArgs e);
    public event ControlFinishedHandler ControlFinshedEvent;
    public UserControl2()
    {
        InitializeComponent();
    }
    public string SetLogonType { get; set; }

    private void button1_Click(object sender, EventArgs e)
    {
        ControlFinshedEvent(sender, new EventArgs());
    }
}
表单3和表单4注意,由于这些表单早就忘记了表单1,所以我搜索它以重新打开

public partial class Form3 : Form
{
    public Form3()
    {
        InitializeComponent();
    }

    private void Form3_FormClosed(object sender, FormClosedEventArgs e)
    {
        FormCollection frms = Application.OpenForms;
        foreach (Form f in frms)
        {
            if (f.Name == "Form1")
            {
                f.Show();
                break;
            }
        }
    }
}
带有UserControls的第二个选项有一个窗体,上面有一个面板。它使用事件通知窗体更改控件以及UserControl2上的公共属性

public partial class Form1 : Form
{
    string logonType;
    public Form1()
    {
        InitializeComponent();
    }

    private void userControl1_LoginOrRegisterEvent(object sender, LoginOrRegisterArgs e)
    {
        logonType = e.Value;
        userControl2.BringToFront();
    }


    private void userControl2_ControlFinshedEvent(object sender, EventArgs e)
    {
        if (logonType == "logon")
            userControl3.BringToFront();
        else if (logonType == "register")
            userControl4.BringToFront();
    }

    private void userControl3_ControlFinshedEvent(object sender, EventArgs e)
    {
        userControl1.BringToFront();
    }

    private void userControl4_ControlFinshedEvent(object sender, EventArgs e)
    {
        userControl1.BringToFront();
    }
}
UserControl1

public partial class UserControl1 : UserControl
{
   public delegate void LoginOrRegisterHandler(object sender, LoginOrRegisterArgs e);
   public event LoginOrRegisterHandler LoginOrRegisterEvent;

    public UserControl1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        LoginOrRegisterArgs ea = new LoginOrRegisterArgs("logon");
        LoginOrRegisterEvent(sender, ea);
    }

    private void button2_Click(object sender, EventArgs e)
    {
        LoginOrRegisterArgs ea = new LoginOrRegisterArgs("register");
        LoginOrRegisterEvent(sender, ea);
    }
}

public class LoginOrRegisterArgs
{
    public LoginOrRegisterArgs(string s) {Value = s;}
    public string Value {get; private set;}
}
UserControl2

ublic partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    public string CheckButtonClick { get; set; }

    private void button1_Click(object sender, EventArgs e)
    {
        if (CheckButtonClick == "login")
        {
            Form3 f3 = new Form3(); // Instantiate a Form3 object.  
            f3.Show(); // Show Form3 and  
            this.Close(); // closes the Form2 instance.  
        }
        else if (CheckButtonClick == "register")
        {
            Form4 f4 = new Form4(); // Instantiate a Form4 object.  
            f4.Show(); // Show Form4 and  
            this.Close(); // closes the Form2 instance.  
        } 

    }
}
public partial class UserControl2 : UserControl
{
    public delegate void ControlFinishedHandler(object sender, EventArgs e);
    public event ControlFinishedHandler ControlFinshedEvent;
    public UserControl2()
    {
        InitializeComponent();
    }
    public string SetLogonType { get; set; }

    private void button1_Click(object sender, EventArgs e)
    {
        ControlFinshedEvent(sender, new EventArgs());
    }
}
UserControl3和UserControl4除了不同的类名外,完全相同

public partial class UserControl3 : UserControl
{
    public delegate void ControlFinishedHandler(object sender, EventArgs e);
    public event ControlFinishedHandler ControlFinshedEvent;
    public UserControl3()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        ControlFinshedEvent(sender, new EventArgs());
    }
}

请看这篇文章,了解在表单之间传递消息的方法:谢谢你,马克。我使用了你的第一个解决方案,效果非常好,祝你在感谢=D中享受蜂蜜之河和几十个处女