2016-12-16 32 views
0

我需要添加ALL选项作为组合框的首选。我已经尝试了下面的代码,但所有不是加上,我必须改变什么才能添加?添加“ALL”选项作为Combobox的第一选择

string query = "select [empname] from [server].[dbo].[table]"; 
SqlDataAdapter da = new SqlDataAdapter(query, conn); 
conn.Open(); 
DataSet ds = new DataSet(); 
da.Fill(ds, "tables"); 
cbotables.DisplayMember = "empname"; 
cbotables.Items.Insert(0, "All"); 
cbotables.DataSource = ds.Tables["tables"]; 

编辑
我只是意识到一些事情并没有在我的代码显示...我的连接字符串上述声明的,组合框显示的,他们应该从数据库的内容,只是没有添加了所有选项。

+0

你不能使用数据源和东西在'Items'手动 – Plutonix

+0

@Pututix - 有没有一个“创可贴”呢? I.E.应该将项目添加到数据表中,然后将所有项添加到数据表中,还是可以将项目插入到新SQL表中并在该列表顶部插入ALL,然后从新创建的表中抽取数据? –

+0

*通常*与你想要一个值成员的数据源(如Emp Id)。既然你只是在名字后面,为什么要使用数据源呢?使用addrange和一个linq 1班轮将名称添加到项目集合 – Plutonix

回答

1

也许最简单的方法是将插入一行到DataTable承担其唯一的作用是成为DataSource

// fill the datatable 
dt.Load(cmd.ExecuteReader()); 

var dr = dt.NewRow(); 
dr["Id"] = -1; 
dr["Name"] = "All"; 
dt.Rows.InsertAt(dr, 0); 

cboEmp.DisplayMember = "Name"; 
cboEmp.ValueMember = "Id"; 
cboEmp.DataSource = dt; 

它更常见的是与这些一个ValueMember所以你可以告诉是什么选择,因此“Id”列。如果DataTable有其他目的,您可能不想向其添加虚假数据。对于这一点,你可以将数据传输到一个匿名的列表:

dt.Load(cmd.ExecuteReader()); 

// xfer data to anon collection 
var myDS = dt.AsEnumerable() 
    .Select(q => new {Name = q.Field<String>("Name"), 
         Value = q.Field<Int32>("Id") } 
      ) 
    .ToList(); 

// add ALL with fake id 
myDS.Insert(0, new { Name = "ALL", Value = -1 }); 

cboEmp.DisplayMember = "Name"; 
cboEmp.ValueMember = "Value"; 
cboEmp.DataSource = myDS; 

无论哪种方式,得到了相同的结果:

enter image description here

如果你真的不需要的Id,你不需要一个匿名类型并可以只选择名称和List<string>

相关问题