为什么FormShown事件不会在C#中被触发?

时间:2016-08-26 10:36:55

标签: c# winforms

我是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时,是否有人知道如何触发事件?我很高兴获得一些新想法来解决这个问题。谢谢

4 个答案:

答案 0 :(得分:10)

来自MSDN

  

仅在第一次显示表单时引发显示事件;   随后最小化,最大化,恢复,隐藏,显示或   无效和重新绘制不会引发此事件。

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();           
    }
}

答案 1 :(得分:1)

我已经插入一些评论来了解最新情况:

// 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
}

答案 2 :(得分:1)

如果您的Form2_Shown课程中只需要Form2,则应覆盖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

答案 3 :(得分:1)

我找到了答案。我们使用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");

        }


    }