2009-09-05 5 views
1

월요일부터 일요일까지 요일을 포함하는 드롭 다운 목록이 있습니다. 숫자의 요일을 이름으로 매핑하는 사용자 정의 유형의 두 값으로 채워집니다.사용자 정의 유형의 드롭 다운 목록에 데이터 바인딩하는 방법은 무엇입니까?

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

난에 바인딩 할 개체는 정수 속성 된 요일이 있고, 나는 개체의 된 요일 속성 드롭 다운에서 선택한 항목의 ID 값을 바인딩 할. 예. 사용자는 목요일을 선택하고 4라는 ID가 객체에 전달됩니다.

코드에서 SelectedItem의 UDT를 검색 할 수 있지만 바인딩 할 콤보 상자의 속성을 찾을 수 없습니다.

  1. UDT를 드롭 다운의 Items 컬렉션에 직접 추가하면 SelectedValue는 Nothing입니다.
  2. UDT를 List (Of UDT) 컬렉션에 추가하고 드롭 다운의 데이터 소스로 설정하고 ValueMember를 ID로 설정하고 DisplayMember를 Text로 설정하면 SelectedValue는 전체 UDT를 반환합니다. ValueMember 속성

데이터 바인딩은 일반 텍스트 상자의 경우 실제로 잘 작동하는 것처럼 보일 수 있지만 더 복잡한 컨트롤을 처리 할 때는 더 이상 당황 할 수 있습니다.

업데이트 : 내가 찾고있는 것은 바인딩 문입니다. 예. 어느 쪽도 아니 ...

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

... 작품. 첫 번째 항목은 무시되고 (SelectedItem 속성이 Nothing이기 때문에) 무시되고 두 번째 항목은 "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") 

... 그리고 확인을 작동하는 것 같군.

+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

흠. 나는 Property가 Public Field와는 다르게 작동하는 이유를 알지 못했지만 어쨌든 이것을 시도했다. 작동하지 않으면 UDT에서 Class로 변경하려고 시도했지만 작동하지도 않았습니다. Text 속성 (콤보와 UDT 모두에 존재하는)에 바인딩되어 있기 때문에 예제가 효과가 있다고 생각합니다. ID 값으로 바인딩 할 수 있어야하지만 DataBindings.Add 작업은 COMBO에서 ID 속성을 찾을 수 없으며 오류가 발생합니다. – Bill

+0

아니요, ComboBox 속성과 아무 관련이 없습니다. ValueMember 및 DisplayMember를 데이터 항목의 공용 속성으로 설정할 수 있습니다. –

관련 문제