【问题标题】:What's the difference between actually click a button and the InvokeOnClick() method?实际单击按钮和 InvokeOnClick() 方法有什么区别?
【发布时间】:2015-11-14 20:38:00
【问题描述】:

我想使用以下语句在适当的位置更改小部件的背景色:

IpAddressTextEdit.BackColor = Color.LimeGreen;

在尝试了许多方法之后,当我将它放入 button_click 事件方法并实际单击按钮时,它终于起作用了。如下所示:

public void button3_Click(object sender, EventArgs e)
{
    IpAddressTextEdit.BackColor = Color.LimeGreen;
    Console.WriteLine("Button 3 is clicked ! ");
} 

但是,我从不想通过单击来执行此操作,并且当我在其他地方使用 InvokeOnClick() 调用此单击时它不起作用。连我的调试器都显示这个语句已经执行了,并且赋值成功了,“按钮3被点击了!”也打印出来了,一切都和实际点击一样。唯一的区别是我的小部件没有改变它的颜色。

我可以猜到背后有一些机制,调试器不会显示给我。这个任务只是停留在后台,从不影响前端的 UI。那么 InvokeOnClick 和实际点击的真正区别是什么。我应该怎么做才能让它发挥作用。

InvokeOnClick() 的代码:

           if (TcpSocket.Connected)
           {
               MainForm mf = new MainForm();                    
               SettingsControl sc = new SettingsControl();                    
               sc.IpAddressTextEdit.BackColor = Color.LimeGreen; // assign directly
               mf.InvokeOnClick(sc.button3, EventArgs.Empty);     // Invoke a btn click
                    sc.OnSocketConnectedEventHandler(EventArgs.Empty); // raise a event create by my own                   

               if(!SocketRecvThread.IsAlive)
                       SocketRecvThread.Start();      //Begin receive;                    
               mf.SetupLeakDetector();  //Send command to setup machine

           }  

可以看出,我尝试了一些方法,包括直接分配颜色、调用我自己创建的事件、调用 btnclick 事件。它们都不起作用。

【问题讨论】:

  • 向我们展示调用InvokeOnClick 方法的代码。
  • 您好,您是否需要“假装”单击按钮而不是简单地调用方法?
  • 谢谢! @PatrickHofman,代码已添加,
  • @LucMorin,您好,是的,正如我刚刚添加的代码,只是调用一个方法不起作用,所以我正在尝试其他方法使其起作用。
  • 您创建了新的 mf 表单,但我没有看到您向用户展示它的地方。

标签: c# .net winforms click


【解决方案1】:

正如您描述的行为,我能看到的唯一区别是 计时。那么在显示表单之前或之后设置背景色有什么区别呢?好吧,您需要检查一些事件,例如 Form_LoadForm_ShownForm_Activate。如果您的文本框的背景颜色在任何这些事件中设置(或在这些事件中调用的方法中),它将覆盖您在表单上调用 .Show() / .ShowDialog() 之前设置的内容

Complete list of events when a form is shown

【讨论】:

  • 谢谢。但我不认为这是关于覆盖。我发现了另一个不同之处,那就是,当实际单击(并通过断点停止运行时)时,EventArgs e 的值是 {X=40,Y=22 Button = left},这与我的物理单击有关,但它为空当调用onclick() 时。到目前为止,也许我可以通过完全模仿鼠标点击来获得它,或者更好地理解.net winform并以更适当的方式进行操作。也许你可以看到我是一个初学者,但仍然想找到一种直接的方法来解决我面前的问题。
  • 我认为问题不再是点击和“假调用”的区别。相反,问题在于我调用该方法的位置包含背景颜色分配语句。正如我的尝试,当我在 SettingsControl 类中调用它时它运行良好,其中包含 UI 事件调用的所有方法。但是所有关于数据接收、发送、套接字连接的代码都在 MainForm 类中。但我只想在连接成功时将编辑框变为绿色。
猜你喜欢
  • 2012-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 2015-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多