C# 从数据库填充组合框
我有一个组合框错误 我的代码:C# 从数据库填充组合框,c#,data-binding,C#,Data Binding,我有一个组合框错误 我的代码: 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 fl
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 ");
}
数据显示在组合框中,但当您更改选择值Member时,displaymember不会更改。
它现在正在工作,但当我点击按钮显示数据时
private void button1_Click(object sender, EventArgs e)
{
label1.Text = cmbTripName.DisplayMember;
label2.Text = cmbTripName.ValueMember;
}
这将显示:
FleetName弗利蒂德
它不会在循环外侧显示值,设置如下
cmbTripName.ValueMember = "FleetID"
cmbTripName.DisplayMember = "FleetName"
要按您想要的方式使用组合框,可以将对象传递给
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";
车队
等级:
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";
您必须完全重新编写代码和指向列名称!此外,您应该真正使用
using block
——以便在执行查询后释放(并关闭)连接
我没有使用数据读取器来访问值,而是选择了数据表,并将其作为数据源绑定到组合框中
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慢一点,但我不必创建自己的类。如果您确实必须/想要使用数据读取器,您可以选择@Nattrass方法。在任何情况下,你都应该写一个
编辑
如果要获取组合框的当前值,请尝试以下操作
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());
}
}
void Fillcombobox()
{
con.Open();
cmd=新的SqlCommand(“从员工中选择ID”,con);
Sdr=cmd.ExecuteReader();
while(Sdr.Read())
{
对于(int i=0;i
应该为这些属性设置列名。您已经设置了数据值。这就是问题所在IT现在的工作,但我需要插入ValueMember和displaymember以标记'label1.Text=cmbTripName.displaymember;label2.Text=cmbTripName.ValueMember`结果:SYSTEM.DATA.DATAROWVIEW不是NAMES@AhmedSharkawy你找到“SYSTEM.DATA.DATAROWVIEW”的解决方案了吗?因为我仍然陷在其中!对代码的工作原理进行一些解释将是有益的。请不要只是在回答中转储代码。试着至少提供一个简短的解释。请参阅:请通过添加一些解释(可能还有一些格式)来改进您的代码答案。这样你就可以明显地帮助询问者。你也不想给人留下这样的印象:你正在提供免费的代码编写服务,是吗?
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
}
}
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();
string query = "SELECT column_name FROM table_name"; //query the database
SqlCommand queryStatus = new SqlCommand(query, myConnection);
sqlDataReader reader = queryStatus.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();
}