为什么FormShowed事件不会在C#中被激发?
我是C#新手,我使用的是windows窗体。 我有为什么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
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否,当窗体最小化时仍然可见,但最小化。