【问题标题】:How to generate and process multiple checklistboxes如何生成和处理多个复选框
【发布时间】:2011-09-15 02:07:53
【问题描述】:

大师,

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

Category1 Heading
  Item
  Item
  Item

Category2 Heading
  Item
  Item
  Item
Category3 Heading
  Item
  Item
  Item

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

【问题讨论】:

    标签: c# asp.net forms dynamic checklistbox


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的快速回复。我需要获取收集的数据并将其插入数据库。我现在使用的单个复选框可用于处理,但它不允许对单个项目进行分组。我需要对一堆项目进行分组,并从数据库中为它们提供一个标题。
    【解决方案2】:

    你可以试试这样的……

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

    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);
        }
    

    【讨论】:

    • 所以听起来有几个选项:转发器、带有模板的列表视图、业务对象。不确定哪个最简单。
    • 编程的美妙之处在于它们有很多选择。我在这里建议的解决方案只是一种方法。大多数程序员会说选择最容易维护的解决方案;不一定最容易构建。
    • 我查看了数据网格,但我不确定如何使用复选框来制作它。我需要用户选择他们想要的任何项目组合并将此信息记录在数据库中。
    【解决方案3】:

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

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

    【讨论】:

    • 仍在尝试解决这个问题(总的来说,我对 .NET 还很陌生)。我知道在页面加载时数据库中有多少项目,它不会被用户动态更改。用户只需选择他们想要的课程。我只需要找到一种方法来对项目进行分组。
    • 只使用本文末尾描述的分组:msdn.microsoft.com/en-us/magazine/cc337898.aspx
    • 似乎分组选项只是指定了要组合在一起的特定数量的项目。这对我没有帮助,因为我需要按类别将各种项目组合在一起。例如,第一个部分可能有 4 个项目,接下来的 6 个,等等,因为它来自数据库。
    • 分组允许您在每个组中拥有可变数量的项目。只需指定布局的列数,ListView 模板就会呈现您的绑定控件。
    • 我在 ADO.NET 中做了类似的事情 codersbarn.com/post/2008/10/12/…
    【解决方案4】:

    想象一下这是你的数据结构。不用中继器。

    var list = new Dictionary> { {"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); } }

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2021-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-10
        • 2021-03-11
        • 2010-12-20
        • 2021-11-06
        • 2020-12-21
        相关资源
        最近更新 更多