从其他表单访问按钮

时间:2020-09-30 19:01:30

标签: c# winforms

我有2种形式,每种形式都有按钮,文本框和标签。在form1中,我在按钮事件处理程序中有以下代码:

 frmTwo form = new frmTwo ();
 form.Show();
 this.Visible = false; //closing form 1 when frmTwo opens

我转到了frmTwo的设计器文件,并将所有控件:标签,文本框,按钮从私有(自动生成)更改为公共。

在以下代码行:this.Visible = false;下,我想放置一个if语句来检查frmTwo中的名称文本框是否为空。但是当我写txtName.Text时,它说文本框在当前上下文中不存在。我了解为什么它不存在,因为它在frmTwo NOT from1内部。但是我不确定可以通过什么其他方式访问此文本框,因为我已经在设计器中将其公开。还有另一种方法吗?

2 个答案:

答案 0 :(得分:0)

如果您希望一种形式替换另一种形式,则在Form1的{​​{1}}中传递对.Show()的引用,并将该表单存储在Form2属性中。当第二个表单开始时,它将隐藏第一个表单。另外,当第二个表单关闭时,可以取消隐藏第一个表单。

请为.Owner之类的类型使用大写名称,为Form之类的变量使用pascalCase。

Form1.cs

mainForm = new Form()

Form2.cs

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

    private void button1_Click(object sender, EventArgs e)
    {
        var f2 = new Form2();
        f2.Show(this);
    }
}

这是基本框架。我还添加了一些逻辑,其中public partial class Form2 : Form { public Form2() { InitializeComponent(); } protected override void OnLoad(EventArgs e) { base.OnLoad(e); this.FormClosing += Form2_FormClosing; this.Owner.Visible = false; } private void Form2_FormClosing(object sender, FormClosingEventArgs e) { Owner.Visible = true; } public bool IsNameBlank { get => string.IsNullOrWhiteSpace(textBox1.Text); } } Form1中检查文本框。在Form2中添加一个属性以返回支票:

并通过Form2

对其进行访问
From1

答案 1 :(得分:0)

问问自己:要从form2读取的信息在文本框中对form1重要吗? form1真的会在乎是否由form2在ComboBox中保留相同的信息吗?

如果form1不知道form2如何获取信息,那不是最好的吗?它所需要知道的就是form2愿意提供信息。如果form2需要从数据库中读取它,或者从Internet上获取它以获取信息,那么form1为什么会在意呢?所有form1都想知道:“嘿Form2,给我X信息”

A,您没有告诉我们是否只需要一次此信息,或者每当信息X更改时就需要通知form1。假设您这样做。

因此,类Form2将具有提供信息X的方法,并且愿意告诉所有人信息X已更改。 Form2不会向外界展示它如何获取其信息。当前版本在TextBox1的文本中包含信息X。将来的版本可能会从ComboBox读取它,或者从文件或从Internet读取。

class Form2 : System.Windows.Window
{
    public event EventHandler XChanged;

    public string X
    {
        // information X is in textBox1
        get => this.textBox1.Text;
    }

    private void TextBox1_Changed(object sender, ...)
    {
        // the text in textBox1 changed, so information X changed
        this.OnXChanged();
    }

    protected virtual void OnXChanged()
    {
        this.XChanged?.Invoke(new Eventhandler(this, EventArgs.Empty));
    }

    ... // other Form2 methods
}

现在,如果Form1想知道X的值,它可以简单地要求它:

Form2 form2 = ...
string informationX = form2.X;

如果只要信息X发生变化,Form1希望随时通知:

form2.XChanged += InformationXChanged;

private void InformationXChanged(object sender, Eventargs e)
{
    Form2 form2 = (Form2)sender;

    // get the new information X from form2:
    string informationX = form2.X;
    this.ProcessInformationX(informationX);
}