将ComboBox绑定到DataTable(WinForms c#)?

时间:2014-03-14 13:40:55

标签: c# winforms combobox datatable

我有一种方法可以从ComboBox填充DataTable

public string populateCompanyTransSellingEntityLookUp(ref System.Windows.Forms.ComboBox Combo, string Id, Contract Contract)
    {
        SqlCommand _comm = new SqlCommand();
        _comm.Parameters.AddWithValue("@id", Id);
        _comm.CommandText = "SELECT [name] FROM dbo.fnGetList(@id) ORDER BY [name]; ";   
        _comm.Connection = _conn;
        _comm.CommandTimeout = _command_timeout;

        DataTable dt = new DataTable();
        try
        {
            SqlDataReader myReader = _comm.ExecuteReader();
            dt.Load(myReader);

            Combo.DataSource = dt;
            Combo.DisplayMember = "name";

            foreach (DataRow dr in dt.Rows)
            {
                if (dr["name"].ToString() == Contract.Company_Name.ToString())
                {                        
                    Combo.Text = dr["company_int_name"].ToString();
                }
            }
        }
        catch
        {
            MessageBox.Show("Unable to populate Company Name LookUp");
        }


        return "";
    }

我将保存的值Contract.Company_Name传递到forEach循环,以便从SelectedItem中找到我所需的DataTable。使用ComboBox中的DataTable值填充Combo.Datasource =dt;,但未设置我选择的项目。代码编译无一例外。如果我删除Datasource = dt;, the SelectedItem is set no problem. Why is the数据源overriding my SelectedItem`并且我的绑定是否有错过的内容?

全部谢谢

3 个答案:

答案 0 :(得分:0)

试试这个:

Combo.SelectedItem = dr;

答案 1 :(得分:0)

首先,您必须设置valueMember。然后,您可以设置selectedValue属性而不是SelectedItem。 Item是一个数据源记录。所以在你的情况下它将是SelectedItem = dr!但我不确定这是否有效。

答案 2 :(得分:0)

我建议使用 SelectedValue,这样您就不需要“手动”遍历值。

此外,您不需要在只需要一组字符串值的地方使用“重量级”DataTable

private IEnumerable<string> LoadNames(string id)
{
    var query = "SELECT [name] FROM dbo.fnGetList(@id) ORDER BY [name]";

    using (var connection = new SqlConnection("connectionString")
    using (var command = new SqlCommand(query, connection)
    {
        // 36 is the size of the VarChar column in database(use your value)
        command.Parameters.Add("@id", SqlDbType.VarChar, 36).Value = id;

        connection.Open();
        using (var reader = command.ExecuteReader())
        {
            var names = new List<string>();
            while(reader.Read())
            {
                names.Add(reader.GetString(0));
            }

            return names;
        }
    }
}


public void Populate(ComboBox combobox, string id, Contract contract)
{
    combobox.DataSource = LoadNames(id);
    combobox.SelectedValue = contract.Copmpany_Name.ToString();
}

注意事项:

  1. 处理所有处理外部资源的对象(SqlConnectionSqlCommandSqlDataReader
  2. 使用有关类型的精确信息创建 SqlParameter,因为字符串对于提供数据库中列的大小很重要。此信息将提高服务器端的 SQL 查询性能。
  3. 不要将组合框作为引用传递,populate 方法不会创建新实例,而只会使用给定的 ComboBox 实例。