我最终做的是一起放弃 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,但这是另一天的故事。