【问题标题】:What's the best way to show multiple checkboxes for multiple records in ASP.NET在 ASP.NET 中显示多个记录的多个复选框的最佳方法是什么
【发布时间】:2010-10-04 14:04:52
【问题描述】:

情况如下:

我有一个包含许多 RSS 类别的数据库,而这些类别又包含许多 RSS 提要。我想以下列方式显示它们:

RSS Category 1
 [ ] Rss Feed 1
 [ ] Rss Feed 2
 [ ] Rss Feed 3

RSS Category 2
 [ ] Rss Feed 1
 [ ] Rss Feed 2
 [ ] Rss Feed 3

其中 [ ] 表示复选框。

因此,每个 RSS Feed 都会根据父 RSS 类别的 id 从数据库中提取出来。我不能使用 CheckBoxList,因为每个复选框都必须包含在无序列表列表项中。我需要标记在语义上正确并且不能使用控制适配器。

我最初设想了两个嵌套转发器,外部一个数据绑定到数据库中的 RSS 类别列表,该列表显示类别标题并包含一个具有类别 ID 的隐藏控件,然后是一个内部转发器,其中包含该类别的 RSS 提要。

如何从父转发器中的隐藏字段控件访问类别 ID,以便查找正确的 RSS 源?

【问题讨论】:

    标签: asp.net checkbox repeater


    【解决方案1】:

    我想你可能正在寻找这样的东西:

    ASPX:

    <asp:Repeater ID="rptOuter" runat="server" OnItemDataBound="rptOuter_ItemDataBound">
            <HeaderTemplate>
                <ul style="list-style-type: none">
            </HeaderTemplate>
            <ItemTemplate>
                <li id='<%# Eval("Id") %>'>
                <%# Eval("Category") %>
                <asp:Repeater ID="rptInner" runat="server">
                    <HeaderTemplate>
                        <ul style="list-style-type: none">
                    </HeaderTemplate>
                    <ItemTemplate>
                        <li>
                            <asp:CheckBox ID="chkFeed" runat="server" Text='<%# Eval("Feed") %>' />
                        </li>
                    </ItemTemplate>
                    <FooterTemplate>
                        </ul>
                    </FooterTemplate>
                </asp:Repeater>
                </li>
            </ItemTemplate>
            <FooterTemplate>
                </ul>
            </FooterTemplate>
    </asp:Repeater>
    

    代码背后:

    protected void Page_Load(object sender, EventArgs e)
    {
        using (SqlConnection conn = new SqlConnection(connString))
        {
            conn.Open();
            SqlCommand cmd = new SqlCommand("SELECT id, category FROM rsscategory_tbl", conn);
            SqlDataReader rdr = cmd.ExecuteReader();
            this.rptOuter.DataSource = rdr;
            this.rptOuter.DataBind();
            rdr.Close();
        }
    }
    
    protected void rptOuter_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item ||
            e.Item.ItemType == ListItemType.AlternatingItem)
        {            
            using (SqlConnection conn = new SqlConnection(connString))
            {
                conn.Open();
                System.Data.Common.DbDataRecord rd = (System.Data.Common.DbDataRecord)e.Item.DataItem;
                SqlCommand cmd = new SqlCommand("SELECT feed FROM rssfeed_tbl WHERE categoryid = " + rd.GetInt32(rd.GetOrdinal("id")), conn);
                Repeater rptInner = (Repeater)e.Item.FindControl("rptInner");
                SqlDataReader rdr = cmd.ExecuteReader();
                rptInner.DataSource = rdr;
                rptInner.DataBind();
                rdr.Close();
            }
         }
    }
    

    【讨论】:

      【解决方案2】:

      我需要标记在语义上正确并且不能使用控制适配器。

      你指的是these adapters吗?如果没有,你应该看看。您不必使用整套;编辑您的 .browser 文件以仅指定 CheckBoxListAdapter。它应该完全满足您的需求。这样,您可以简单地使用 RepeaterListView 控件并将其数据绑定到类别列表,然后将 CheckBoxList 放入其中。

      【讨论】:

        【解决方案3】:

        我有一个应用程序,我需要在其中动态创建各种不同的控件。它适用于多个复选框(或其他任何东西)。

        首先,在您的 ASPX 页面上,放置“PlaceHolder”控件:

        <asp:PlaceHolder runat="server" id="CtrlCanvas" />
        

        现在,在您的代码中,动态创建您的控件:

        Label aLbl = new Label {Text = "Prompt: ", ID = ("WSLabel" + counter++)};
        CtrlCanvas.Controls.Add(aLbl);
        

        那是一个标签,这里是一个文本框:

        TextBox aBox = new TextBox {ID = "XTest1", Columns = 5, Text = " ", Width = 50};
        CtrlCanvas.Controls.Add(aBox);
        aBox.Focus();
        

        这是一个单选框列表:

        RadioButtonList WRRadio = new RadioButtonList { ID = "XTestRadioList1" };
        WRRadio.Items.Add("Walking  &nbsp; ");
        WRRadio.Items.Add("Running");
        WRRadio.SelectedIndex = WalkRun;
        WRRadio.RepeatColumns = 2;
        CtrlCanvas.Controls.Add(WRRadio);
        

        这就是创建控件的全部内容。要获取这些值,您需要有一个命名约定,以允许您识别 ASP.NET 放在控件上的前缀。我使用“XTest”。这是一个例子:

        foreach (string aStr in Form.AllKeys)
        {
            int position = aStr.IndexOf("XTest");  // XTest is used in my controls
            if (position > 0)
            {
                // Get the *prefix* added by ASP.NET
                CtlPrefix = aStr.Substring(0, position);
                break;
            }
         }
        

        现在要获取存储在特定控件中的值很容易:

         string result = Form.Get(CtlPrefix + "XTest1")
        

        至少对于单选框,Get 返回选定的索引。我想你会分别为每个复选框命名,这样你就可以检查 0 或 1。

        希望这会有所帮助!

        【讨论】:

          【解决方案4】:

          如果您不能使用 CheckBoxList,则必须手动处理这些值。

          您可以在它们之间手动 .Controls.Add(new LiteralControl("

        • ")) ,但这有点俗气。

          您可以使用带有 TemplateColumn 的 DataGrid 来破解它,但这并不优雅。

          为什么需要在列表中? CheckBoxList 没有提供您需要的功能吗?

          另外,试试 myCheckBox.Parent.Controls.FindControl("MyHiddenField").Value 。

          如何从父转发器中的隐藏字段控件访问类别 ID,以便查找正确的 RSS 源?

        • 【讨论】:

            猜你喜欢
            • 2015-01-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多