使用List作为数据源时,找不到组合框项的索引

时间:2013-11-22 13:33:25

标签: c# winforms linq list combobox

我正在从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;

2 个答案:

答案 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);