0

そうは思わないかもしれませんが、リストボックスがデータソースにバインドされている場合はそうなります(私が見る限り)。

動作を以下のコードに減らしました。「if」行は、データバインディングを介したリストのロードと「手動」でのリストのロードを切り替えます(どちらも同じデータテーブルを使用します)。いずれの場合も、後で選択したインデックスを設定してから、親フォームを変更します。手動でロードすると、選択したインデックスが保持され、バインドすると失われます。これがどのように意味があるのか​​わかりません。ホストフォームを変更するとリストのプロパティが変更される理由がわかりません。これはバグですか?

Public Class Form1
    Sub main() Handles Me.Load
        Dim ListControl1 As ListBox = New ListBox
        ListControl1.Parent = Me
        Dim dt = New DataTable
        dt.Columns.Add("intColourID")
        dt.Columns.Add("strName")
        dt.Rows.Add({1, "Red"})
        dt.Rows.Add({2, "Green"})
        dt.Rows.Add({3, "Blue"})

        ListControl1.ValueMember = dt.Columns(0).ColumnName
        ListControl1.DisplayMember = dt.Columns(1).ColumnName
        If False Then
            ListControl1.DataSource = dt
        Else
            For i = 0 To dt.Rows.Count - 1
                ListControl1.Items.Add(dt.Rows(i)("strName").ToString)
            Next
        End If
        ListControl1.SelectedIndex = 2
        Dim z As Form = New Form
        ListControl1.Parent = z
        z.Show()
    End Sub
End Class
4

1 に答える 1

0

コントロールをフォームに追加する正しい方法は、その親を設定するのではなく、Controlsフォームのコレクションに追加することです。このようにすると、例外は発生しません (コメントに書いた最後の 3 行はコメントアウトされています)。

Me.Controls.Add(ListControl1)   ' Instead of ListControl1.Parent = Me
于 2012-03-22T21:15:38.710 に答える