簡體   English   中英

為什么FormShown事件不會在C#中被觸發?

[英]Why FormShown event does not get fired in C#?

我是C#的新手,我正在使用Windows窗體。 我有Form1Form2 form1我使用以下代碼來顯示form2

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

我想要的是:每次顯示Form2時我想做一些活動。 我將messageBox放在Form2Shown事件中(用於測試),但它只被觸發一次,下次我顯示Form2它永遠不會被觸發。 我也嘗試使用formLoad但它只被觸發一次,下次我顯示form2它永遠不會被解雇。 我知道我可以使用frm2.ShowDialog()每次觸發顯示的事件但我不想出於某些原因。

private void Form2_Shown(object sender, EventArgs e)
{
    MessageBox.Show("Form2 is shown"); // this gets fired only once when form2 is shown.
                                       // when I show form2 again it does not get fired.
}

private void button_Hide_Form2_Click(object sender, EventArgs e)
{

    // this is in form2
    Hide();
}

我的問題是:每次顯示form2任何人都知道如何觸發事件? 我很高興獲得一些新想法來解決這個問題。 謝謝

來自MSDN

Shown事件僅在第一次顯示表單時引發; 隨后最小化,最大化,恢復,隱藏,顯示或無效和重新繪制將不會引發此事件。

MSDN上,您可以看到引發了哪些事件。 並選擇一個符合您要求的。

一些例子。

Form1 - 兩個按鈕,顯示和隱藏

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

    Form2 frm = new Form2();

    private void btnShow_Click(object sender, EventArgs e)
    {
        frm.Show();
    }

    private void btnHide_Click(object sender, EventArgs e)
    {
        frm.Hide();
    }
}

Form2 - 顯示時顯示msgbox。 我改變形式關閉行為隱藏形式不破壞。

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

    private void Form2_VisibleChanged(object sender, EventArgs e)
    {
        if(this.Visible == true)
            MessageBox.Show("Hey");
    }

    private void Form2_FormClosing(object sender, FormClosingEventArgs e)
    {
        e.Cancel = true;
        this.Hide();           
    }
}

我已經插入一些評論來了解最新情況:

// You can use auto-property in here.
private Form2 frm2 { get; set; }

private void button1_Click(object sender, EventArgs e)
{
    // Create a new instance before it is shown.
    NewForm();
    frm2.Show();
}

// Creates a new instance and hooks the event.
private void NewForm()
{
    frm2 = new Form2();
    // When creating an instance, hook the load event.
    frm2.Load += Form2_Load;
}

// Will be triggered when show is called.
private void Form2_Load(object sender, EventArgs e)
{
    // Do stuff
}

如果你只需要Form2類中的Form2_Shown ,你應該重寫OnActivated()而不是使用EventHandler:

protected override void OnActivated(EventArgs e)
{
    MessageBox.Show("Form2 is shown");
}

OnActivated方法還允許派生類在不附加委托的情況下處理事件。 重寫此方法是在派生類中處理事件的首選技術。

https://msdn.microsoft.com/en-us/library/system.windows.forms.form.onload(v=vs.110).aspx

我找到了答案。 我們使用Form2_VisibleChanged事件:

 private void Form2_VisibleChanged(object sender, EventArgs e)
    {
        if(this.Visible==true)
        {

            MessageBox.Show("Form is visible");
        }
        else
        {
            MessageBox.Show("Form is hiding");

        }


    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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