【问题标题】:C# Fill combo box from SQL DataTableC# 从 SQL DataTable 填充组合框
【发布时间】:2021-01-28 00:52:01
【问题描述】:
DataTable _dt = new DataTable();

using (SqlConnection _cs = new SqlConnection("Data Source=COMNAME; Initial Catalog=DATABASE; Integrated Security=True"))
{
    string _query = "SELECT * FROM Doctor";
    SqlCommand _cmd = new SqlCommand(_query, _cs);

    using (SqlDataAdapter _da = new SqlDataAdapter(_cmd))
    {
        _da.Fill(_dt);
    }
}
cbDoctor.DataSource = _dt;
foreach(DataRow _dr in _dt.Rows)
{
    cbDoctor.Items.Add(_dr["name"].ToString());
}

出现错误...

结果是System.Data.DataRowView,而不是数据库中的数据..

【问题讨论】:

  • 当您编写cbDoctor.DataSource = _dt; 时,会将数据源设置为cbDoctor 控件,并应自动将dt 集合中的所有项目添加到其中(您也可以调用cbDoctor.DataBind() 来更新绑定) ,因此您不必手动添加项目。请提供更多信息,即这是一个桌面应用程序以及cbDoctor 是什么类型的控件。
  • 桌面应用程序,我只想在表单加载时用数据表中的数据填充我的组合框..

标签: c# sql


【解决方案1】:

我还不确定您的代码中的确切错误是什么,但如果您可以不使用DataTable,您可以这样做:

using (SqlConnection sqlConnection = new SqlConnection("connstring"))
{
    SqlCommand sqlCmd = new SqlCommand("SELECT * FROM Doctor", sqlConnection);
    sqlConnection.Open();
    SqlDataReader sqlReader = sqlCmd.ExecuteReader();

    while (sqlReader.Read())
    {
        cbDoctor.Items.Add(sqlReader["name"].ToString());
    }

    sqlReader.Close();
}

欲了解更多信息,请查看SqlDataReader reference on MSDN

为了在您发布的原始代码中找到问题,请提供您在哪一行得到异常的信息(或者是阻止应用程序编译的错误?)以及它的全部信息。

【讨论】:

  • 如何使用SqlDataAdapter
【解决方案2】:

您还可以将组合框的 DisplayMember 属性指定给任何列名。 例如,如果你想显示名称字段,你可以这样做

Combobox1.DisplayMember="Name";

【讨论】:

    【解决方案3】:

    我认为问题在于您试图将多列插入组合框(它只能接受一列)。调整您的 SELECT 语句,以便将您需要的所有数据合并到一列中:

    例子:

    SELECT Name + ' ' LastName + ' '+ ID AS 'DoctorData' FROM Doctor
    

    通过使用 + 运算符,您可以组合数据库中的多个列,并将其表示为单个数据。我认为您的代码应该在那之后工作(您甚至可以评论 foreach 循环,我认为将数据源添加到您的组合框就足够了)

    【讨论】:

    • 已经完成了,我只想用数据表中的名称列填充组合框
    • yeapp.. 'System.Data.DataRowView System.Data.DataRowView'
    • 首先,您没有打开连接有点奇怪 - 您应该在定义 SqlCommand 之前添加此行 if(_cs.State == ConnectionState.Closed) _cs.Open();。其次,您应该使用这一行_cmd.Connection = _cs 将该连接添加到SqlComman。我不知道为什么编译器没有将其作为错误抛出,但请尝试一下。
    • @NDraskovic 没有打开并不奇怪,数据适配器会自动处理它,不需要显式打开。
    猜你喜欢
    • 2010-09-20
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    相关资源
    最近更新 更多