簡體   English   中英

從另一個表單訪問按鈕

[英]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 等類型使用大寫名稱。

表格1.cs

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

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

表格2.cs

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM