c# 在用户控件中使用计时器更改值时从 Form 获取变量值

c# Get variable value from Form when value changed with timer in usercontrol

我有一个带定时器的用户控件

 public partial class Cumle : UserControl
 {
     private bool cond=false;

     //Some Code....

     private void timer2_Tick(object sender, EventArgs e)
     {
         //Some Code....
         if(//some condition...)
             cond=true;
     }
 }

我正在研究 windows form.I 想要显示一个消息框,告诉我 cond 是 true.I 想要在不使用 Form 上的计时器的情况下制作这些东西。

public partial class Form1 : Form
{
      //What I must write here?
}

您需要向您的 UserControl 添加一个 public 事件,并从您的主窗体订阅它。

应该这样做:

public partial class Cumle : UserControl
{
   public event Action<bool> ConditionChanged = delegate {};

   private bool cond=false;

   //Some Code....

   private void timer2_Tick(object sender, EventArgs e)
   {
       //Some Code....
       if(//some condition...)
       {
           cond=true;
           ConditionChanged(cond);
       }
   }
}

然后在你的表单中:

public partial class Form1 : Form
{
    void SubscribeToConditionChanged()
    {
        myUserControl.ConditionChanged += ShowDlg;
    }

    void ShowDlg(bool condition)
    {
        MessageBox.Show("....");
    }
}

如前所述,您应该使用事件。我会这样:

public partial class Cumle : UserControl
{
    public event EventHandler ConditionChangedToTrue;

    protected virtual void OnConditionChangedToTrue(EventArgs e)
    {
        if (ConditionChangedToTrue != null)
            ConditionChangedToTrue(this, e != null ? e : EventArgs.Empty);
    }

    private void timer2_Tick(object sender, EventArgs e)
    {
        //Some Code....
        if (true) // add your condition
        {
            cond = true;
            OnConditionChangedToTrue(null);
        }
    }
}

public partial class Form1 : Form
{
    private Cumle cumle = new Cumle();

    public Form1()
    {
       InitializeComponent();
       cumle.ConditionChangedToTrue+= Cumle_ConditionChangedToTrue;
    }

    private void Cumle_ConditionChangedToTrue(object sender, EventArgs e)
    {
        // add your event handling code here
        throw new NotImplementedException();
    }
}