Listview: Так вы думаете, что знаете itemDataBound?

На своей веб-странице я использую следующее для заполнения списка

<asp:ListView ID="ListView1" runat="server">
<layouttemplate>
<asp:PlaceHolder id="itemPlaceholder" runat="server" /></layouttemplate>
<ItemTemplate>
<tr>
            <td><asp:Label ID="Label1" runat="server" Text = '<%# DataBinder.Eval(Container.DataItem, "Ans1") %>' Visible = '<%# DataBinder.Eval(Container.DataItem, "Ans1Visible") %>'></asp:Label>
                <br />
                <asp:Label ID="Label2" runat="server" Text = '<%# DataBinder.Eval(Container.DataItem, "Ans2") %>' Visible = '<%# DataBinder.Eval(Container.DataItem, "Ans2Visible") %>'></asp:Label>
                <br />
                <asp:Label ID="Label3" runat="server" Text = '<%# DataBinder.Eval(Container.DataItem, "Ans3") %>' Visible = '<%# DataBinder.Eval(Container.DataItem, "Ans3Visible") %>'></asp:Label>
                <br />
                <asp:Label ID="Label4" runat="server" Text = '<%# DataBinder.Eval(Container.DataItem, "Ans4") %>' Visible = '<%# DataBinder.Eval(Container.DataItem, "Ans4Visible") %>'></asp:Label>
                <br />
                <asp:Label ID="Label5" runat="server" Text = '<%# DataBinder.Eval(Container.DataItem, "Ans5") %>' Visible = '<%# DataBinder.Eval(Container.DataItem, "Ans5Visible") %>'></asp:Label>
                <br />
                <asp:Label ID="Label6" runat="server" Text = '<%# DataBinder.Eval(Container.DataItem, "Ans6") %>' Visible = '<%# DataBinder.Eval(Container.DataItem, "Ans6Visible") %>'></asp:Label>
           </td>
        </tr>
</ItemTemplate>
</asp:ListView>

Теперь я хотел бы добавить цифры к меткам, прежде чем они будут представлены.

Например, в настоящее время отображаемые данные похожи

Tennis
Football
Basketball
Nfl
Nba
Polo

и вывод, который я хотел бы иметь

1. Tennis
2. Football
3. Basketball
4. Nfl
5. Nba
6. Polo

Могу ли я использовать ListView1_ItemCreated или событие ListView1_ItemDataBound для достижения этой цели? Если это правда, не могли бы вы указать мне, с чего начать?

PS вид списка заполнен

Dt = GetDataTable("SELECT Ans1, Ans2,Ans3,Ans4,Ans5,Ans6, Ans1Visible,Ans2Visible,Ans3Visible,Ans4Visible,Ans5Visible,Ans6Visible, From myTable WHERE CatID ='" & cat & "'")
        ListView1.DataSource = Dt
        ListView1.DataBind()

4 ответа

Решение

Я думаю, что josephj1989 находится на правильном пути, но отсутствует код строки таблицы, который вы указали в своих комментариях.

Полное решение будет примерно таким:

<asp:ListView ID="ListView1" runat="server">
  <LayoutTemplate>
    <asp:PlaceHolder id="itemPlaceholder" runat="server" />
  </LayoutTemplate>
  <ItemTemplate>
    <tr>
      <td>
        <ol>
          <asp:Literal ID="Literal1" runat="server" Text = '<%# Eval("Ans1","<li>{0}</li>") %>' Visible = '<%# Eval("Ans1Visible") %>' />
          <asp:Literal ID="Literal2" runat="server" Text = '<%# Eval("Ans2","<li>{0}</li>") %>' Visible = '<%# Eval("Ans2Visible") %>' />
          <asp:Literal ID="Literal3" runat="server" Text = '<%# Eval("Ans3","<li>{0}</li>") %>' Visible = '<%# Eval("Ans3Visible") %>' />
          <asp:Literal ID="Literal4" runat="server" Text = '<%# Eval("Ans4","<li>{0}</li>) %>' Visible = '<%# Eval("Ans4Visible") %>' />
        </ol>
      </td>
    </tr>
  </ItemTemplate>
</asp:ListView>

Если вы хотите использовать подход OnItemDataBound, следующий обработчик событий будет работать для вас:

