你好我正在关注这篇帖子Control timer in form 1 from form 2, C#,回复,问题是我还不能解决它,我在form1上有一个计时器,我需要从form2中停止它尝试我在此发现的所有内容发布但仍然没有。
Form1中
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Form2 form2 = new Form2();
form2.Show();
timer1.Enabled = true;
}
private void timer1_Tick(object sender, EventArgs e)
{
richTextBox1.AppendText("test\n");
}
}
窗体2
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
//
}
private void button1_Click(object sender, EventArgs e)
{
Form1 form1 = new Form1();
form1.Hide();
form1.timer1.Enabled = false;
}
}
任何人都可以帮助我吗?
更新:
static class Program
{
/// <summary>
/// Punto de entrada principal para la aplicación.
/// </summary>
[STAThread]
public static Form1 MainForm;
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
答案 0 :(得分:3)
问题是您正在创建Form1
的新实例,因此这是一个不同的计时器,而不是您正在查看的表单实例。您需要存储对显示的Form1
的引用(可能在您的Program.Main
中)。
所以你的Program.Main
可能是这样的:
static class Program
{
public static int Main()
{
Form1 form = new Form1();
Application.Run(form);
}
}
您想要存储该引用,因此请将其修改为:
static class Program
{
public static Form1 MainForm;
[STAThread]
public static int Main()
{
MainForm = new Form1(); // THIS IS IMPORTANT
Application.Run(MainForm);
}
}
然后您可以在Form2
:
private void button1_Click(object sender, EventArgs e)
{
Program.MainForm.Hide();
Program.MainForm.timer1.Enabled = false;
}
这是一个功能性解决方案 - 我个人认为这不是一个最佳解决方案。我会考虑使用类似于Event Aggregator/Broker的内容,但如果这是一个非常简单的程序,而不需要复杂性,那么这就行了。
确保您需要访问的计时器修改为public
,因为默认修饰符为private
。
使用IDE提供的“属性”面板或使用设计器代码。
public System.Windows.Forms.Timer timer2;