Какой лучший способ показать несколько флажков для нескольких записей в ASP.NET - PullRequest
1 голос
/ 31 января 2009

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

У меня есть база данных со многими категориями 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-каналы?

Ответы [ 4 ]

2 голосов
/ 01 февраля 2009

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

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();
        }
     }
}
0 голосов
/ 31 января 2009

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

Сначала на странице 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.

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

0 голосов
/ 31 января 2009

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

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

0 голосов
/ 31 января 2009

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

Вы можете вручную .Controls.Add (новый LiteralControl ("

")) между ними, но это немного липко.

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

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

Также попробуйте myCheckBox.Parent.Controls.FindControl («MyHiddenField»). Значение.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...