在ASP.NET中显示多个记录的多个复选框的最佳方法是什么

时间:2009-01-30 21:48:51

标签: asp.net checkbox repeater

情况如下:

我有一个包含许多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源?

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

你可以在他们之间手动.Controls.Add(新的LiteralControl(“&lt; / li&gt;&lt; li&gt;”)),但这有点俗气。

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

为什么需要列入清单? CheckBoxList不提供您需要的功能吗?

另外,试试myCheckBox.Parent.Controls.FindControl(“MyHiddenField”)。值。

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

答案 2 :(得分:0)

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

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

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

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

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

这是一个标签,这是一个TextBox:

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。

希望这有帮助!

答案 3 :(得分:0)

  

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

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