2

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

有没有更好的办法?


编辑:

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

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

4

3 回答 3

0

你试过这个ItemDataBound活动吗?

于 2010-04-14T18:35:50.410 回答
0

当我过去完成此操作时,我设置了列表框的数据源,绑定它,然后遍历列表框中的项目列表,并将 .Selected 设置为 true 匹配我的条件或值的每个项目。我不确定它是否是最有效的,但对于我处理过的小列表来说,它确实工作得很好。

于 2010-04-14T21:00:53.513 回答
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();
                }
            }
        }
    }
}

这在性能方面确实很糟糕,但确实有效。如果我编译了 linq 查询,也许我可以改进它,但我从来没有走到那一步。我从您上面的评论中了解到,您可能已经确定了自己的解决方法来解决这个问题,所以我只是添加这个答案,以防它可以帮助像我这样的未来迷失的灵魂。

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

于 2012-06-20T01:18:40.360 回答