Привязка данных для множественного выбора ListBox в элементе управления FormView - PullRequest
2 голосов
/ 14 апреля 2010

У меня множественный выбор ListBox в FormView. Я не могу понять, как настроить привязку данных для него.
Я могу заполнить список в порядке. Если бы список был одним выбором, я мог бы сказать, скажем SelectValue='<%#Bind("col")%>', и это прекрасно работает. Есть ли что-то, что я могу связать для списка с множественным выбором? Я попытался вручную привязать DataBinding, обработав событие DataBinding списка и установив выбранное свойство для соответствующих элементов. К сожалению, в списке нет элементов во время события DataBinding. Самое близкое, что я нашел, - это сохранить значение, которое определяет, какие элементы следует выбирать во время DataBinding, а затем использовать это значение в событии FormViews DataBinding, чтобы выбрать нужные элементы, которые мне кажутся хаком.

Есть ли лучший способ?


EDIT:

Чтобы уточнить, чем я сейчас занимаюсь ...

Я использую событие ItemCreated FormViews для сохранения DataItem объекта FormView. Затем в событии DataBound формы FormView я нахожу список и вручную устанавливаю выбранные элементы. Неправильно, что я должен сохранить значение таким образом, и я предполагаю, что есть более правильный способ сделать это, которого я просто не вижу.

Ответы [ 3 ]

0 голосов
/ 15 апреля 2010

Когда я делал это в прошлом, я установил источник данных списка, связал его, затем перебрал список элементов в списке и установил .Selected в true для каждого элемента, который соответствует моим критериям или значения. Я не уверен, что он самый эффективный, но для небольших списков, с которыми я имел дело, он, безусловно, работал.

0 голосов
/ 20 июня 2012

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

0 голосов
/ 14 апреля 2010

Вы пробовали событие ItemDataBound?

...