在FormView控件中数据绑定多选ListBox

时间:2010-04-14 18:29:06

标签: asp.net data-binding listbox formview multi-select

我在FormView中有一个多选ListBox。我无法弄清楚如何为它设置数据绑定 我可以很好地填充列表框。 如果列表框是单个选择,我可以使用说SelectValue='<%#Bind("col")%>',这可以正常工作。 有什么东西可以绑定到多选列表框吗? 我已经尝试通过处理列表框的DataBinding事件并在适当的项目上设置selected属性来手动DataBinding。不幸的是,在DataBinding事件期间列表框中没有项目。 我发现最接近的事情是保存确定在DataBinding中应该选择哪些项目的值,然后在FormViews DataBinding事件中使用该值来选择对我来说似乎是黑客的正确项目。

有更好的方法吗?


编辑:

澄清我目前在做什么......

我正在使用FormViews的ItemCreated事件来保存FormView的DataItem。 然后在FormView的DataBound事件中,我找到列表框并手动设置所选项。 我必须保存这样的值并不正确,我认为有一种更正确的方法可以做到这一点我无法看到。

3 个答案:

答案 0 :(得分:0)

您是否尝试过ItemDataBound事件?

答案 1 :(得分:0)

当我在过去完成此操作时,我已设置列表框的数据源,绑定它,然后遍历列表框中的项目列表,并为符合我的条件的每个项目设置.Selected为true或价值观。我不确定它是最有效的,但对于我处理过的小清单肯定工作得很好。

答案 2 :(得分:0)

我最终做的是放弃ListBox,我选择TreeView,因为它实际上更符合我的目的。

在此之前,虽然我写了这个函数来选择当前项目,然后我从Page_PreRender调用它,因为绑定已经完成,我可以得到我需要的控件。

    protected void SelectCategories()
    {

        ListBox lb = (ListBox)fvProduct.FindControl("lstCategory");

        Product product = (Product)pdc.Products.Where(a => a.Sku == txtSku.Text).FirstOrDefault();
        var c = pdc.ProductCategories.Where(b => b.ProductId == product.ProductId);

        if (lb != null && lb.Items.Count > 0)
        {
            foreach (ProductCategory cat in c)
            {
                foreach (ListItem li in lb.Items)
                {
                    if (cat.CategoryId == Convert.ToInt32(li.Value))
                    {
                        li.Selected = true;
                    }
                } 
            }
        }
    }

然后当我需要从ListBox更新时,我从FormView.ItemUpdating事件中调用了以下代码。

protected void UpdateCategories()
{
    ListBox lb = (ListBox)fvProduct.FindControl("lstCategory");

    Product product = (Product)pdc.Products.Where(a => a.Sku == txtSku.Text).FirstOrDefault();

    if (lb != null && lb.Items.Count > 0)
    {
        foreach (ListItem li in lb.Items)
        {
            ProductCategory pc = new ProductCategory();
            pc = (ProductCategory)pdc.ProductCategories.Where(d => d.CategoryId == Convert.ToInt32(li.Value) && d.ProductId == product.ProductId).FirstOrDefault();

            if (pc == null)
            {
                if (li.Selected == true)
                {
                    //note: if li is selected but pc is null then insert new record .
                    pc = new ProductCategory();
                    pc.ProductId = product.ProductId;
                    pc.CategoryId = Convert.ToInt32(li.Value);
                    pdc.ProductCategories.InsertOnSubmit(pc);
                    pdc.SubmitChanges();
                }
            }
            else
            {
                if (li.Selected == false)
                {
                    //note: if li is not selected but pc is not null then remove record.
                    pdc.ProductCategories.DeleteOnSubmit(pc);
                    pdc.SubmitChanges();
                }
            }
        }
    }
}

这是非常糟糕的性能,但确实有效。如果我compiled the linq query,也许我可以改进它,但我从来没有那么远。我从你上面的评论中了解到,你可能已经找到了解决问题的方法,所以我只是添加了这个答案,以防它可能有助于未来像我一样失去灵魂。

最后,TreeView对我来说是一个更好的工具,所以无论如何我都不需要这样做。虽然这开始了新的冒险,因为你无法轻松地将TreeView绑定到LinqDataSource,但这是另一天的故事。