从数据库填充组合框 [英] Fill Combobox from database

查看:222
本文介绍了从数据库填充组合框的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个错误与组合框

我的code:

  SqlConnection的康恩=新的SqlConnection();
尝试
{
    康恩=新的SqlConnection(@数据源= SHARKAWY;初始目录=预订;坚持安全信息= TRUE;用户ID = SA;密码= 123456);
    查询字符串=从舰队选择FleetName,FleetID
    CMD的SqlCommand =新的SqlCommand(查询,康涅狄格州);
    cmd.CommandText =查询;
    conn.Open();
    SqlDataReader的DRD = cmd.ExecuteReader();
    而(drd.Read())
    {
         cmbTripName.Items.Add(DRD [FleetName]的ToString());
         cmbTripName.ValueMember = DRD [FleetID]的ToString()。
         cmbTripName.DisplayMember = DRD [FleetName]的ToString()。
    }
}
抓住
{
     的MessageBox.show(错误);
}

中的数据是在组合框中psented $ P $,但是当你的更改选择valuemember将DisplayMember不会改变。

它的工作,但现在当我点击按钮来显示数据

 私人无效的button1_Click(对象发件人,EventArgs的发送)
{
    label1.Text = cmbTripName.DisplayMember;
    label2.Text = cmbTripName.ValueMember;
}

这是显示:

FleetName结果
FleetID

它不显示值


解决方案

您必须完全重新编写code。 的DisplayMember ValueMember 点COLUMNNAMES!此外,你真的应该使用使用块 - 这样的连接获得的处理的(和关闭的)查询执行后,<。 / p>

而不是使用的DataReader 访问我选用一个的dataTable 的值,并约束其作为数据源到组合框。

 使用(SqlConnection的康恩=新的SqlConnection(@数据源= SHARKAWY;初始目录=预订;坚持安全信息= TRUE;用户ID = SA;密码= 123456))
{
    尝试
    {
        查询字符串=从舰队选择FleetName,FleetID
        SqlDataAdapter的大=新SqlDataAdapter的(查询,康涅狄格州);
        conn.Open();
        DataSet的DS =新的DataSet();
        da.Fill(DS,舰队);
        cmbTripName.DisplayMember =FleetName;
        cmbTripName.ValueMember =FleetID;
        cmbTripName.DataSource = ds.Tables [舰队];
    }
    赶上(异常前)
    {
        //写异常信息记录或其他任何
        MessageBox.Show(错误!);
    }
}

使用的的dataTable 的可能是一个稍微慢一点的DataReader 的,但我的没有创造我自己的类的。如果你真的有/想使用一个的的DataReader的的你可以选择的 @Nattrass方法。在任何情况下,你应该写一个 使用阻止

修改

如果你想获得组合框的当前值试试这个

 私人无效cmbTripName_SelectedIndexChanged(对象发件人,EventArgs的发送)
{
    如果(cmbTripName.SelectedItem!= NULL)
    {
        DataRowView的DRV = cmbTripName.SelectedItem为DataRowView的;        的Debug.WriteLine(项目:+ drv.Row [FleetName]的ToString());
        的Debug.WriteLine(值:+ drv.Row [FleetID]的ToString());
        的Debug.WriteLine(价值:+ cmbTripName.SelectedValue.ToString());
    }
}

I have an error with a combobox

My code:

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

The data is presented in the combobox, but when you change the selection valuemember the displaymember does not change.

It's working now but when I click the button to show the data

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

This is displayed:

FleetName
FleetID

It does not display the value

解决方案

You will have to completely re-write your code. DisplayMember and ValueMember point to columnNames! Furthermore you should really use a using block - so the connection gets disposed (and closed) after query execution.

Instead of using a dataReader to access the values I choosed a dataTable and bound it as dataSource onto the 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!");
    }               
}

Using a dataTable may be a little bit slower than a dataReader but I do not have to create my own class. If you really have to/want to make use of a DataReader you may choose @Nattrass approach. In any case you should write a using block!

EDIT

If you want to get the current Value of the combobox try this

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

这篇关于从数据库填充组合框的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