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