Заполнить Combobox из базы данных
У меня ошибка со списком
Мой код:
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 "); }
Данные представлены в combobox, но когда вы меняете оценку выбора, displaymember не изменяется.
- Как я могу привязать данные строк к ListBox в WPF / WP7?
- ItemsControl с несколькими DataTemplates для viewmodel
- Почему привязка данных WPF к исключению ласточки?
- WPF MVVM INotifyPropertyChanged Implementation - модель или ViewModel
- Каковы различные режимы привязки WPF?
Теперь он работает, но когда я нажимаю кнопку, чтобы показать данные
private void button1_Click(object sender, EventArgs e) { label1.Text = cmbTripName.DisplayMember; label2.Text = cmbTripName.ValueMember; }
Это отображается:
FleetName
FleetID
Он не отображает значение
- Управление несколькими выборами с помощью MVVM
- Перетаскивание из источника данных в окно WPF не работает
- Связывающие свойства в коде
- Связывание в WPF с элементом массива, заданным свойством
- Общий class наблюдаемого словаря для DataBinding / WPF C #
- Обнаружение ошибок проверки WPF
- WPF привязка данных к интерфейсу, а не к фактическому объекту - возможность литья?
- Есть ли способ определить, где объявляется / создается привязка WPF?
Вам придется полностью переписать код. DisplayMember и ValueMember указывают на columnNames! Кроме того, вы действительно должны использовать using block
– поэтому соединение будет удалено (и закрыто ) после выполнения запроса.
Вместо использования dataReader для доступа к значениям я выбрал dataTable и привязал его как dataSource к comboBox.
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, но мне не нужно создавать собственный class . Если вам действительно нужно / нужно использовать DataReader, вы можете выбрать подход @Nattrass . В любом случае вы должны написать блок использования !
РЕДАКТИРОВАТЬ
Если вы хотите получить текущее значение combobox, попробуйте это
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()); } }
Чтобы использовать Combobox
так, как вы намереваетесь, вы можете передать объект методу cmbTripName.Items.Add
.
Этот объект должен иметь свойства FleetID
и FleetName
:
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;} }
Или, возможно, вы могли бы полностью отказаться от необходимости создания classа Fleet
, используя анонимный тип …
while (drd.Read()) { cmbTripName.Items.Add(new {FleetId = drd["FleetID"].ToString(), FleetName = drd["FleetName"].ToString()}); } cmbTripName.ValueMember = "FleetId"; cmbTripName.DisplayMember = "FleetName";
Выйдите из цикла, задайте следующее.
cmbTripName.ValueMember = "FleetID" cmbTripName.DisplayMember = "FleetName"
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();
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 } }
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()); }
void Fillcombobox() { con.Open(); cmd = new SqlCommand("select ID From Employees",con); Sdr = cmd.ExecuteReader(); while (Sdr.Read()) { for (int i = 0; i < Sdr.FieldCount; i++) { comboID.Items.Add( Sdr.GetString(i)); } } Sdr.Close(); con.Close(); }