1

Windowsフォームでコンボボックスを作成しました。次に、プロパティに移動し、データ ソースをデータベースのテーブルに設定しました。表示メンバーと値メンバーを、コンボ ボックスのアイテムとして生成する値を含む列に設定します。しかし、アイテムのセットをコンパイルすると空になります。

このサイトとインターネットに同様の質問がたくさんあることを知っており、それらの解決策を数時間試しましたが、何もうまくいかないようです.

編集

これは、Windows フォームによって自動的に生成されたコードです。このコンボボックスに影響するコードは書いていません

        // fieldsBindingSource2
        // 
        this.fieldsBindingSource2.DataMember = "Fields";
        this.fieldsBindingSource2.DataSource = this.tMSDataSet;
        // 
        // FieldSelectionComboBox
        // 
        this.FieldSelectionComboBox.BackColor = System.Drawing.SystemColors.Info;
        this.FieldSelectionComboBox.DataBindings.Add(new System.Windows.Forms.Binding("SelectedItem", this.fieldsBindingSource, "Field Name", true));
        this.FieldSelectionComboBox.DataBindings.Add(new System.Windows.Forms.Binding("SelectedValue", this.fieldsBindingSource, "Field Name", true));
        this.FieldSelectionComboBox.DataSource = this.fieldsBindingSource2;
        this.FieldSelectionComboBox.DisplayMember = "Field Name";
        this.FieldSelectionComboBox.FormattingEnabled = true;
        this.FieldSelectionComboBox.Location = new System.Drawing.Point(83, 3);
        this.FieldSelectionComboBox.MaxLength = 50;
        this.FieldSelectionComboBox.Name = "FieldSelectionComboBox";
        this.FieldSelectionComboBox.Size = new System.Drawing.Size(121, 21);
        this.FieldSelectionComboBox.TabIndex = 7;
        this.FieldSelectionComboBox.ValueMember = "Field Name";
        this.FieldSelectionComboBox.SelectedIndexChanged += new System.EventHandler(this.FieldSelectionComboBox_SelectedIndexChanged);

編集

これで何かが変わるかどうかはわかりませんが、コンボ ボックスはユーザー コントロールにあり、ユーザー コントロールをウィンドウに動的に追加します。

それ以来、私は別のアプローチを試みました。この方法では、データベースからすべての項目を読み取り、そのレコードをコンボ ボックスの項目に追加するだけです。しかし、これもうまくいきません。以下は、この試みの私のコードです。

        SqlCommand query = new SqlCommand(SqlQuery, con);
        SqlDataReader Reader = query.ExecuteReader();
        AutoCompleteStringCollection List = new AutoCompleteStringCollection();
        while (Reader.Read())
        {
            try
            {
                List.Add(Reader.GetString(0));
            }
            catch (InvalidCastException)
            {
                int t_listItem = Reader.GetInt32(0);
                List.Add(t_listItem.ToString());
            }
        }

        NewTextBox.AutoCompleteMode = AutoCompleteMode.Suggest;
        NewTextBox.AutoCompleteCustomSource = List;

次に、読み取られているフィールドの一部でエラーが発生します。エラーは、SQLException が処理されませんでした。無効なオブジェクト名です。

タイプや長さなど、無効な部分を絞り込んでみましたが、何も見つかりませんでした。データベース内のすべての値は varchar(50) であり、すべて受け入れられ、テーブルに適切に入力されます。例外をスローする単語の例は「Initiation」と「Trainer」ですが、「[First Name]」のようなものは機能します。

いずれかのアプローチに関するヘルプは素晴らしいでしょう。

4

3 に答える 3

1

以下のプロパティを設定してください

this.FieldSelectionComboBox.ValueMember = "Column1"; // Will be the column name present in your database table
this.FieldSelectionComboBox.DisplayMember = "Column2"; // Will be the column name present in your database table

ありがとう

マノジ

于 2013-06-25T12:25:50.953 に答える
-1

他の人に役立つ可能性のあるVB.Netコードを次に示します。DataView を返すのは一般的なライブラリ コードです。DataView を DataSource として使用します。コードに項目を追加する必要はありません。

FieldSelectionComboBox.DataSource = GetDataView(SQL)

Function GetDataTable(ByVal SQL As String, Optional ByVal ConnectString As String = "", Optional ByVal SingleRow As Boolean = False) As DataTable ' returns read only Datatable
    Try
        If ConnectString.Length = 0 Then ConnectString = g.OISConnectString()
        Using con As New System.Data.SqlClient.SqlConnection(ConnectString)
            Dim rdr As Data.SqlClient.SqlDataReader
            con.Open()
            Dim cmd As New SqlCommand(SQL, con)
            If SingleRow Then
                rdr = cmd.ExecuteReader(CommandBehavior.SingleRow Or CommandBehavior.CloseConnection)
            Else
                rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)
            End If
            Dim dt As New DataTable
            dt.Load(rdr)
            rdr.Close()
            Return dt
        End Using
    Catch ex As Exception
        MsgBox(ex.Message, , "GetDataTable")
        Return Nothing
    End Try
End Function
Function GetDataView(ByVal SQL As String, Optional ByVal ConnectString As String = "") As DataView ' returns read only Dataview
    Try
        Dim dt As DataTable
        dt = GetDataTable(SQL, ConnectString)
        If dt.Rows.Count = 0 Then
            Return Nothing
        Else
            Dim dv As New DataView(dt)
            Return dv
        End If
    Catch ex2 As NullReferenceException
        Return Nothing
    Catch ex As Exception
        MsgBox(ex.Message, , "GetDataView")
        Return Nothing
    End Try
End Function
于 2013-06-25T19:43:23.690 に答える