我有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内部。但是我不确定可以通过什么其他方式访问此文本框,因为我已经在设计器中将其公开。还有另一种方法吗?
答案 0 :(得分:0)
如果您希望一种形式替换另一种形式,则在Form1
的{{1}}中传递对.Show()
的引用,并将该表单存储在Form2
属性中。当第二个表单开始时,它将隐藏第一个表单。另外,当第二个表单关闭时,可以取消隐藏第一个表单。
请为.Owner
之类的类型使用大写名称,为Form
之类的变量使用pascalCase。
mainForm = new Form()
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);
}