11

コンボボックスにエラーがあります

私のコード:

SqlConnection conn = new SqlConnection();
try
{
    conn = new SqlConnection(@"Data Source=SHARKAWY;Initial Catalog=Booking;Persist Security Info=True;User ID=sa;Password=123456");
    string query = "select FleetName, FleetID from fleets";
    SqlCommand cmd = new SqlCommand(query, conn);
    cmd.CommandText = query;
    conn.Open();
    SqlDataReader drd = cmd.ExecuteReader();
    while (drd.Read())
    {
         cmbTripName.Items.Add(drd["FleetName"].ToString());
         cmbTripName.ValueMember = drd["FleetID"].ToString();
         cmbTripName.DisplayMember = drd["FleetName"].ToString();
    }
}
catch
{
     MessageBox.Show("Error ");
}

データはコンボボックスに表示されますが、選択値メンバーを変更しても、表示メンバーは変更されません。

現在は機能していますが、ボタンをクリックしてデータを表示すると

private void button1_Click(object sender, EventArgs e)
{
    label1.Text = cmbTripName.DisplayMember;
    label2.Text = cmbTripName.ValueMember;
}

これが表示されます:

FleetName
FleetID

値は表示されません

4

8 に答える 8

22

コードを完全に書き直す必要があります。DisplayMemberValueMemberは columnNames を指しています。さらに、実際には - を使用する必要があるため、クエリの実行後using blockに接続が破棄(およびクローズ) されます。

dataReaderを使用して値にアクセスする代わりに、dataTable選択し、それを dataSource としてコンボボックスにバインドしました。

using (SqlConnection conn = new SqlConnection(@"Data Source=SHARKAWY;Initial Catalog=Booking;Persist Security Info=True;User ID=sa;Password=123456"))
{
    try
    {
        string query = "select FleetName, FleetID from fleets";
        SqlDataAdapter da = new SqlDataAdapter(query, conn);
        conn.Open();
        DataSet ds = new DataSet();
        da.Fill(ds, "Fleet");
        cmbTripName.DisplayMember =  "FleetName";
        cmbTripName.ValueMember = "FleetID";
        cmbTripName.DataSource = ds.Tables["Fleet"];
    }
    catch (Exception ex)
    {
        // write exception info to log or anything else
        MessageBox.Show("Error occured!");
    }               
}

dataTableの使用はdataReaderよりも少し遅いかもしれませんが、独自のクラスを作成する必要はありません。本当にDataReaderを使用する必要がある場合、または使用したい場合は、 @Nattrass アプローチを選択できます。いずれにせよ、using ブロックを作成する必要があります。

編集

コンボボックスの現在の値を取得したい場合は、これを試してください

private void cmbTripName_SelectedIndexChanged(object sender, EventArgs e)
{
    if (cmbTripName.SelectedItem != null)
    {
        DataRowView drv = cmbTripName.SelectedItem as DataRowView;

        Debug.WriteLine("Item: " + drv.Row["FleetName"].ToString());
        Debug.WriteLine("Value: " + drv.Row["FleetID"].ToString());
        Debug.WriteLine("Value: " + cmbTripName.SelectedValue.ToString());
    }
}
于 2012-09-19T12:51:35.820 に答える
7

を意図したとおりに使用するComboboxには、メソッドにオブジェクトを渡すことができますcmbTripName.Items.Add

そのオブジェクトには次FleetIDFleetNameプロパティが必要です。

while (drd.Read())
{
    cmbTripName.Items.Add(new Fleet(drd["FleetID"].ToString(), drd["FleetName"].ToString()));
}
cmbTripName.ValueMember = "FleetId";
cmbTripName.DisplayMember = "FleetName";

Fleetクラス:

class Fleet
{
     public Fleet(string fleetId, string fleetName)
     {
           FleetId = fleetId;
           FleetName = fleetName
     }
     public string FleetId {get;set;}
     public string FleetName {get;set;}
}

Fleetまたは、匿名型を使用することで、おそらくクラスの必要性を完全になくすことができます...

while (drd.Read())
{
    cmbTripName.Items.Add(new {FleetId = drd["FleetID"].ToString(), FleetName = drd["FleetName"].ToString()});
}
cmbTripName.ValueMember = "FleetId";
cmbTripName.DisplayMember = "FleetName";
于 2012-09-19T12:39:14.787 に答える
1

ループの外側で、次のように設定します。

cmbTripName.ValueMember = "FleetID"
cmbTripName.DisplayMember = "FleetName"
于 2012-09-19T12:31:18.333 に答える