DOBON.NETプログラミング道掲示板

No34019 の記事


■34019 / )  Re[2]: フォームコントロールへのDataBindingsでプロパティが相互反映されない
□投稿者/ 魔界の仮面弁士 大御所(1160回)-(2018/11/05(Mon) 17:10:50)
  • アイコンNo34017に追記(魔界の仮面弁士の記事)
    > .DataBindings.Add() したインスタンス (As Binding)を保持しておき、
    > ValueChanged 後に Binding クラスの ReadValue メソッドを呼び直せば、
    > Me.customer_code.Text に桁補完結果が反映されるようです。

    別案。
    BindingComplete イベントを使ってみました。



    Private Sub DataBindingsToControls(con As Control, src As Object, srcProperty As String)
      Dim prop As String = ""
      Select Case True
        Case TypeOf con Is TextBoxBase

          ' 双方向にするため、BindingComplete イベント内で ReadValue メソッドを呼び出す
          AddHandler con.DataBindings.Add("Text", src, srcProperty, True, DataSourceUpdateMode.OnValidation).BindingComplete, _
            Sub(sender As Object, e As BindingCompleteEventArgs)
              e.Binding.ReadValue()
            End Sub

        Case TypeOf con Is Label
          con.DataBindings.Add("Text", src, srcProperty, True, DataSourceUpdateMode.OnValidation)
        Case TypeOf con Is ComboBox
          DataBindings.Add("SelectedValue", src, srcProperty, True, DataSourceUpdateMode.OnPropertyChanged)
        Case TypeOf con Is CheckBox, TypeOf con Is RadioButton
          DataBindings.Add("Checked", src, srcProperty, True, DataSourceUpdateMode.Never)
        Case TypeOf con Is DateTimePicker
          DataBindings.Add("Value", src, srcProperty, True, DataSourceUpdateMode.OnValidation)
      End Select
    End Sub

    #Region "Common.FindControl の仕様が分からないけど、こんな感じだろうか"
    Private Function FindControl(container As Control, name As String) As Control
      Return FindControls(container).FirstOrDefault(Function(c) c.Name = name)
    End Function
    Private Function FindControls(container As Control) As IEnumerable(Of Control)
      Dim controls = container.Controls.Cast(Of Control)()
      Dim children = controls.Select(AddressOf FindControls)
      Return controls.Concat(children.SelectMany(Function(c) c))
    End Function
    #End Region



    上記では、無条件で BindingComplete イベントにアタッチしていますが、
    汎用的にするならば、双方向バインドと片方向バインドを切り替えられるように
    Customers の customer_code プロパティにカスタム属性を付与しておくとか、
    あるいは、ReadValue を抑制するための コールバックイベントを用意するなど
    しておくという手もあるかも。
違反を報告
返信 削除キー/


Mode/  Pass/


- Child Tree -