none
如何用datalist控件且不显示top5以后的数据 RRS feed

  • 问题

  • datalist控件用objectdatasource调用的语句是 select * form
     如果让datalist不显示top5以后的数据   前提是不要让我在数据查询句里加top5

    绝不不懂装懂,不因为自己的问题低级而感到不好意思,踏踏实实的虚心学习。
    2009年5月27日 2:47

答案

  • <%@ Page Language="C#" AutoEventWireup="true" Debug="true" EnableEventValidation="true" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <script runat="server">
    
      protected void Page_Load(object sender, EventArgs e)
      {
        DataList1.DataSource = this.CreateDataSourceByXianhuiMeng();
        DataList1.DataBind();
    
        DataList2.DataSource = this.CreateDataSourceByXianhuiMeng();
        DataList2.DataBind();
        DataList3.DataSource = this.CreateDataSourceByXianhuiMeng();
        DataList3.DataBind();
      }
      System.Data.DataView CreateDataSourceByXianhuiMeng()
      {
        System.Data.DataTable dt = new System.Data.DataTable();
        System.Data.DataRow dr;
        dt.Columns.Add(new System.Data.DataColumn("StudentID", typeof(System.String)));
        dt.Columns.Add(new System.Data.DataColumn("学生姓名", typeof(System.String)));
        dt.Columns.Add(new System.Data.DataColumn("语文", typeof(System.Decimal)));
        dt.Columns.Add(new System.Data.DataColumn("数学", typeof(System.Decimal)));
        dt.Columns.Add(new System.Data.DataColumn("英语", typeof(System.Decimal)));
        dt.Columns.Add(new System.Data.DataColumn("计算机", typeof(System.Decimal)));
    
        for (int i = 0; i < 20; i++)
        {
          System.Random rd = new System.Random(Environment.TickCount * i); ;
          dr = dt.NewRow();
          dr[0] = i.ToString();
          dr[1] = "【孟子E章】" + i.ToString();
          dr[2] = System.Math.Round(rd.NextDouble() * 100, 2);
          dr[3] = System.Math.Round(rd.NextDouble() * 100, 2);
          dr[4] = System.Math.Round(rd.NextDouble() * 100, 2);
          dr[5] = System.Math.Round(rd.NextDouble() * 100, 2);
          dt.Rows.Add(dr);
        }
        System.Data.DataView dv = new System.Data.DataView(dt);
        return dv;
      }
    
      protected void DataList2_ItemDataBound(object sender, DataListItemEventArgs e)
      {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
          if (e.Item.ItemIndex > 4)
          {
            e.Item.Controls[0].Visible = false;
          }
        }
      }
    
      protected void DataList3_ItemDataBound(object sender, DataListItemEventArgs e)
      {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
          if (e.Item.ItemIndex > 4)
          {
            Label b = e.Item.FindControl("txt") as Label;
            b.Parent.Controls.Remove(b);
          }
        }
      }
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
      <title></title>
    </head>
    <body>
      <form id="form1" runat="server">
      <asp:DataList ID="DataList1" runat="server">
        <ItemTemplate>
          <%#Container.ItemIndex < 5 ?Eval("学生姓名"):""%>
        </ItemTemplate>
      </asp:DataList>
      <hr />
      <asp:DataList ID="DataList2" runat="server" OnItemDataBound="DataList2_ItemDataBound">
        <ItemTemplate>
          <div>
            <%#Eval("学生姓名")%></div>
        </ItemTemplate>
      </asp:DataList>
      <hr />
      <asp:DataList ID="DataList3" runat="server" 
        OnItemDataBound="DataList3_ItemDataBound">
        <ItemTemplate>
          <asp:Label ID="txt" runat="server"><%#Eval("学生姓名")%></asp:Label>
        </ItemTemplate>
      </asp:DataList>
      </form>
    </body>
    </html>
    

    【孟子E章】
    2009年5月29日 2:19
    版主

