1

情况如下:

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

4 回答 4

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();
        }
     }
}
于 2009-02-01T03:42:34.907 回答
0

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

您可以在它们之间手动 .Controls.Add(new LiteralControl("</li><li>")) ,但这有点俗气。

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

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

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

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

于 2009-01-30T22:01:06.123 回答
0

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

首先,在您的 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。

希望这可以帮助!

于 2009-01-30T22:27:12.250 回答
0

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

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

于 2009-01-31T05:34:56.083 回答