本帖最后由 lc163 于 2012-03-29 23:18:04 编辑

解决方案 »

  1.   


    /// <summary>
            /// 合并行(合并的列要用Label控件)
            /// </summary>
            /// <param name="gvw">需要合并的GridView</param>
            /// <param name="sCol">要合并的列(从0开始)</param>
            /// <param name="controlName">控件名称</param>
            public static void MergeRows(GridView gvw, int col, string controlName)
            {
                for (int rowIndex = gvw.Rows.Count - 2; rowIndex >= 0; rowIndex--)
                {
                    GridViewRow row = gvw.Rows[rowIndex];                GridViewRow previousRow = gvw.Rows[rowIndex + 1];                Label row_lbl = row.Cells[col].FindControl(controlName) as Label;
                    Label previousRow_lbl = previousRow.Cells[col].FindControl(controlName) as Label;                if (row_lbl != null && previousRow_lbl != null)
                    {
                        if (row_lbl.Text == previousRow_lbl.Text)
                        {
                            row.Cells[col].RowSpan = previousRow.Cells[col].RowSpan < 1 ? 2 : previousRow.Cells[col].RowSpan + 1;                        previousRow.Cells[col].Visible = false;
                        }
                    }
                }
            }
    <asp:GridView ID="gvUVSourceDistributionStatistic" runat="server" AutoGenerateColumns="false" CssClass="tableBorder" 
            onmouseover="changeto()" onmouseout="changeback()" Width="98%" HorizontalAlign="Center">
            <Columns>
                <asp:TemplateField HeaderText="日期" ItemStyle-HorizontalAlign="Center" HeaderStyle-Height="30"
                    ItemStyle-Height="25">
                    <ItemTemplate>
                        <asp:Label ID="lblSearchDate" runat="server" Text='<%# Convert.ToDateTime(Eval("SearchDate")).ToString("yyyy-MM-dd") %>' />
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:BoundField HeaderText="访客来源" DataField="VisitorSource" ItemStyle-HorizontalAlign="Center"/>
            </Columns>    
        </asp:GridView>调用MergeRows方法要在绑定GridView后调用,这样就能解决了。
    不过我也有个疑问:为什么不用控件包着要合并的列的话,遍历GridView的每一行时会显示要合并的列的单元格的值是空,如果不为空就不需要用控件来包着了,知道为什么的,告诉一声,谢谢
      

  2.   

    这样的页面最好用table来做,然后ajax去后台取数据这样的灵活性大一点。
      

  3.   


    原始样式
    姓名 照片 性别 出生年月 其它列1 其它列2 其它列3
    A    P    M    XXXX    O1      O2      O3
    A    P    M    XXXX    O4      O5      O6
    A    P    M    XXXX    O7      O8      O9
    B    P2   F    YYYY    10      11      12
    B    P2   F    YYYY    13      14      15
    B    P2   F    YYYY    16      17      18
    需求样式
    姓名 照片 性别 出生年月 其它列1 其它列2 其它列3
                           O1      O2      O3
    A    P    M    XXXX    O4      O5      O6
                           O7      O8      O9
                           10      11      12
    B    P2   F    YYYY    13      14      15
                           16      17      18
                           19      20      21
    C    P3   F    ZZZZ    22      23      24
                           25      26      27
      

  4.   


    原始样式
    姓名 照片 性别 出生年月 其它列1 其它列2 其它列3
    A    P    M    XXXX    O1      O2      O3
    A    P    M    XXXX    O4      O5      O6
    A    P    M    XXXX    O7      O8      O9
    B    P2   F    YYYY    10      11      12
    B    P2   F    YYYY    13      14      15
    B    P2   F    YYYY    16      17      18
    C    P3   F    ZZZZ    19      20      21
    C    P3   F    ZZZZ    22      23      24
    C    P3   F    ZZZZ    25      26      27需求样式
    姓名 照片 性别 出生年月 其它列1 其它列2 其它列3
                           O1      O2      O3
    A    P    M    XXXX    O4      O5      O6
                           O7      O8      O9
                           10      11      12
    B    P2   F    YYYY    13      14      15
                           16      17      18
                           19      20      21
    C    P3   F    ZZZZ    22      23      24
                           25      26      27
    请忽略5楼!
      

  5.   

    请问table如何做?另外效果请看5楼,比如可能性别这列相邻的两个都相同,但是也要分开合并
      

  6.   


        protected void Page_Load(object sender, EventArgs e)
        {
    //...
            GridView1.DataSource = dt;
            GridView1.DataBind();
            GroupName(0);
            GroupName(1);
            GroupName(3);
            GroupSex();
        }
        public void GroupName(int col)
        {
            TableCell oldName = GridView1.Rows[0].Cells[col];
            for (int i = 1; i < GridView1.Rows.Count; i++)
            {
                TableCell Name = GridView1.Rows[i].Cells[col];
                if (oldName.Text == Name.Text)
                {
                    Name.Visible = false;
                    if (oldName.RowSpan == 0)
                    {
                        oldName.RowSpan = 1;
                    }
                    oldName.RowSpan++;
                    oldName.VerticalAlign = VerticalAlign.Middle;
                }
                else
                {
                    oldName = Name;
                }
            }
        }
        public void GroupSex()
        {
            TableCell oldName = GridView1.Rows[0].Cells[0];
            TableCell oldSex = GridView1.Rows[0].Cells[2];
            for (int i = 1; i < GridView1.Rows.Count; i++)
            {
                TableCell Name = GridView1.Rows[i].Cells[0];
                TableCell Sex = GridView1.Rows[i].Cells[2];
                if (oldName.Text == Name.Text && oldSex.Text == Sex.Text)
                {
                    Sex.Visible = false;
                    if (oldSex.RowSpan == 0)
                    {
                        oldSex.RowSpan = 1;
                    }
                    oldSex.RowSpan++;
                    oldSex.VerticalAlign = VerticalAlign.Middle;
                }
                else
                {
                    oldName = Name;
                    oldSex = Sex;
                }
            }
        }
      

  7.   

    其他列的行数可能更多,例如原始样式
    姓名 照片 性别 出生年月 其它列1 其它列2 其它列3
    A    P    M    XXXX     O1      O2      O3
    A    P    M    XXXX     O4      O5      O6
    A    P    M    XXXX     O7      O8      O9
    A    P    M    XXXX     10      11      12
    ---------------------------------------------
    B    P2   F    YYYY     13      14      15
    B    P2   F    YYYY     16      17      18
    B    P2   F    YYYY     19      20      21
    ---------------------------------------------
    C    P2   F    ZZZZ     22      23      24
    C    P2   F    ZZZZ  25      26      27
    C    P2   F    ZZZZ     28 29      30
    C    P2   F    ZZZZ  31      32      33
    C    P2   F    ZZZZ     34 35      36
    需求样式
    姓名 照片 性别 出生年月 其它列1 其它列2 其它列3
                           O1      O2      O3
    A    P    M    XXXX    O4      O5      O6
                           O7      O8      O9
                           10      11      12
    ----------------------------------------------
                           13      14      15
    B    P2    F    YYYY   16      17      18
                           19      20      21
    ----------------------------------------------
                           22      23      24
                           25      26      27
    C    P2    F    ZZZZ   28 29      30
                           31      32      33
                           34 35      36因为允许不上传照片,所以可能会出现相邻两人都没照片的情况
      

  8.   


    原始样式
    姓名 照片 性别 出生年月 其它列1 其它列2 其它列3
    A    P    M  XXXX     O1      O2      O3
    A    P    M  XXXX     O4      O5      O6
    A    P    M  XXXX     O7      O8      O9
    A    P    M  XXXX     10      11      12
    ---------------------------------------------
    B    P2   F  YYYY     13      14      15
    B    P2   F  YYYY     16      17      18
    B    P2   F  YYYY     19      20      21
    ---------------------------------------------
    C    P2   F  ZZZZ     22      23      24
    C    P2   F  ZZZZ     25      26      27
    C    P2   F  ZZZZ     28      29      30
    C    P2   F  ZZZZ     31      32      33
    C    P2   F  ZZZZ     34      35      36
    需求样式
    姓名 照片 性别 出生年月 其它列1 其它列2 其它列3
                         O1      O2      O3
    A    P    M  XXXX    O4      O5      O6
                         O7      O8      O9
                         10      11      12
    ----------------------------------------------
                         13      14      15
    B    P2   F  YYYY    16      17      18
                         19      20      21
    ----------------------------------------------
                         22      23      24
                         25      26      27
    C    P2   F  ZZZZ    28      29      30
                         31      32      33
                         34      35      36
      

  9.   

    在合并的过程中,有一些列需做些特殊的处理,如你提到的照片的情况,没上传,是空或null,在代码中判断出来,合并处理。
      

  10.   

    repeater多么好多么方便 哎你说你````
      

  11.   

    8楼不可以?
    其他列数目不一定,你又不用合并那个其他列.可以不用管没上传照片的话你是用录入数据时是用默认图片,还是空字符串录入,还是null
    在合并的时候判断下就可以.
      

  12.   

    数据库中照片是image类型的,如果不上传照片默认是null
      

  13.   

    <%@ Page Language="C#" %>
    <script runat="server">
        private void Page_Load()
        {
            List<Test> list = new List<Test>();
            list.Add(new Test("a2", "b3", "c3"));
            list.Add(new Test("a1", "b1", "c1"));
            list.Add(new Test("a1", "b2", "c2"));
            list.Add(new Test("a1", "b21", "c21"));
            list.Add(new Test("a3", "b4", "c4"));
            list.Add(new Test("a3", "b41", "c41"));        gridView.DataSource = list;
            gridView.DataBind();
        }    private string t1 = string.Empty;
        private void gridView_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            switch (e.Row.RowType)
            { 
                case DataControlRowType.DataRow:
                    Test test = e.Row.DataItem as Test;
                    if (t1 != test.a) t1 = string.Empty;
                    
                    List<Test> list = gridView.DataSource as List<Test>;
                    int x = list.Where<Test>(delegate(Test obj) { return obj.a == test.a; }).Count();
                    if (x > 1)
                    {
                        if (t1 == string.Empty)
                        {
                            e.Row.Cells[0].Attributes.Add("rowspan", x.ToString());
                            t1 = test.a;
                        }
                        else {
                            e.Row.Cells.RemoveAt(0);
                        }
                    }
                    break;
            }
        }    private class Test
        {
            private string _a;
            public string a { get { return _a; } set { _a = value; } }
            private string _b;
            public string b { get { return _b; } set { _b = value; } }
            private string _c;
            public string c { get { return _c; } set { _c = value; } }        public Test(string A, string B, string C)
            { 
                _a = A;
                _b = B;
                _c = C;
            }
        } 
    </script>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
    <title></title>
    </head>
    <body>
    <form runat="server">
    <asp:GridView ID="gridView" runat="server" OnRowDataBound="gridView_RowDataBound">
    </asp:GridView>
    </form>
    </body>
    </html>