1

月曜日から日曜日までの曜日を含むドロップダウンリストがあります。数値の曜日をその名前にマップする2つの値のユーザー定義タイプが入力されます。

Public Structure WeekDays
   Public ID As Integer
   Public Text As String
   Public Overrides Function ToString() As String
       Return Me.Text
   End Function
End Structure

バインドするオブジェクトには整数プロパティDayOfWeekがあり、ドロップダウンで選択したアイテムのID値をオブジェクトのDayOfWeekプロパティにバインドします。例えば。ユーザーが木曜日を選択すると、ID4がオブジェクトに渡されます。

コードでは、SelectedItemのUDTを取得できますが、コンボボックスのどのプロパティにバインドするかがわかりません。

  1. ドロップダウンのItemsコレクションにUDTを直接追加すると、SelectedValueはNothingになります。
  2. UDTをList(Of UDT)コレクションに追加し、それをドロップダウンのデータソースとして設定し、ValueMemberをIDに設定し、DisplayMemberをTextに設定すると、SelectedValueは、ValueMemberプロパティで指示されたIDではなく、UDT全体を返します。

データバインディングはプレーンテキストボックスでは非常にうまく機能するようですが、より複雑なコントロールを処理する場合は、はるかに厄介になるようです。

更新:私が探しているのはBindingステートメントです。例えば。ない...

oB = New Binding("SelectedItem", Payroll, "DayOfWeek")
oB = New Binding("SelectedItem.ID", Payroll, "DayOfWeek")

...動作します。1つ目は無視され(おそらくSelectedItemプロパティがNothingであるため)、2つ目は「バインドできません...」エラーで失敗します。

4

2 に答える 2

1

プロパティを作成し、

Public Structure WeekDays
    Private _ID As Integer
    Private _Text As String
    Public Sub New(ByVal ID As Integer, ByVal Text As String)
        Me._ID = ID
        Me._Text = Text
    End Sub
    Public Overrides Function ToString() As String
        Return Me._Text
    End Function

    Public Property ID() As Integer
        Get
            Return _ID
        End Get
        Set(ByVal value As Integer)
            _ID = value
        End Set
    End Property
    Public Property Text() As String
        Get
            Return _Text
        End Get
        Set(ByVal value As String)
            _Text = value
        End Set
    End Property
End Structure


Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim items As New List(Of WeekDays)

        items.Add(New WeekDays(1, "A"))
        items.Add(New WeekDays(2, "B"))

        Dim lb As New ListBox
        lb.DataSource = items
        lb.ValueMember = "ID"
        lb.DisplayMember = "Text"
        AddHandler lb.SelectedIndexChanged, AddressOf Item_Sel

        Me.Controls.Add(lb)

        TextBox1.DataBindings.Add(New Binding("Text", items, "Text"))

        Dim cb As New ComboBox
        cb.DataSource = items
        cb.DisplayMember = "Text"
        cb.ValueMember = "ID"
        cb.DataBindings.Add("SelectedValue", items, "ID")
        cb.Location = New Point(100, 100)
        Me.Controls.Add(cb)
        TextBox1.DataBindings.Add(New Binding("Text", items, "ID"))           
    End Sub

    Public Sub Item_Sel(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim obj As Object = CType(sender, ListBox).SelectedValue
        MsgBox(obj)
    End Sub
End Class
于 2009-09-05T15:30:00.717 に答える
1

OK、それで私は可能な解決策を見つけました。

標準のWinForms.ComboBoxを継承する独自のComboBoxコントロールを作成し、SelectedIDと呼ばれる追加のIntegerプロパティを追加しました。

Public Structure NumericUDT
   Public ID As Integer
   Public Text As String

   Public Sub New(ByVal iID As Integer, ByVal sText As String)
       Me.ID = iID
       Me.Text = sText
   End Sub
   Public Overrides Function ToString() As String
       Return Me.Text
   End Function
End Structure

Public Property SelectedID() As Integer
    Get
        Dim uItem As NumericUDT
        Dim iID As Integer

        If (MyBase.SelectedItem Is Nothing) Then
            iID = 0
        Else
            uItem = DirectCast(MyBase.SelectedItem, NumericUDT)
            iID = uItem.ID
        End If

        Return iID

    End Get
    Set(ByVal value As Integer)

        Dim uItem As NumericUDT
        Dim uFound As NumericUDT = Nothing

        For Each uItem In MyBase.Items
            If uItem.ID = value Then
                uFound = uItem
                Exit For
            End If
        Next

        MyBase.SelectedItem = uFound

    End Set
End Property

これにより、SelectedIDプロパティにバインドできます...

   oB = New Binding("SelectedID", Payroll, "PayDay")

...そして問題なく動作しているようです。

于 2009-09-05T22:59:00.127 に答える