【问题标题】:[control].ValueChanged event called during form creation vb.net[control].ValueChanged 事件在表单创建过程中调用 vb.net
【发布时间】:2012-07-02 12:07:44
【问题描述】:

我遇到了一个非常令人沮丧的问题,我真的希望有人可以帮助我。我制作了一个通过 TCP/IP 命令控制另一个应用程序的应用程序。 (我对应用程序的功能没有任何问题。)我的程序需要做的一件事是在其他应用程序中更改不同字段的值后立即更新它们。为此,我使用了

Sub ControlName_ValueChanged(sender As Object, e As System.EventArgs) Handles _
    ControlName.ValueChanged 

sendData(dataToSend,destination)

End Sub

格式。该子例程涉及 TCP/IP 事务,直到用户在我的应用程序上手动启动它之后才会启动。我遇到的问题是,当我的启动表单加载时,它会立即调用所有*.ValueChanged 子例程,从而有效地锁定我的应用程序。有人可以解释为什么会发生这种情况以及如何阻止它吗?

【问题讨论】:

    标签: vb.net winforms events tcp


    【解决方案1】:

    如果您想停止 UI 阻塞,您可以使 sendData 实现使用异步调用(通常实现为类型上的 BeginSend / EndSend 方法对。

    我不确定事件处理程序为什么会临时执行此操作(可能是因为在创建对象后,在注册事件处理程序后该值被设置为某个默认值)。

    阻止它的一种方法是在您加载表单之后手动连接ValueChanged 事件处理程序,而不是通过designer.cs 文件在设计器中执行此操作。

    或者,有一个 suppressEvents bool 标志,您可以打开和关闭它,并修改您的方法来监听标志:

    我不知道这是否是有效的 VB,我使用 C#,但你明白了。

    Sub ControlName_ValueChanged(sender As Object, e As System.EventArgs) Handles _
        ControlName.ValueChanged 
    
    If suppressEvents Is True Then Return
    
    sendData(dataToSend,destination)
    
    End Sub
    

    【讨论】:

    • 我应该在哪里定义suppressEvents 标志?在类的开头还是在应用程序事件文件本身中?
    • @Matt 该标志将在包含表单中定义并默认为true,然后在加载表单时将其设置为false。事件仍然触发,但处理程序被编码为监听标志。
    • 我认为事件触发的原因是当控件被实例化时,它没有任何价值,但我猜你正在设置一些默认值(我遇到过前)。 @Adam 的 suppressEvents 应该可以工作,就像说“如果值不是什么都不是,那么 sendData”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    相关资源
    最近更新 更多