代码之家  ›  专栏  ›  技术社区  ›  cg7

等效于日期时间选择器上的SelectionChangeCommitted?

  •  2
  • cg7  · 技术社区  · 7 年前

    我有一些函数只有在加载表单后才需要激活。
    我在组合框中遇到了这个问题,并使用 SelectionChangeCommitted SelectedValueChanged 因为只有当用户进行更改时才会触发第一个。

    DateTimepicker.ValueChanged (因为这个像 Select.SelectedValueChanged 在一切准备就绪之前被解雇了吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Jimi    7 年前

    这是一种相当普遍的情况。
    在窗体的第一次初始化之后,当修改控件的值时,将引发关联的事件,以将更改通知给订阅服务器。
    组合框 SelectionChangeCommitted

    这个 DateTimepicker 控件与大多数其他标准控件一样,不提供类似的事件。

    问题 避免在窗体上控件的值被初始化它们的代码修改时执行这些例程。

    有不同的方法来管理可能在错误的时间导致不必要的级联效应的事件的引发。其中两种更为常见:

    • 仅在控件的初始化完成后,使用指定的附加/分离处理程序的专用方法附加事件处理程序
    • 使用布尔字段作为标志,指示在引发事件时是否应运行与事件处理程序关联的代码。
    • 二者都

    Public Sub New()
        InitializeComponent()
    
        InitializeDataStuff()
        InitializeEverythingElse()
    
        AttachHandlers()
    End Sub
    
    Private Sub Form_FormClosed(sender As Object, e As FormClosedEventArgs) Handles MyBase.FormClosed
        RemoveHandlers()
    End Sub
    
    Protected Sub AttachHandlers()
        Addhandler SomeControl.SomeEvent, AddressOf SomeHandlerMethod
        Addhandler SomeOtherControl.SomeOtherEvent, AddressOf SomeOtherHandlerMethod
        (...)
    End Sub
    
    Protected Sub RemoveHandlers()
        Removehandler SomeControl.SomeEvent, AddressOf SomeHandlerMethod
        Removehandler SomeOtherControl.SomeOtherEvent, AddressOf SomeOtherHandlerMethod
        (...)
    End Sub
    

    使用布尔字段。使用窗体的设计器附加事件处理程序:

    private DontBotherToRunNow As Boolean = True
    
    Public Sub New()
        InitializeComponent()
    
        InitializeDataStuff()
        InitializeEverythingElse()
    
        DontBotherToRunNow = False
    End Sub
    
    Private Sub DateTimePicker_ValueChanged(sender As Object, e As EventArgs) Handles DateTimePicker1.ValueChanged
        If DontBotherToRunNow Then Return
        (...)
        'Do something
    End Sub