我有一个组合框的错误
我的代码:
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 ");
}
Run Code Online (Sandbox Code Playgroud)
数据在组合框中显示,但是当您更改选择值时,显示成员不会更改.
它现在正在工作,但是当我点击按钮显示数据时
private void button1_Click(object sender, EventArgs e)
{
label1.Text = cmbTripName.DisplayMember;
label2.Text = cmbTripName.ValueMember;
}
Run Code Online (Sandbox Code Playgroud)
显示如下:
FleetName
FleetID
它不显示值
Pil*_*anz 14
您必须完全重写代码.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!");
}
}
Run Code Online (Sandbox Code Playgroud)
使用的dataTable可能是一个慢一点比DataReader的,但我没有创建自己的类.如果您真的必须/想要使用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());
}
}
Run Code Online (Sandbox Code Playgroud)
要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";
Run Code Online (Sandbox Code Playgroud)
该Fleet类别:
class Fleet
{
public Fleet(string fleetId, string fleetName)
{
FleetId = fleetId;
FleetName = fleetName
}
public string FleetId {get;set;}
public string FleetName {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以Fleet通过使用匿名类型完全取消对类的需求...
while (drd.Read())
{
cmbTripName.Items.Add(new {FleetId = drd["FleetID"].ToString(), FleetName = drd["FleetName"].ToString()});
}
cmbTripName.ValueMember = "FleetId";
cmbTripName.DisplayMember = "FleetName";
Run Code Online (Sandbox Code Playgroud)