全部回复

  • 使用DateIndex判断就可以了
    【孟子E章】
    2009年5月27日 3:36
    版主
  • objectdatasource  getdata 调用的是 什么函数?
    自己在app_code 里面写一个 shared class (static class) 写一个函数代替  在函数里面取前5就好了
    紫柔版主的头像真叫萌得一个不行啊。。。。
    2009年5月27日 3:50
  • 对不起 孟老师 我找不到这个DateIndex  您能不能说的更清楚写 如何用DateIndex


    绝不不懂装懂,不因为自己的问题低级而感到不好意思,踏踏实实的虚心学习。
    2009年5月27日 14:54
  • DataTable fSourceData = this.Employee; // 100 条记录
    DataTable fTargetData = fSourceData.Clone(); // 准备取前 5
    
    // 用 Id 从小到大排序取前 5
    foreach (DataRow fDataRow in fSourceData.Select("", "Id ASC"))
    {
        if (fTargetData.Rows.Count > 5) break;
        fTargetData.Rows.Add(fDataRow.ItemArray);
    }
    
    this.DataList1.DataSource = fTargetData;
    this.DataList1.DataBind();
    2009年5月27日 14:59
    版主

  • Container.DataItemIndex
    【孟子E章】
    2009年5月28日 0:38
    版主
  • DataTable fSourceData = this.Employee; // 100 条记录
    
    DataTable fTargetData = fSourceData.Clone(); // 准备取前 5
    
    
    
    // 用 Id 从小到大排序取前 5
    
    foreach (DataRow fDataRow in fSourceData.Select("", "Id ASC"))
    
    {
    
        if (fTargetData.Rows.Count > 5) break;
    
        fTargetData.Rows.Add(fDataRow.ItemArray);
    
    }
    
    
    
    this.DataList1.DataSource = fTargetData;
    
    this.DataList1.DataBind();
    
    



    objectdatasource 可不能这么用 需要变个形

    在 app_code  加入 top5.cs

            [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select)]
             public myDatarow[] GetTop5(MyDataTable tbl, string orderby)
            {
                myDatarow[] rv = new myDatarow[4];

                Array.Copy(tbl.Select(string.Empty, orderby), rv, 5);
                return rv;
            }


    这样编译后 ods  就可以找到   gettop5  这个函数绑定


    紫柔版主的头像真叫萌得一个不行啊。。。。
    2009年5月28日 2:30
  • 孟老师 我已经知道 在控件上加入 <%# this.DataList5.Items.Count + 1%>  它产生了自动序号 但是我还是没明白您说的怎么判断下   可否详解   谢谢


    同时谢谢 回复该帖的各位大大  谢谢。


    绝不不懂装懂,不因为自己的问题低级而感到不好意思,踏踏实实的虚心学习。
    2009年5月29日 1:41
  • <%@ Page Language="C#" AutoEventWireup="true" Debug="true" EnableEventValidation="true" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <script runat="server">
    
      protected void Page_Load(object sender, EventArgs e)
      {
        DataList1.DataSource = this.CreateDataSourceByXianhuiMeng();
        DataList1.DataBind();
    
        DataList2.DataSource = this.CreateDataSourceByXianhuiMeng();
        DataList2.DataBind();
        DataList3.DataSource = this.CreateDataSourceByXianhuiMeng();
        DataList3.DataBind();
      }
      System.Data.DataView CreateDataSourceByXianhuiMeng()
      {
        System.Data.DataTable dt = new System.Data.DataTable();
        System.Data.DataRow dr;
        dt.Columns.Add(new System.Data.DataColumn("StudentID", typeof(System.String)));
        dt.Columns.Add(new System.Data.DataColumn("学生姓名", typeof(System.String)));
        dt.Columns.Add(new System.Data.DataColumn("语文", typeof(System.Decimal)));
        dt.Columns.Add(new System.Data.DataColumn("数学", typeof(System.Decimal)));
        dt.Columns.Add(new System.Data.DataColumn("英语", typeof(System.Decimal)));
        dt.Columns.Add(new System.Data.DataColumn("计算机", typeof(System.Decimal)));
    
        for (int i = 0; i < 20; i++)
        {
          System.Random rd = new System.Random(Environment.TickCount * i); ;
          dr = dt.NewRow();
          dr[0] = i.ToString();
          dr[1] = "【孟子E章】" + i.ToString();
          dr[2] = System.Math.Round(rd.NextDouble() * 100, 2);
          dr[3] = System.Math.Round(rd.NextDouble() * 100, 2);
          dr[4] = System.Math.Round(rd.NextDouble() * 100, 2);
          dr[5] = System.Math.Round(rd.NextDouble() * 100, 2);
          dt.Rows.Add(dr);
        }
        System.Data.DataView dv = new System.Data.DataView(dt);
        return dv;
      }
    
      protected void DataList2_ItemDataBound(object sender, DataListItemEventArgs e)
      {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
          if (e.Item.ItemIndex > 4)
          {
            e.Item.Controls[0].Visible = false;
          }
        }
      }
    
      protected void DataList3_ItemDataBound(object sender, DataListItemEventArgs e)
      {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
          if (e.Item.ItemIndex > 4)
          {
            Label b = e.Item.FindControl("txt") as Label;
            b.Parent.Controls.Remove(b);
          }
        }
      }
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
      <title></title>
    </head>
    <body>
      <form id="form1" runat="server">
      <asp:DataList ID="DataList1" runat="server">
        <ItemTemplate>
          <%#Container.ItemIndex < 5 ?Eval("学生姓名"):""%>
        </ItemTemplate>
      </asp:DataList>
      <hr />
      <asp:DataList ID="DataList2" runat="server" OnItemDataBound="DataList2_ItemDataBound">
        <ItemTemplate>
          <div>
            <%#Eval("学生姓名")%></div>
        </ItemTemplate>
      </asp:DataList>
      <hr />
      <asp:DataList ID="DataList3" runat="server" 
        OnItemDataBound="DataList3_ItemDataBound">
        <ItemTemplate>
          <asp:Label ID="txt" runat="server"><%#Eval("学生姓名")%></asp:Label>
        </ItemTemplate>
      </asp:DataList>
      </form>
    </body>
    </html>
    

    【孟子E章】
    2009年5月29日 2:19
    版主
  • 另请询问下孟老师

    和在数据集里加入一条top5查询相比    加查询和用上面的方法 那个性能更好些 


    是否数据量大的时候top5更节省资源  还是  Container.ItemIndex 更节省资源  


    我的原意为 因为数据集里有一个 select *   且*正被其他控件调用   我正好要其top5  我想在不增加数据集的情况下 直接使用* 在显示上控制下 以节省资源   不知道我的想法是否合理


    谢谢孟老师的解答



    绝不不懂装懂,不因为自己的问题低级而感到不好意思,踏踏实实的虚心学习。
    2009年5月29日 2:50
  • 数据多时,最好选择在 SQL 中加入 Top5,这样可以避免对不显示行的处理
    知识改变命运,奋斗成就人生!
    2009年5月29日 2:55
    版主
  • 另请询问下各位老师

    和在数据集里加入一条top5查询相比    加查询和用上面的方法 那个性能更好些 


    是否数据量大的时候top5更节省资源  还是  Container.ItemIndex 更节省资源  


    我的原意为 因为数据集里有一个 select *   且*正被其他控件调用   我正好要其top5  我想在不增加数据集的情况下 直接使用* 在显示上控制下 以节省资源   不知道我的想法是否合理


    谢谢孟老师的解答   谢谢X.X.Y



    绝不不懂装懂,不因为自己的问题低级而感到不好意思,踏踏实实的虚心学习。
    2009年5月29日 3:02
  • 你好,资源共用当然是很好想法咯, 但我觉得在这个问题上没有必要花太多时间来处理它再拖放一个 Top 5的过来绑定就好了,另外还有一个问题,最好不要用 Select * ,可以改为 Select Col1, Col2... 因为在数据量大时,Select * 和 Select 其中一部分列之间的效率是非常明显
    知识改变命运,奋斗成就人生!
    2009年5月29日 3:30
    版主
  • 谢谢X.X.Y    知道了


    绝不不懂装懂,不因为自己的问题低级而感到不好意思,踏踏实实的虚心学习。
    2009年5月29日 5:29