1

大师们,

我一直在寻找一个清晰的示例,说明如何在 ASP.NET 中使用 C# 处理多个不同类别的项目。数据类似于以下内容:

Category1 Heading
  Item
  Item
  Item

Category2 Heading
  Item
  Item
  Item
Category3 Heading
  Item
  Item
  Item

类别名称和项目来自 SQL 数据库。我想我需要为每个类别的项目创建一个复选框列表,并且类别的数量是动态的,并且会随着时间而变化。是否可以创建一个循环来动态构建所需的复选框列表然后能够处理它们?我也读到了可能使用数据中继器的信息。非常感谢任何帮助。

4

5 回答 5

0

再次感谢大家的帮助。我们最终更改了要求,现在一个复选框列表就足够了。我认为将复选框列表动态添加到占位符会起作用。

于 2011-06-23T21:05:23.377 回答
0

想象一下这是你的数据结构。无需中继器即可。

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

            foreach(列表中的 var 类别)
            {
                var checkBoxList = 新的 CheckBoxList
                                       {
                                           文本 = category.Key
                                       };

                foreach(category.Value 中的 var 值)
                {
                    var listItem = new ListItem(value);
                    checkBoxList.Items.Add(listItem);
                }
            }
于 2011-06-14T22:18:12.080 回答
0

您可以使用中继器或 DataGrid。有时,我更容易使用 DataGrid 并为每个新类别添加行。你有更多关于你想用它做什么的细节吗?

您可以使用 DataGrid 并为每个类别添加一个新行。并在该行中添加控件。一种不太精明的方法是在页面上使用 PlaceHolder 并为其添加控件。但我肯定会建议使用 DataGrid 或查看中继器。

于 2011-06-14T22:01:20.537 回答
0

你可以试试这样的...

您的业​​务对象。您可以将其用作可以从“真实”业务对象转换或直接使用业务对象的模型

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);
    }
于 2011-06-14T22:12:56.570 回答
0

如果您事先不知道可能有多少物品,那么您需要一个不会损坏的显示器。实现这一点的最佳方法是使用带有 GroupTemplate 的 ListView:

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

于 2011-06-14T22:13:01.583 回答