В итоге я отказался от 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, но это история для другого дня.