为什么在C#中FormShown事件没有被触发?

4

我是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时触发事件吗?我很乐意得到一些新的想法来解决这个问题。谢谢。


2
你可以展示更多的代码吗?你是否在button1点击之间隐藏了Form2 - Franz Wimmer
@Franz Wimmer。是的,我在使用完form2后将其隐藏起来。请查看更新的代码。 - Kate
4个回答

10

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

表单2 - 在显示时显示消息框。我将表单关闭行为更改为隐藏表单而不是销毁表单。


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

我已经插入了一些注释来理解正在发生的事情:

// 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_Load 是正确的吗? - Uwe Keim
为什么总是要创建新的表单? - BWA
@UweKeim Msdn说:(Load事件)在窗体第一次显示之前发生。所以,是的,触发器是正确的。 - C4d
@BWA 他还没有明确是否想要多个实例还是只需要一个。 - C4d
@C4u 但是她使用了// this is in form2 Hide();所以,她想隐藏表单。如果她总是使用新的表单展示就可以完美地运行。 - BWA
@BWA 这个问题已经被编辑过了。在第一个版本中,它是关于关闭和重新打开的。代码不可见。 - C4d

1

仍然无法与您的代码配合使用,它只触发一次,下一次我展示form2时它就不会被激发。 - Kate
抱歉,我混淆了事件。我已将我的答案更新为 OnActivated - Franz Wimmer

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");

        }


    }

最小化也等同于隐藏,不是吗?因此,这比您在目标中指定的次数更频繁地触发。 - C4d
@C4u 不,隐藏就是隐藏,最小化就是最小化。 - BWA
NO. 隐藏就是隐藏。 - Kate
抱歉,我是说如果在最小化时visible为假? - C4d
1
@C4u 不,当窗体最小化时仍然可见但是被缩小了。 - BWA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接