vb.net, combobox.datasource изменит выбранный индекс? - PullRequest
1 голос
/ 01 марта 2012

Позвольте мне попытаться описать мои проблемы самым простым способом: у меня есть combobox1 и combobox2.Я надеюсь достичь двух вещей:

  1. Combox1 привязан к list1 (список строк).Когда пользователь выбирает элемент в списке list1, list2 (список строк) будет получен из базы данных, а выпадающий список привязывается к списку 2.

  2. Если пользователь указывает текст1 в поле со списком1 и текст2 в поле со списком2, тогда эти два значения будут показаны в выпадающих списках независимо от связанных списков.

Поэтому я установил DropDown как dropdpwnstyle для обоих выпадающих списков.

Public Sub New(Optional ByVal text1 As String = "", Optional ByVal text2 As String = "")
        ' This call is required by the designer.
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call.
      Me.combobox1.selectedText=text1   
      Me.combobox2.selectedText=text2
End Sub


Private Sub Form_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    BindComboBox1()
End Sub

Private Sub BindComboBox1()
      'm_list1 is a list of string 

combobox1.DataSource = m_list1

End Sub

Private Sub GetCombobox2()

    'based on the selected item in combobox1, m_list2 which is a list of string is obtained

    ComboBox2.DataSource = m_list2
End Sub

Private Sub combobox1_SelectedIndexChanged(sender As Object, e As System.EventArgs) Handles combobox1.SelectedIndexChanged
        If combobox1.SelectedIndex <> -1 Then
            GetCombobox2()

        End If
End Sub

Когда яотладка, я замечаю две вещи:

  1. После Me.combobox1.SelectedText = text1, фактически, Me.combobox1.SelectedText = "".Но Me.combobox1.Text = text1.Это потому, что combobox1.SelectedIndex = -1?

  2. Combobox1.datasource = m_list1 изменяет combobox1.selectedindex с -1 на 0. Это вызовет событие combobox.selectedIndexchange.

Таким образом, результаты приведенного выше кода показывают, что цель 1 достигнута, а цель 2 никогда не достигнута.combobox1.selected индекс всегда равен 0, а combobox2.selected индекс тоже всегда равен 0.

1 Ответ

1 голос
/ 02 марта 2012

Здесь 2 класса, которые представляют страну и континент:

'Coded by Amen Ayach's DataClassBuilder @25/02/2012
Public Class CountryCls

    Private _CountryID As Integer
    Public Property CountryID() As Integer
        Get 
            Return _CountryID
        End Get
        Set(ByVal value As Integer)
            _CountryID = value
        End Set
    End Property

    Private _CountryName As String
    Public Property CountryName() As String
        Get 
            Return _CountryName
        End Get
        Set(ByVal value As String)
            _CountryName = value
        End Set
    End Property

    Private _ContinentID As Integer
    Public Property ContinentID() As Integer
        Get 
            Return _ContinentID
        End Get
        Set(ByVal value As Integer)
            _ContinentID = value
        End Set
    End Property

End Class


'Coded by Amen Ayach's DataClassBuilder @25/02/2012
Public Class ContinentCls

    Private _ContinentID As Integer
    Public Property ContinentID() As Integer
        Get 
            Return _ContinentID
        End Get
        Set(ByVal value As Integer)
            _ContinentID = value
        End Set
    End Property

    Private _ContinentName As String
    Public Property ContinentName() As String
        Get 
            Return _ContinentName
        End Get
        Set(ByVal value As String)
            _ContinentName = value
        End Set
    End Property

End Class

Теперь добавьте 2 комбинированных списка в форму с именами cmbContinent и cmbCountry, затем добавьте следующий код в вашу форму:

Dim ContinentList As New List(Of ContinentCls)
Dim CountryList As New List(Of CountryCls)

Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    'Initialize some fake data
    For i = 1 To 3
        ContinentList.Add(New ContinentCls With {.ContinentID = i, .ContinentName = "Continent" + CStr(i)})
        For j = 1 To 5
            CountryList.Add(New CountryCls With {.ContinentID = i, .CountryID = j, .CountryName = "Cont" + CStr(i) + " - Country" + CStr(j)})
        Next
    Next

    'Filling out ContinentCombo
    With cmbContinent
        .ValueMember = "ContinentID"
        .DisplayMember = "ContinentName"
        .DataSource = ContinentList
    End With

End Sub

Private Sub cmbContinent_SelectedValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmbContinent.SelectedValueChanged
    Try
        'Filling out CountryCombo according to seleced ContinentCombo
        With cmbCountry
            .ValueMember = "CountryID"
            .DisplayMember = "CountryName"
            .DataSource = CountryList.Where(Function(f) f.ContinentID = cmbContinent.SelectedValue).ToList
        End With
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...