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 для достижения этой цели? Если это правда, не могли бы вы указать мне место для начала?

P.S. представление списка заполнено

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()

person OrElse    schedule 24.05.2010    source источник
comment
Должен ли контент отображаться в таблице? Использование ol (упорядоченного списка) вместо таблицы позволит браузеру автоматически генерировать числа для вас. Мне также было бы интересно узнать, как выглядит ваша структура данных, поскольку кажется, что вы используете ListView для представления одной строки данных.   -  person GShenanigan    schedule 24.05.2010
comment
Да, они должны отображаться в таблице (здесь вы видите упрощенную версию)   -  person OrElse    schedule 24.05.2010
comment
Итак, чтобы уточнить вашу структуру данных: у вас есть запрос, который возвращает несколько записей, каждая из которых содержит Ans1, Ans2, Ans3... и Ans1Visible, Ans2Visible... и т. д. Затем у вас есть несколько строк таблицы, каждая из которых содержит этот список из 6 Предметы? Просто пытаюсь получить более четкое представление о цели.   -  person GShenanigan    schedule 24.05.2010
comment
Да, все вышесказанное верно.   -  person OrElse    schedule 24.05.2010
comment
Я бы рекомендовал посмотреть, как у вас структурирована база данных. Кажется, что это должно быть более нормализовано. Что вы планируете делать, если начальство скажет вам, что они хотят добавить седьмой ответ в представление списка? Вам нужно будет обновить свою БД и внести изменения в код. Если вы правильно нормализуете, вы сможете избежать обоих этих изменений. Я знаю, что это не тот ответ, который вы ищете, но это может быть самая важная проблема с вашим приложением прямо сейчас...   -  person Abe Miessler    schedule 24.05.2010
comment
Также кажется, что может быть уязвимость SQL Injection, основанная на опубликованном вами коде, который использует функцию GetDataTable.   -  person Abe Miessler    schedule 24.05.2010


Ответы (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++;
        }
    }
}
person sgriffinusa    schedule 24.05.2010

    <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

person josephj1989    schedule 24.05.2010

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

person websch01ar    schedule 24.05.2010

На основе вашего кода и того, что вы хотите отобразить, кажется, что события 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>
person Abe Miessler    schedule 24.05.2010
comment
ItemCreated и ItemDataBound не запускаются один раз, так как они заполняются базой данных. - person OrElse; 24.05.2010
comment
Основываясь на вашем выводе, они запускаются только один раз, если вы не сделаете каждую метку в записи невидимой с помощью этой строки: Visible = '‹%# DataBinder.Eval(Container.DataItem, Ans1Visible) %›'. Это то, что происходит? - person Abe Miessler; 24.05.2010
comment
Кроме того, если эти данные поступают из базы данных, это может помочь увидеть структуру базовых таблиц. Я подозреваю, что у вас могут быть некоторые проблемы с нормализацией, из-за которых это может быть слишком сложным. - person Abe Miessler; 24.05.2010
comment
Источником данных представления списка является SQL-запрос. Я не могу жестко закодировать 1-6, так как некоторые запросы возвращают 2 строки для каждого ItemTemplate и некоторые другие 3, 4, 5 или 6 - person OrElse; 24.05.2010