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

What's the best way to show multiple checkboxes for multiple records in ASP.NET

情况如下:

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

1
2
3
4
5
6
7
8
9
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提要都会根据父RSS类别的ID从数据库中拉出。我不能使用复选框列表,因为每个复选框必须包含在无序列表项中。我需要标记在语义上是正确的,并且不能使用控制适配器。

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

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


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

ASPX:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
        <HeaderTemplate>
            <ul style="list-style-type: none">
        </HeaderTemplate>
        <ItemTemplate>
            <li id='<%# Eval("Id") %>'>
            <%# Eval("Category") %>
           
                <HeaderTemplate>
                    <ul style="list-style-type: none">
                </HeaderTemplate>
                <ItemTemplate>
                   
<li>

                        ' />
                   
</li>

                </ItemTemplate>
                <FooterTemplate>
                   
</ul>

                </FooterTemplate>
            </asp:Repeater>
           
</li>

        </ItemTemplate>
        <FooterTemplate>
           
</ul>

        </FooterTemplate>
</asp:Repeater>

代码落后:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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();
        }
     }
}

I need the markup to be semantically correct and cant use the Control Adapters.

您指的是这些适配器吗?如果没有,你应该看看。您不必使用整个集合;编辑.browser文件只指定CheckBoxListAdapter。它应该完全满足你的需要。这样,您就可以简单地使用RepeaterListView控件,并将其数据绑定到类别列表中,然后将CheckBoxList放在其中。


我有一个应用程序需要动态地创建各种不同的控件。它对于多个复选框(或其他任何相关内容)都可以正常工作。

首先,在ASPX页面上,放置"placeholder"控件:

1
 

现在,在代码隐藏中,动态创建控件:

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

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

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

这是一个收音盒列表:

1
2
3
4
5
6
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"。下面是一个例子:

1
2
3
4
5
6
7
8
9
10
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;
    }
 }

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

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

对于单选框,get至少返回所选索引。我想您将分别为每个复选框命名,这样您就可以选中0或1。

希望这有帮助!


如果不能使用复选框列表,则必须手动处理这些值。

您可以手动.controls.add(new literalcontrol("

  • ")他们之间,但这有点俗气。

    你可以使用一个带有模板列的数据报来侵入它,但这并不优雅。

    为什么这需要在列表中?复选框列表是否提供了您需要的功能?

    另外,尝试mycheckbox.parent.controls.findcontrol("myHiddenField").value。

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