我在FormView中有一个多选ListBox。我无法弄清楚如何为它设置数据绑定
我可以很好地填充列表框。
如果列表框是单个选择,我可以使用说SelectValue='<%#Bind("col")%>'
,这可以正常工作。
有什么东西可以绑定到多选列表框吗?
我已经尝试通过处理列表框的DataBinding事件并在适当的项目上设置selected属性来手动DataBinding。不幸的是,在DataBinding事件期间列表框中没有项目。
我发现最接近的事情是保存确定在DataBinding中应该选择哪些项目的值,然后在FormViews DataBinding事件中使用该值来选择对我来说似乎是黑客的正确项目。
有更好的方法吗?
澄清我目前在做什么......
我正在使用FormViews的ItemCreated事件来保存FormView的DataItem。 然后在FormView的DataBound事件中,我找到列表框并手动设置所选项。 我必须保存这样的值并不正确,我认为有一种更正确的方法可以做到这一点我无法看到。
答案 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,但这是另一天的故事。