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 フィードは、親 RSS カテゴリの ID に応じてデータベースから取り出されます。各チェックボックスは順序付けされていないリスト項目内に含まれている必要があるため、CheckBoxList を使用できません。意味的に正しいマークアップが必要で、コントロール アダプターを使用できません。

最初は、ネストされた 2 つのリピータを想像しました。外側のリピータは、カテゴリ ヘッダーを表示し、カテゴリ ID を持つ非表示のコントロールを含むデータベースから RSS カテゴリのリストにデータバインドされ、次に、そのカテゴリの 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

さまざまな異なるコントロールを動的に作成する必要があるアプリケーションがあります。複数のチェックボックス(またはそれ以外のもの)に対しては正常に機能します。

まず、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 をチェックできるように、各チェック ボックスに個別に名前を付けると思います。

お役に立てれば!

于 2009-01-30T22:27:12.250 に答える
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

意味的に正しいマークアップが必要で、コントロール アダプターを使用できません。

これらのアダプターについて言及していますか? そうでない場合は、見てみる必要があります。セット全体を使用する必要はありません。.browser ファイルを編集して、.browser ファイルのみを指定しますCheckBoxListAdapter。それはまさにあなたが必要とすることをするべきです。このようにして、RepeaterまたはListViewコントロールを取得してカテゴリのリストにデータバインドし、そのCheckBoxList中に a を配置するだけです。

于 2009-01-31T05:34:56.083 に答える