C# 将组合框绑定到数据表(WinC)?

C# 将组合框绑定到数据表(WinC)?,c#,winforms,combobox,datatable,C#,Winforms,Combobox,Datatable,我有一个从数据表填充组合框的方法: 我正在将我的保存值Contract.Company\u名称传递到forEach循环中,以从数据表中查找我所需的SelectedItem。ComboBox由Combo.Datasource=dt中的my DataTable值填充;但未设置我选择的项目。代码编译时毫无例外。如果我删除Datasource=dt;,所选编辑器设置没有问题。为什么数据源会覆盖mySelectedItem`并且我的绑定是否遗漏了什么 谢谢大家试试这个: Combo.SelectedIte

我有一个从数据表填充组合框的方法:

我正在将我的保存值Contract.Company\u名称传递到forEach循环中,以从数据表中查找我所需的SelectedItem。ComboBox由Combo.Datasource=dt中的my DataTable值填充;但未设置我选择的项目。代码编译时毫无例外。如果我删除Datasource=dt;,所选编辑器设置没有问题。为什么数据源会覆盖mySelectedItem`并且我的绑定是否遗漏了什么

谢谢大家

试试这个:

Combo.SelectedItem = dr;

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

我建议使用SelectedValue,这样就不需要手动循环数值

另外,在只需要字符串值集合的情况下,不需要使用重载数据表

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();
}
需要注意的几件事:

处理处理外部资源SqlConnection、SqlCommand和SqlDataReader的所有对象 创建SqlParameter,其中包含有关类型的精确信息,因为字符串对于提供数据库中列的大小很重要。此信息将提高服务器端的SQL查询性能。 不要将combobox作为引用传递,populate方法不会创建新实例,而只使用给定的combobox实例。
如下设置ValueMember:Combo.ValueMember=name;还没修好不幸的是…修好了。将SelectedItem一起取出并设置Combo.Text=dr[company\u int\u name].ToString;在forEach内部。不确定SelectedItem为什么不能绑定?有问题的编辑代码:在我看来,这是一种完成任务的丑陋方式。您最好使用SelectedValue属性。您应该考虑IList而不是DataTable。在复杂的情况下更容易处理。例如,您可以使用Lambda语句。
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();
}