【问题标题】:Listview: So you think you know itemDataBound?Listview:所以你认为你知道 itemDataBound?
【发布时间】:2010-05-25 03:11:49
【问题描述】:

在我的网页中,我使用以下命令填充列表视图控件

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

【问题讨论】:

  • 内容是否必须在表格中呈现?使用 ol(有序列表)而不是表格将允许浏览器自动为您生成数字。我也很想知道您的数据结构是什么样的,因为您似乎使用 ListView 来表示单行数据。
  • 是的,它们必须显示在一个表格中,(你在这里看到一个简化版本)
  • 所以为了澄清你的数据结构:你有一个返回多个记录的查询,每个记录包含 Ans1、Ans2、Ans3... 和 Ans1Visible、Ans2Visible... 等。然后你有多个表行,每个都包含 6 个项目的列表?只是想更清楚地了解目标。
  • 是的,以上都是真的。
  • 我建议您查看您的数据库的结构。似乎应该更加规范化。如果上级告诉您他们希望将第七个答案添加到列表视图中,您打算怎么做?您将不得不更新您的数据库,并进行代码更改。如果您正确规范化,您可能能够避免这两种变化。我知道这不是您要寻找的答案,但它可能是您的应用程序目前最重要的问题...

标签: asp.net vb.net listview itemdatabound


【解决方案1】:
    <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(有序列表)。然后生成列表元素作为 评估格式字符串。如果您对数字进行硬编码,则它们可能会在项目不可见时显示不正确(可见 = false)。您可以使用 CSS 更改 li 的显示样式

【讨论】:

    【解决方案2】:

    我认为 josephj1989 在正确的路径上,但是缺少您在 cmets 中声明的表格行代码是必需的。

    完整的解决方案是这样的:

    <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++;
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      上述示例的替代方法是在 SQL Select 语句中使用 ROW_NUMBER() 与 Ans 字段进行连接。

      【讨论】:

        【解决方案4】:

        根据您的代码和您想要显示的内容,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>
        

        【讨论】:

        • itemCreated 和 ItemDataBound 不会被触发一次,因为它们是由数据库填充的
        • 根据您的输出,除非您使用此行使记录中的每个标签不可见,否则它们只会被触发一次: Visible = ''。这是怎么回事?
        • 此外,如果此数据来自数据库,则可能有助于查看基础表的结构。我怀疑您可能有一些规范化问题,这可能导致这过于复杂。
        • 列表视图的数据源是一个SQL查询。我无法对 1-6 进行硬编码,因为某些查询为每个 ItemTemplate 返回 2 行,而其他一些查询返回 3、4、5 或 6
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-08
        • 2021-08-18
        • 1970-01-01
        • 1970-01-01
        • 2011-08-23
        • 2019-09-17
        相关资源
        最近更新 更多