[英]Accessing button from another form
我有 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 內部而不是 from1。 但我不確定我可以通過哪些其他方式訪問此文本框,因為我已經在設計器中公開了它。 有沒有另一種方法可以做到這一點?
如果您希望一個表單替換另一個表單,那么您可以在Form2
的.Show()
中傳遞對Form1
的引用,並且表單將其存儲在.Owner
屬性中。 當第二個表單啟動時,它將隱藏第一個表單。 此外,當第二個表單關閉時,它可以取消隱藏第一個表單。
對於像mainForm = new Form()
這樣的變量,請對Form
和 pascalCase 等類型使用大寫名稱。
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
。 在Form2
中添加一個返回檢查的屬性:
並從From1
訪問它
private void button1_Click(object sender, EventArgs e)
{
var f2 = new Form2();
f2.Show(this);
if (f2.IsNameBlank)
{
// textBox is empty.
}
}
問問自己:您要從 form2 讀取的信息位於文本框中對 form1 來說重要嗎? form1 真的會在意相同的信息是否會被 form2 保存在 ComboBox 中嗎?
如果 form1 不知道 form2 是如何獲取信息的,那豈不是最好? 它只需要知道 form2 願意提供信息。 如果 form2 需要從數據庫中讀取它,或者從互聯網上獲取它來獲取信息,那么 form1 為什么會在意? 所有form1都想知道:“嘿Form2,給我信息X”
唉,您沒有告訴我們您是否只需要一次此信息,或者每當信息 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;
如果 Form1 想要在信息 X 發生變化時得到通知:
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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.