2009-09-05 9 views
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 

Iがバインドするオブジェクトは、整数プロパティのDayOfWeekを有し、そしてIは、物体上のDayOfWeekプロパティにドロップダウンリストで選択された項目のID値をバインドします。例えば。ユーザーは木曜日を選択し、4というIDがオブジェクトに渡されます。

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

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

データバインディングはプレーンテキストボックスではうまくいくように見えますが、より複雑なコントロールを扱う場合には、もっと難解なようです。

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

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

...作品はありません。最初のものは無視されます(SelectedItemプロパティがNothingなので)、Secondは "Can not bind ..."エラーで失敗します。

答えて

1

OKを作成しますので、私は可能な解決策を見つけました。

標準のWinForms.ComboBoxを継承し、SelectedIDという余分なIntegerプロパティを追加した独自のComboBoxコントロールを作成しました。

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") 

...とは、[OK]を動作しているようです。

+0

もっと良い解決策が出てくるかどうかを確認するには数日待つでしょう。 – Bill

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 
+0

Hmmm。私はなぜ財産がパブリックフィールドとは違うのか分かりませんでしたが、とにかくこれを試しました。それがうまくいかなかった後、私はUDTからクラスに変更しようとしましたが、どちらもうまくいきませんでした。 Textプロパティ(コンボとUDTの両方に存在する)にバインドしているため、あなたのサンプルが機能すると思います。 ID値にバインドできるようにする必要がありますが、DataBindings.Add操作でCOMBOのIDプロパティが見つからず、エラーが発生します。 – Bill

+0

いいえ、ComboBoxプロパティとは関係ありません。 ValueMemberとDisplayMemberをデータ項目のpublicプロパティに設定することができます –

関連する問題