Gridview中某字段的内容相同时如何只显示一个,即象pb中的数据窗口一样,只显示一个,其余的不显示。因为我有一个租赁合同表,表结构为1.合同号、2.租金付款起始日期、3.租金付款截至日期、4.每次付款的租金,一个合同一般是签多年的比如3年,而租金是按年收取的,我要显示的结果如下:
1.合同号、2.租金付款起始日期、3.租金付款截至日期、4.每次付款的租金
0001    2009-1-1              2010-12-31            1000
        2011-1-1              2011-12-31            1000
        2012-1-1              2012-12-31            1000

解决方案 »

  1.   

    http://blog.csdn.net/l18900201/archive/2008/09/27/2989076.aspx参考
    http://www.cnblogs.com/hubcarl/archive/2009/05/10/1453489.html参考
      

  2.   


    for(int i=1 ;i<datagridview1.rows.count)
    {
    if(datagridview1.rows[i].cells[0].value.tostring()==datagridview1.rows[i-1].cells[0].value.tostring())
    datagridview1.rows[i].cells[0].style.forecolor=color.white;
    }
      

  3.   


    for(int i=1 ;i<datagridview1.rows.count;i++)
    {
    if(datagridview1.rows[i].cells[0].value.tostring()==datagridview1.rows[i-1].cells[0].value.tostring())
    datagridview1.rows[i].cells[0].style.forecolor=color.white;
    }
      

  4.   

    #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
        #region 合并单元格 合并一行中的几列
        /// <summary>
        /// 合并单元格 合并一行中的几列
        /// </summary>
        /// <param name="GridView1">GridView ID</param>
        /// <param name="rows">行</param>
        /// <param name="sCol">开始列</param>
        /// <param name="eCol">结束列</param>
        public static void GroupRow(GridView GridView1, int rows,int sCol,int eCol)
        {
           TableCell oldTc = GridView1.Rows[rows].Cells[sCol];
          for (int i = 1; i < eCol - sCol; i++)
          {
            TableCell tc = GridView1.Rows[rows].Cells[i + sCol];  //Cells[0]就是你要合并的列
            tc.Visible = false;
            if (oldTc.ColumnSpan == 0)
            {
              oldTc.ColumnSpan = 1;
            }
            oldTc.ColumnSpan++;
            oldTc.VerticalAlign = VerticalAlign.Middle;
          }
        }
        #endregion
        #region 合并单元格 合并某一列所有行
        /// <summary>
        /// 合并GridView中某列相同信息的行(单元格)
        /// </summary>
        /// <param name="GridView1"></param>
        /// <param name="cellNum"></param>
        public static void GroupCol(GridView GridView1, int cols)
        {
          if (GridView1.Rows.Count < 1 || cols > GridView1.Rows[0].Cells.Count - 1)
          {
            return;
          }
          TableCell oldTc = GridView1.Rows[0].Cells[cols];
          for (int i = 1; i < GridView1.Rows.Count; i++)
          {
            TableCell tc = GridView1.Rows[i].Cells[cols];
            if (oldTc.Text == tc.Text)
            {
              tc.Visible = false;
              if (oldTc.RowSpan == 0)
              {
                oldTc.RowSpan = 1;
              }
              oldTc.RowSpan++;
              oldTc.VerticalAlign = VerticalAlign.Middle;
            }
            else
            {
              oldTc = tc;
            }
          }
        }
        #endregion
        #region 合并单元格 合并某一列中的某些行
        /// <summary>
        /// 合并单元格 合并某一列中的某些行
        /// </summary>
        /// <param name="GridView1">GridView ID</param>
        /// <param name="cellNum">列</param>
        /// <param name="sRow">开始行</param>
        /// <param name="eRow">结束列</param>
        public static void GroupCol(GridView GridView1, int cols,int sRow,int eRow)
        {
          if (GridView1.Rows.Count < 1 || cols > GridView1.Columns.Count - 1)
          {
            return;
          }
          TableCell oldTc = GridView1.Rows[sRow].Cells[cols];
          for (int i = 1; i < eRow - sRow; i++)
          {
            TableCell tc = GridView1.Rows[sRow + i].Cells[cols]; 
            tc.Visible = false;
            if (oldTc.RowSpan == 0)
            {
              oldTc.RowSpan = 1;
            }
            oldTc.RowSpan++;
            oldTc.VerticalAlign = VerticalAlign.Middle;
          }
        }
        #endregion
      

  5.   

    合并的话是有点麻烦  
    我是在    GridView_DataBound中一条一条判断修改他们的
    比如这条和下面一条数据一样,我就把这条的rowspan设置成2(根据你相同条数来定义)
    循环到下一条的时候  把这个数据的值给清空就可以了
      

  6.   

    Sql语句查询的时候固定显示列,要不就在加载列的时候判断屏蔽。
      

  7.   

    Sql语句查询的时候固定显示列,要不就在加载列的时候判断屏蔽。
      

  8.   

    你数据怎么取得的?取数据的sql里distinct一下不就好了?
      

  9.   

    可以这样在
    使用sql查询的时候就出去相同类容的行(distinct)
    然后再绑定gridview
      

  10.   

    做两个gridview,一个显示合同号,点击合同号,就显示这个合同号的详细信息的gridview.
      

  11.   

    方法很多,但是sql里面不可取
      

  12.   

    是一种方法,编程的吗!就不要太麻烦,多锻炼。
    另外,用repeater控件试试,第三方控件尽量别用
      

  13.   


    http://www.cnblogs.com/hubcarl/archive/2009/05/10/1453489.html
    中有一个XNCJWC.BLL 和
    using XNCJWC.BLL;
    using XNCJWC.Model;
    using XNCJWC.Utility;
    namespace XNCJWC.Web
    这些是什么东西?我直接拿过来就可以用吗?
      

  14.   

    用模板列列来处理吧  在模板里面自己写个TABLE  不就解决了
      

  15.   

    我用的是以下方法试了第一列,不知为什么,都合并成了第一行的内容,我再用跟踪调试查看oldTc.Text 和tc.Text始终是""这个值,请高手帮我看看到底问题出现在那里?
    HtXsZlView.DataSource = dr;
    HtXsZlView.DataBind();
    GroupCol(HtXsZlView,1);
     #region 合并单元格 合并某一列所有行
        /// <summary>
        /// 合并GridView中某列相同信息的行(单元格)
        /// </summary>
        /// <param name="GridView1"></param>
        /// <param name="cellNum"></param>   列数
        public static void GroupCol(GridView GridView1, int cols)
        {
            if (GridView1.Rows.Count < 1 || cols > GridView1.Rows[0].Cells.Count - 1)
            {
                return;
            }
            TableCell oldTc = GridView1.Rows[0].Cells[cols];
            for (int i = 1; i < GridView1.Rows.Count; i++)
            {
                TableCell tc = GridView1.Rows[i].Cells[cols];
                if (oldTc.Text == tc.Text)
                {
                    tc.Visible = false;
                    if (oldTc.RowSpan == 0)
                    {
                        oldTc.RowSpan = 1;
                    }
                    oldTc.RowSpan++;
                    oldTc.VerticalAlign = VerticalAlign.Middle;
                }
                else
                {
                    oldTc = tc;
                }
            }
        }
        #endregion
      

  16.   

    前台程序为:     
    <asp:TemplateField HeaderText="客户名称">
    <ItemTemplate><%# DataBinder.Eval(Container.DataItem, "Khname")%></ItemTemplate>
    <ItemStyle Width="2%" BorderWidth="1px" />
    <HeaderStyle HorizontalAlign="Center" />
    </asp:TemplateField>
    后台检索数据的是一个存储过程:
    CREATE PROCEDURE Pr_GetHtXsZlAS

    select Fyhtxx.KhId,Fyhtxx.Id Id,Fyhtxx.Fyxx Fj, Fyhtxx.Htno Htno,Fyhtxx.Zlqsrq Zlqsrq,Fyhtxx.Zljzrq Zljzrq,Fyhtxx.Czje ZZj,Fyhtxx.Lrrq Lrrq,Fyhtxx.Htzt Htzt,
              Khda.Khname,lc.desn Lc,ld.desn Ld,lq.desn Lq,lp.desn Lp,zlfkmx.Qsrq Zjqsrq,zlfkmx.Jzrq Zjjzrq,zlfkmx.Czje Zj,Lp.ItemId
    from Fyhtxx,Khda,item fj,item lc,item ld,item lq,item lp,zlfkmx
    where (Khda.KhId = Fyhtxx.KhId and fj.itemid=fyhtxx.fyid 
              and lc.itemid = (select parentid from item where itemid=fj.itemid)          
              and ld.itemid = (select parentid from item where itemid=lc.itemid)         
              and lq.itemid = (select parentid from item where itemid=ld.itemid)         
              and lp.itemid = (select parentid from item where itemid=lq.itemid) and zlfkmx.Htno = Fyhtxx.Htno)
    GO
    数据显示都是正常的,为什么在合并相同单元格时,oldTc.Text 和Tc.Text始终为"",这样就造成了oldTc.Text 和Tc.Text始终相等,结果就是把这一列均改成第一行的第一列的内容了。问题出现在那里呢?  
      

  17.   

    datagridview里面采用过滤方式处理,totable方法,或者filter,或者用dictionary从新插入新表。
      

  18.   

    问题找到了,前台用这种以下形式时:
    <asp:TemplateField HeaderText="合同号" >
    <ItemTemplate><a href='HtXsZlInfo.aspx?Id=<%# DataBinder.Eval(Container.DataItem,"Id") %>'><%# DataBinder.Eval(Container.DataItem,"Htno") %></ItemTemplate>
    </asp:TemplateField>
    提出来的oldTc.Text和tc.Text始终为"",而用以下形式时
    即:
    <asp:BoundField DataField="Htno" HeaderText="合同号">                            </asp:BoundField>
    oldTc.Text和tc.Text才能为真实的值,但如何把<a href='HtXsZlInfo.aspx?Id=<%# DataBinder.Eval(Container.DataItem,"Id") %>'><%# DataBinder.Eval(Container.DataItem,"Htno") %>中的一个链接和两个参数写入到
    <asp:BoundField DataField="Htno" HeaderText="合同号">                            </asp:BoundField>这种方式中呢
      

  19.   

      GridView合並就可以了,我的博客上有代碼.
      

  20.   

    我现在用的就是你说的那段程序,关键是GridView中的数据绑定以前是<asp:TemplateField HeaderText="合同号" > 
    <ItemTemplate> <a href='HtXsZlInfo.aspx?Id= <%# DataBinder.Eval(Container.DataItem,"Id") %>'> <%# DataBinder.Eval(Container.DataItem,"Htno") %> </ItemTemplate> 
    </asp:TemplateField> 这种方式的,必须要改成<asp:BoundField DataField="Htno" HeaderText="合同号"></asp:BoundField>这种方式才行,我现在的问题是如何在<asp:BoundField></asp:BoundField>里面加链接和加参数  
      

  21.   

    真郁闷,用<asp:BoundField </asp:BoundField>方法可以实现相同单元格的合并,
    但不能实现网页的链接,用<asp:HyperLinkField或<ItemTemplate><%# DataBinder.Eval等
    方法时可以实现链接,但又不能实现相同单元格的合并。