Как создать и обработать несколько контрольных списков - PullRequest
1 голос
/ 15 июня 2011

Гуру,

Я искал наглядный пример того, как можно обрабатывать несколько различных категорий элементов с помощью C # в ASP.NET.Данные похожи на следующие:

Category1 Heading
  Item
  Item
  Item

Category2 Heading
  Item
  Item
  Item
Category3 Heading
  Item
  Item
  Item

Имена категорий и элементы поступают из базы данных SQL.Я предполагаю, что мне понадобится один флажок для каждой категории элементов, и количество категорий является динамическим и будет меняться со временем.Можно ли создать цикл для динамического создания необходимых списков флажков и затем обрабатывать их?Я читал о, возможно, использовании повторителя данных, а также.Любая помощь с благодарностью.

Ответы [ 5 ]

0 голосов
/ 24 июня 2011

Еще раз спасибо всем за помощь. В итоге мы изменили требования, и теперь достаточно одного флажка. Я думаю, что динамическое добавление списков флажков к заполнителю все же сработало бы.

0 голосов
/ 15 июня 2011

только представьте, что это ваша структура данных. Обойтись без повторителей.

var list = new Dictionary<string, List<string>>
                           {
                               {"Name1", new List {"item1", "item2", "item3"}},
                               {"Name2", new List {"item1", "item2", "item3"}},
                               {"Name3", new List {"item1", "item2", "item3"}},
                               {"Name4", new List {"item1", "item2", "item3"}},
                               {"Name5", new List {"item1", "item2", "item3"}}
                           };

            foreach (var category in list)
            {
                var checkBoxList = new CheckBoxList
                                       {
                                           Text = category.Key
                                       };

                foreach (var value in category.Value)
                {
                    var listItem = new ListItem(value);
                    checkBoxList.Items.Add(listItem);
                }
            }
0 голосов
/ 15 июня 2011

Вы можете попробовать что-то вроде этого ...

Ваш бизнес-объект.Вы можете использовать это как модель, которую вы можете преобразовать из своего «реального» бизнес-объекта или использовать свой бизнес-объект напрямую

public class BusinessObject
{
    public string Category { get; set; }  //Your category
    public int ID { get; set; }           //Point of data entry and will be return on post
    public string Name { get; set; }      //A friendly name for your users
}

Ваша разметка aspx.Я использую повторитель для категорий, в которых есть CheckBoxList, которые будут содержать фактические элементы.Это может быть расширено и немного стилизовано.

<asp:Repeater ID="myRepeater" runat="server">
    <ItemTemplate>
        <asp:CheckBoxList ID="checkboxlist" 
                          runat="server" 
                          DataTextField="Name" 
                          DataValueField="ID" />
    </ItemTemplate>
</asp:Repeater>

Место, откуда можно получить ваши бизнес-объекты: здесь у меня просто есть член в моем коде.Вы должны получить эти данные с вашего бизнес-уровня / уровня.

List<BusinessObject> MyBusinessObjects = new List<BusinessObject>();

И ваш код за

    protected void Page_Load(object sender, EventArgs e)
    {
        //Wire up the event to handle when items are bound to the repeater
        this.myRepeater.ItemDataBound += new RepeaterItemEventHandler(myRepeater_ItemDataBound);
        //Now actually bind the categories to the repeater
        this.myRepeater.DataSource = GetCategories(MyBusinessObjects);
        this.myRepeater.DataBind();
    }

    void myRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        //Don't process items that are not item, or alternating item
        if (!(e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)) return;
        //Grab a reference to the checkboxlist in our repeater
        CheckBoxList checkboxlist = (CheckBoxList)e.Item.FindControl("checkboxlist");
        //Now put our business objects of that category in it
        checkboxlist.DataSource = GetItemsFromCategory(MyBusinessObjects, (string)e.Item.DataItem);
        checkboxlist.DataBind();
    }
    //Helper to grab categories.
    private IEnumerable<string> GetCategories(IEnumerable<BusinessObject> items)
    {
        return (from i in items
                select i.Category).Distinct();
    }
    //Helper to grab the items in categories.
    private IEnumerable<BusinessObject> GetItemsFromCategory(IEnumerable<BusinessObject> items, string category)
    {
        return (from i in items
                where i.Category == category
                select i);
    }
0 голосов
/ 15 июня 2011

Если вы не знаете заранее, сколько предметов может быть, вам нужен дисплей, который не сломается.Лучший способ добиться этого - использовать ListView с GroupTemplate:

http://forums.asp.net/t/1364813.aspx/1

0 голосов
/ 15 июня 2011

Вы можете использовать ретранслятор или DataGrid. Иногда мне проще использовать DataGrid и просто добавлять строки для каждой новой категории. Есть ли у вас какие-либо дополнительные сведения о том, что вы собираетесь с этим делать?

Вы можете использовать DataGrid и для каждой категории добавить новую строку. И в этой строке добавить элементы управления. Менее разумный способ - использовать PlaceHolder на странице и просто добавить к нему элементы управления. Но я бы определенно предложил DataGrid или заглянул в Repeater.

...