2012-09-19 15 views
8

からコンボボックスを埋める私のコード:コンボボックス</p> <p>と私はエラーを持っているデータベース

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 "); 
} 

データはコンボボックスで提示されていますが、選択を変更ときdisplaymemberは変更されませんValueMemberで。

それだ今働いけどとき、私はこれが表示され

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

データを示すために、ボタンをクリックします。

FleetName
FleetID

それは値が表示されません

答えて

12

コードを完全に書き直す必要があります。 DisplayMemberおよびValueMemberポイントを列挙する名前です!さらに、実際にはusing blockを使用する必要があります。そのため、クエリの実行後に(およびが閉じて)に設定されています。

の代わりに私がのdataTableを選びましおよびコンボボックスの上にデータソースとしてそれをバインド値にアクセスするのDataReaderを使用。

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 blockと書く必要があります。あなたが取得したい場合は

EDIT

コンボボックスの現在の値がこの

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()); 
    } 
} 
+0

今は仕事ですが、私はラベルにValueMemberとdisplaymemberを挿入する必要があります 'label1.Text = cmbTripName.DisplayMember; label2.Text = cmbTripName.ValueMember; ' –

+0

結果:SYSTEM.DATA.DATAROWVIEWは名前ではありません –

1

ループの外側を以下のように設定します。

cmbTripName.ValueMember = "FleetID" 
cmbTripName.DisplayMember = "FleetName" 
+0

は、これらのプロパティの列名を設定する必要がありますしてみてください。データ値を設定しました。それは問題です – Prasanna

7

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

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

Fleetクラス::あなたはおそらく完全に匿名を使用してFleetクラスの必要性を離れて行うことができます

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

あるいは、FleetIDFleetName特性を有するべきであるオブジェクト

タイプ...

while (drd.Read()) 
{ 
    cmbTripName.Items.Add(new {FleetId = drd["FleetID"].ToString(), FleetName = drd["FleetName"].ToString()}); 
} 
cmbTripName.ValueMember = "FleetId"; 
cmbTripName.DisplayMember = "FleetName"; 
0
private void StudentForm_Load(object sender, EventArgs e) 

{ 
     string q = @"SELECT [BatchID] FROM [Batch]"; //BatchID column name of Batch table 
     SqlDataReader reader = DB.Query(q); 

     while (reader.Read()) 
     { 
      cbsb.Items.Add(reader["BatchID"].ToString()); //cbsb is the combobox name 
     } 
    } 
0
  SqlConnection conn = new SqlConnection(@"Data Source=TOM-PC\sqlexpress;Initial Catalog=Northwind;User ID=sa;Password=xyz") ; 
      conn.Open(); 
      SqlCommand sc = new SqlCommand("select customerid,contactname from customers", conn); 
      SqlDataReader reader; 

      reader = sc.ExecuteReader(); 
      DataTable dt = new DataTable(); 
      dt.Columns.Add("customerid", typeof(string)); 
      dt.Columns.Add("contactname", typeof(string)); 
      dt.Load(reader); 

      comboBox1.ValueMember = "customerid"; 
      comboBox1.DisplayMember = "contactname"; 
      comboBox1.DataSource = dt; 

      conn.Close(); 
+0

コードの仕組みの背景には、いくつかの説明が有益でしょう。 – rayryeng

0
string query = "SELECT column_name FROM table_name";  //query the database 
SqlCommand queryStatus = new SqlCommand(query, myConnection); 
sqlDataReader reader = query.ExecuteReader();        

while (reader.Read()) //loop reader and fill the combobox 
{ 
ComboBox1.Items.Add(reader["column_name"].ToString()); 
} 
関連する問題