none
【ASP.NET】如何根据条件合并GridView中的单元格 RRS feed

  • 问题

  • 我想根据条件在Gridview中合并单元格,原先的数据如图:

    如果数据为项目一、项目二、项目三的时候,它所在的行合并居中显示,并去掉行所有的单选按钮。如图:

     

    我写的代码为   GridView控件的RowDataBound事件中

    if (e.Row.RowType == DataControlRowType.DataRow)
    {

     for(int i=0;i<GvProduct.Rows.Count;i++)
                {
                    if (((LinkButton)(this.GvProduct.Rows[i].Cells[0].FindControl("name"))).CommandArgument == "1")
                    {
                        for (int j = 1; j < GvProduct.Columns.Count; j++)
                        {
                            this.GvProduct.Rows[i].Cells[j].Controls.Clear();//清除除第0列的所有列
                        }

                    }
                }

    }

     

    但是现在的效果为:

    似乎单元格没有合并,恳请大侠帮忙指点,小弟感激不尽。多谢多谢!

    2010年7月12日 2:09

全部回复

  • 可以了,网上有现成的

    #region 合并单元格 合并某一行的所有列
        ///  <summary> 
        ///  合并GridView中某行相同信息的行(单元格)
        ///  </summary> 
        ///  <param  name="GridView1">GridView对象</param> 
        ///  <param  name="cellNum">需要合并的行</param>
        public static void GroupRow(GridView GridView1, int rows)
        {
            TableCell oldTc = GridView1.Rows[rows].Cells[0];
            for (int i = 1; i < GridView1.Rows[rows].Cells.Count; i++)
            {
                TableCell tc = GridView1.Rows[rows].Cells[i];  //Cells[0]就是你要合并的列
                if (oldTc.Text == tc.Text)
                {
                    tc.Visible = false;
                    if (oldTc.ColumnSpan == 0)
                    {
                        oldTc.ColumnSpan = 1;
                    }
                    oldTc.ColumnSpan++;
                    oldTc.VerticalAlign = VerticalAlign.Middle;
                }
                else
                {
                    oldTc = tc;
                }
            }
        }
        #endregion

    • 已标记为答案 jinwb1982 2010年7月12日 3:12
    • 取消答案标记 jinwb1982 2010年7月16日 6:58
    2010年7月12日 3:12
  • 可以了,网上有现成的

    #region 合并单元格 合并某一行的所有列
        ///  <summary> 
        ///  合并GridView中某行相同信息的行(单元格)
        ///  </summary> 
        ///  <param  name="GridView1">GridView对象</param> 
        ///  <param  name="cellNum">需要合并的行</param>
        public static void GroupRow(GridView GridView1, int rows)
        {
            TableCell oldTc = GridView1.Rows[rows].Cells[0];
            for (int i = 1; i < GridView1.Rows[rows].Cells.Count; i++)
            {
                TableCell tc = GridView1.Rows[rows].Cells[i];  //Cells[0]就是你要合并的列
                if (oldTc.Text == tc.Text)
                {
                    tc.Visible = false;
                    if (oldTc.ColumnSpan == 0)
                    {
                        oldTc.ColumnSpan = 1;
                    }
                    oldTc.ColumnSpan++;
                    oldTc.VerticalAlign = VerticalAlign.Middle;
                }
                else
                {
                    oldTc = tc;
                }
            }
        }
        #endregion

    能否说一下为什么if (oldTc.Text == tc.Text )总是相等呢?
    2010年7月16日 6:58
  • 你好

         自己写比较麻烦,有个封装好的控件Flex,可以显示合并单元格。


    1+1=The World http://blog.csdn.net/liuning800203
    2010年7月16日 8:12
  • 你好

         自己写比较麻烦,有个封装好的控件Flex,可以显示合并单元格。


    1+1=The World http://blog.csdn.net/liuning800203

    谢谢,我只是想研究研究此问题,宗旨是要弄明白为什么?总不能老是拿来主义吧。呵呵。
    2010年7月16日 8:54
  • 你好

         满有专研精神的,是,如果了解了原理,对自己是个提高,一通百通,可以继承.NET GridView自己封装一个控件,以后就可以重用了。

         我觉得原理是:如果遇到相同的列,要么隐藏,要么清除。可以考虑使用OnRowDataBound事件,这个事件是GridView每绑定一个行时便执行一下,或是在OnPreRender事件里遍历一下GridView控件,这个事件是在刷新前执行的……我觉得方法满多的,在OnPreRender这里实现可能会好点。


    1+1=The World http://blog.csdn.net/liuning800203
    2010年7月16日 10:35
  • 你好

         满有专研精神的,是,如果了解了原理,对自己是个提高,一通百通,可以继承.NET GridView自己封装一个控件,以后就可以重用了。

         我觉得原理是:如果遇到相同的列,要么隐藏,要么清除。可以考虑使用OnRowDataBound事件,这个事件是GridView每绑定一个行时便执行一下,或是在OnPreRender事件里遍历一下GridView控件,这个事件是在刷新前执行的……我觉得方法满多的,在OnPreRender这里实现可能会好点。


    1+1=The World http://blog.csdn.net/liuning800203

    呵呵,关键是我不明白如图:

    我就不明白第一行的第一列与第一行的第二列、第三列.....怎么能Text相等呢?怎么想也想不通

    2010年7月16日 13:16
  • 你好:

    从你搜索到的代码中可以看到需要合并的一行每列值都是一样,所以才需要合并。这也是为为什么要以此作为合并的条件。

    希望可以帮到你!

    2010年7月20日 6:12
    版主
  • 你好:

    从你搜索到的代码中可以看到需要合并的一行每列值都是一样,所以才需要合并。这也是为为什么要以此作为合并的条件。

    希望可以帮到你!


    还是没有搞清楚,为什么每列值一样呢?

    比如下图中的项目名称的“项目一” 与查看下的 “单选框”  它们的text值能相等?

    2010年7月20日 7:44