Каков наилучший способ показать несколько флажков для нескольких записей в ASP.NET

Ситуация следующая:

У меня есть база данных со многими категориями 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. Я не могу использовать CheckBoxList, поскольку каждый флажок должен содержаться внутри элемента списка неупорядоченного списка. Мне нужно, чтобы разметка была семантически правильной, и я не могу использовать адаптеры управления.

Сначала я представил себе два вложенных ретранслятора: внешний ретранслятор привязан к списку категорий RSS из базы данных, которая отображает заголовок категории и содержит скрытый элемент управления с идентификатором категории, а затем внутренний ретранслятор с RSS-каналами для этой категории.

Как получить доступ к идентификатору категории из элемента управления скрытым полем в родительском ретрансляторе, чтобы я мог искать правильные RSS-каналы?


person Community    schedule 30.01.2009    source источник


Ответы (4)


Я думаю, вы могли бы искать что-то вроде этого:

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();
        }
     }
}
person Phaedrus    schedule 01.02.2009

Если вы не можете использовать CheckBoxList, вам придется обрабатывать значения вручную.

Вы можете вручную .Controls.Add(new LiteralControl("‹/li›‹li›")) между ними, но это немного безвкусно.

Вы можете использовать DataGrid с TemplateColumn, чтобы взломать его, но это не элегантно.

Почему это должно быть в списке? Разве CheckBoxList не обеспечивает необходимую вам функциональность?

Кроме того, попробуйте myCheckBox.Parent.Controls.FindControl("MyHiddenField").Value .

Как получить доступ к идентификатору категории из элемента управления скрытым полем в родительском ретрансляторе, чтобы я мог искать правильные RSS-каналы?

person tsilb    schedule 30.01.2009

У меня есть приложение, в котором мне нужно динамически создавать множество различных элементов управления. Он отлично работает для нескольких флажков (или чего-либо еще в этом отношении).

Во-первых, на странице 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.

Надеюсь это поможет!

person Mark Brittingham    schedule 30.01.2009

Мне нужно, чтобы разметка была семантически правильной, и я не могу использовать адаптеры управления.

Вы имеете в виду эти адаптеры? Если нет, вам следует взглянуть. Вам не обязательно использовать весь набор; Отредактируйте файл .browser, указав только CheckBoxListAdapter. Он должен делать именно то, что вам нужно. Таким образом, вы можете просто взять элемент управления Repeater или ListView и привязать его к списку категорий, а затем поместить внутрь него CheckBoxList.

person Brant Bobby    schedule 31.01.2009