protected void lvData_OnItemDataBound(object sender, ListViewItemEventArgs e)
{
    int count = 1;

    foreach (Literal lit in e.Item.Controls.OfType<Literal>())
    {
        if (lit.Visible)
        {
            lit.Text = String.Format("{0}. {1}", count.ToString(), lit.Text);
            count++;
        }
    }
}
    <asp:ListView ID="ListView1" runat="server">
    <layouttemplate>
    <asp:PlaceHolder id="itemPlaceholder" runat="server" /></layouttemplate>
    <ItemTemplate>
    <ol>

<asp:Literal ID="Label1" runat="server" Text = '<%# Eval("Ans1","<li>{0}</li>") %>' Visible = '<%# DataBinder.Eval(Container.DataItem, "Ans1Visible") %>'></asp:Label>

 <asp:Literal ID="Label2" runat="server" Text = '<%# Eval( "Ans2","<li>{0}</li>") %>' Visible = '<%# Eval(Container.DataItem, "Ans2Visible") %>'></asp:Label>

<asp:Literal ID="Label3" runat="server" Text = '<%# DataBinder.Eval("Ans3","<li>{0}</li>") %>' Visible = '<%# DataBinder.Eval(Container.DataItem, "Ans3Visible") %>'></asp:Label>

 <asp:Label ID="Label4" runat="server" Text = '<%# Eval("Ans4","<li>{0}</li>) %>' Visible = '<%# DataBinder.Eval(Container.DataItem, "Ans4Visible") %>'></asp:Label>
</ol>
    </ItemTemplate>
    </asp:ListView>

Вам лучше использовать OL (Упорядоченный список). Затем вы генерируете элементы списка как часть строки формата Eval. Если вы жестко закодировали свои номера, они могут отображаться неправильно, если элементы не видны (visible=false). Вы можете изменить стиль отображения li с помощью CSS

Альтернативой приведенному выше примеру было бы использование конкатата с использованием ROW_NUMBER() в операторе SQL Select с полем Ans.

Исходя из вашего кода и того, что вы хотите отобразить, кажется, что события itemCreated и ItemDataBound будут запускаться только один раз, что будет означать (по крайней мере для меня), что они не будут подходящим местом для добавления этих чисел (если только это не будет 1-6 каждый раз).

Вы уверены, что полностью понимаете, как использовать ListView? Что вы используете в качестве источника данных для этого ListView?

Если вы уверены, что у вас все настроено так, как вы хотите, вы можете просто ввести код 1-6 в разметку:

<tr>
            <td>1:<asp:Label ID="Label1" runat="server" Text = '<%# DataBinder.Eval(Container.DataItem, "Ans1") %>' Visible = '<%# DataBinder.Eval(Container.DataItem, "Ans1Visible") %>'></asp:Label>
                <br />
                2:<asp:Label ID="Label2" runat="server" Text = '<%# DataBinder.Eval(Container.DataItem, "Ans2") %>' Visible = '<%# DataBinder.Eval(Container.DataItem, "Ans2Visible") %>'></asp:Label>
                <br />
                3:<asp:Label ID="Label3" runat="server" Text = '<%# DataBinder.Eval(Container.DataItem, "Ans3") %>' Visible = '<%# DataBinder.Eval(Container.DataItem, "Ans3Visible") %>'></asp:Label>
                <br />
                4:<asp:Label ID="Label4" runat="server" Text = '<%# DataBinder.Eval(Container.DataItem, "Ans4") %>' Visible = '<%# DataBinder.Eval(Container.DataItem, "Ans4Visible") %>'></asp:Label>
                <br />
                5:<asp:Label ID="Label5" runat="server" Text = '<%# DataBinder.Eval(Container.DataItem, "Ans5") %>' Visible = '<%# DataBinder.Eval(Container.DataItem, "Ans5Visible") %>'></asp:Label>
                <br />
                6:<asp:Label ID="Label6" runat="server" Text = '<%# DataBinder.Eval(Container.DataItem, "Ans6") %>' Visible = '<%# DataBinder.Eval(Container.DataItem, "Ans6Visible") %>'></asp:Label>
           </td>
        </tr>
Другие вопросы по тегам