我正在从LINQ查询填充列表,然后我使用列表作为组合框的数据源。
然后我尝试在组合框中选择项目,但似乎无法找到索引
using (var db = new CruxEntities())
{
var query = from q in db.Businesses
where q.BusinessID == BusinessId
select q;
var B = query.FirstOrDefault();
if (B != null)
{
// other form controls populated
var sites = B.TblBusinessSites.ToList();
this.comboBox.DisplayMember = "SiteName";
this.comboBox.ValueMember = "BusinessSiteID";
this.comboBox.DataSource = sites;
int index = comboBox.FindString(B.IdFromLinq);
}
}
索引总是赋值为-1,但是我已经逐步完成了代码,我知道列表中存在该值......似乎其余的代码都没有认识到组合框具有值。
我错过了什么?
修改
我的索引很好......但是我从最初的帖子中遗漏的是有2个组合框绑定到列表...当我逐步执行代码时,我得到两个索引都很好组合框似乎是链接的,所以我将索引分配给任何一个似乎都将它分配给两个...
index = sites.FindIndex(s => s.BusinessSiteID == B.PrimarySiteDeliveryID);
comboBox_DefaultDeliverySite.SelectedIndex = index;
index = sites.FindIndex(s => s.BusinessSiteID == B.PrimarySiteInvoiceID);
comboBox_DefaultInvoiceSite.SelectedIndex = index;
答案 0 :(得分:0)
FindString
方法不是一个好选择,因为你绑定了对象,所以坚持对象,而不是字符串。
您可以循环使用您的商品:
foreach(var item in comboBox.Items)
{
var businessSite = item as BusinessSite;
if(businessSite != null && businessSite.BusinessSiteID == B.IdFromLinq)
{
// your item here
}
}
或基于索引:
for(int index = 0; index < comboBox.Items.Count; index++)
{
var item = comboBox.Items[index];
var businessSite = item as BusinessSite;
if(businessSite != null && businessSite.BusinessSiteID == B.IdFromLinq)
{
return index;
}
}
答案 1 :(得分:0)
您找不到网站索引,因为FindString
方法检查项目显示的文本(在您的情况下为网站名称),但您尝试按ID搜索,这是项目的值。
实际上你甚至不需要在这里触摸组合框,因为项目的添加顺序与你在sites
集合中的顺序相同。要获取某个站点的索引,您只需在sites
列表中搜索站点索引:
int index = sites.FindIndex(s => s.BusinessSiteID == B.IdFromLinq);