Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么FormShowed事件不会在C#中被激发?_C#_Winforms - Fatal编程技术网

为什么FormShowed事件不会在C#中被激发?

为什么FormShowed事件不会在C#中被激发?,c#,winforms,C#,Winforms,我是C#新手,我使用的是windows窗体。 我有Form1和Form2。在form1中,我使用以下代码显示form2: Form2 frm2 = new Form2(); private void button1_Click(object sender, EventArgs e) { frm2.Show(); } 我想要的是:每次显示Form2时,我想做一些活动。我将messageBox放在Form2Shown事件中(用于测试),但它只会被触发一次,下次我显示Fo

我是C#新手,我使用的是windows窗体。 我有
Form1
Form2
。在
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
时触发事件吗?我很高兴获得一些新的想法来解决这个问题。谢谢

来自

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

在上,您可以看到引发了哪些事件。然后选择一个符合你要求的

举个例子

表单1-两个按钮,显示和隐藏

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-显示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\u,则应重写而不是使用EventHandler:

protected override void OnActivated(EventArgs e)
{
    MessageBox.Show("Form2 is shown");
}
OnActivated方法还允许派生类在不附加委托的情况下处理事件。重写此方法是在派生类中处理事件的首选技术


我找到了答案。我们使用Form2\u VisibleChanged事件:

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

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

        }


    }

你能再给我看一些代码吗?你是否在点击按钮1时隐藏了表单2。是的,在我使用完form2后,我正在隐藏它。请查看更新的代码是否确定
Form2\u Load
?为什么总是创建新表单?@UweKeim Msdn说:
(加载事件)在表单第一次显示之前发生。
是的,触发器是正确的。@BWA如果他想有多个实例或只有一个实例,他没有清除。@C4u但她使用
//这是在form2 Hide()中所以,她想隐藏表格。如果她总是使用新的表单,显示的效果会很好。仍然不能与您的代码一起工作,它只会触发一次,下次我显示表单2时它不会被触发。抱歉,我混淆了事件。我把我的答案更新为激活的。最小化也等于隐藏,不是吗?因此,触发该操作的次数比您在whished目标中指定的次数要多。@C4u否,hide是hide,minimize是minimize.No。隐藏就是隐藏。对不起,最小化时,如果可见,则说明为假@C4u否,当窗体最小化时仍然可见,但最小化。