比如我有数据
Name   Sale    Date
小五   1000    2007-10-1
小五   2000    2007-10-2
小五   3000    2007-10-3
小李   1000    2007-10-3
小五   3000    2007-10-4然后我要绑定成
-----------------------------------------
|Name |  Sale  |  Date
|-------------------------------------
|小五 | 1000   | 2007-10-1
|     |--------|------------------------------
|     | 2000   | 2007-10-2
|     |--------|-------------------------
|     | 3000   | 2007-10-3
|-----|--------|-----------------------
|小李 | 1000   | 2007-10-3
------|--------|-----------------------
|小五 | 3000   | 2007-10-4
------|--------|------------------------
这里主要就是小五上面那那几行,也就是说如果在一起的行的Name是一样的话那行就Rollspan掉他们只留一个
这里如果是显示成
-----------------------------------------
|Name |  Sale  |  Date
|-------------------------------------
|小五 | 1000   | 2007-10-1
|-----|--------|------------------------------
|     | 2000   | 2007-10-2
|-----|--------|-------------------------
|     | 3000   | 2007-10-3
|-----|--------|-----------------------
|小李 | 1000   | 2007-10-3
------|--------|-----------------------
|小五 | 3000   | 2007-10-4
------|--------|------------------------
这样的话我就还有办法
但上面那样子实在想不出什么办法来谢谢

解决方案 »

  1.   

    估计这种需求用GridView实现有点困难
    能不能改用Table控件  然后合并行来解决?
      

  2.   

    这个比较困难喔..用Repeater试试..这个可以自定义表格
      

  3.   

    up 
    普通绑定好之后
    你判断上一行的name如果和本行的相同 
    本行name替换成空
    加一函数就可以绕过去
      

  4.   

    貌似DataSet的关系表可以解决这个问题,具体没涉及过。
    严重
      

  5.   

    zhchg6666() ( ) 信誉:100  2007-08-21 10:58:47  得分: 0  
    up 
    普通绑定好之后
    你判断上一行的name如果和本行的相同 
    本行name替换成空
    加一函数就可以绕过去
    ------------------------------------------------------------
    我做过BI,
    在reporting里常遇到这种情况,
    具体的做法就是和zhchg6666想的一样。就是在每个显示内容上加个时间。
    判断是否和上一行一样。
    如果一样显示为空。  
     
      

  6.   

    可以实现:
    当绑定数据之后,再调用一个自定义的函数,就叫BindSet()吧.
    BindSet()
    {
      string strTemp="";
      foreach(遍历GridView,取得name列)
      {
            if(strTemp=="当前name")
             {
               设置name.text="";
             }
            strTemp="上一个name"  }
    }
    基本思路是这样.这样会损失一点效率.
    还有其它方法,我要去吃饭了,不详细写了.
      

  7.   

    // DEMO<%@ Page Language="C#" %>
    <%@ Import Namespace="System.Data" %><%-- http://community.csdn.net/Expert/TopicView3.asp?id=5720389 --%><!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)
        {
            if (!IsPostBack) {
                LoadProductData();
            }
        }  
        
        void LoadProductData()
        {
            DataTable dt = CreateSampleProductData();        GridView1.DataSource = dt;
            GridView1.DataBind();        
        }    #region sample data    static DataTable CreateSampleProductData()
        {
            DataTable tbl = new DataTable("Products");        tbl.Columns.Add("ProductID", typeof(int));
            tbl.Columns.Add("ProductName", typeof(string));        
            tbl.Columns.Add("UnitPrice", typeof(decimal));
            tbl.Columns.Add("CategoryID", typeof(int));        tbl.Rows.Add(1, "Chai", 18, 1);
            tbl.Rows.Add(2, "Chang", 19, 1);
            tbl.Rows.Add(3, "Aniseed Syrup", 10, 2);
            tbl.Rows.Add(4, "Chef Anton's Cajun Seasoning", 22, 2);
            tbl.Rows.Add(5, "Chef Anton's Gumbo Mix", 21.35, 2);
            tbl.Rows.Add(47, "Zaanse koeken", 9.5, 3);
            tbl.Rows.Add(48, "Chocolade", 12.75, 3);
            tbl.Rows.Add(49, "Maxilaku", 20, 3);        return tbl;
        }    #endregion 
      
        int toMergedRows = 1;    
        protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if(e.Row.RowType == DataControlRowType.DataRow && e.Row.RowIndex > 0) {
                DataRowView currentRowView = e.Row.DataItem as DataRowView;
                DataView dv = currentRowView.DataView;
                if((int)currentRowView["CategoryId"] == (int)dv[e.Row.DataItemIndex - 1]["CategoryId"]) {
                    toMergedRows++;
                }
                else {
                    GridView1.Rows[e.Row.RowIndex - toMergedRows].Cells[0].RowSpan = toMergedRows;
                    for(int ndx = e.Row.RowIndex - toMergedRows + 1; ndx < e.Row.RowIndex; ndx++) {
                        GridView1.Rows[ndx].Cells.RemoveAt(0);
                    }
                    toMergedRows = 1;
                }            // 已到最后一行
                if(e.Row.DataItemIndex == dv.Count - 1 && toMergedRows !=1) {
                    GridView1.Rows[e.Row.RowIndex - toMergedRows + 1].Cells[0].RowSpan = toMergedRows;
                    for(int ndx = e.Row.RowIndex - toMergedRows + 2; ndx < e.Row.RowIndex; ndx++) {
                        GridView1.Rows[ndx].Cells.RemoveAt(0);
                    }                
                    e.Row.Cells.RemoveAt(0);
                }
            }
        }
    </script><html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>CSDN_MergeGridViewRow2</title>
       
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
           
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" OnRowDataBound="GridView1_RowDataBound">
                <Columns> 
                    <asp:BoundField DataField="CategoryID" HeaderText="CategoryID" />
                    <asp:BoundField DataField="ProductName" HeaderText="ProductName" />
                    <asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice" />
                </Columns>
            </asp:GridView>
           
            </div>
            
        </form>
    </body>
    </html>
      

  8.   

    GridView inside GridView 会方便一点,此类型文章在CodeProject看过
      

  9.   

    这个只要在gridview里或是在datalist里嵌套一个gridview就可以实现了