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