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.合同号、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
解决方案 »
- const int Bnum = ds.Tables[0].Rows.Count;这样写提示有错,不能直接把数据库提取的数据传给常量Bnum吗?
- 关于C# post 发包全过程
- 在线求助 高手来
- 域,变量,属性
- Microsoft .NET Framework SDK v1.1的文档怎么安装呀?
- Socket的关闭问题!急,请高手帮帮忙!
- XmlDocument 是否可以写出这样格式的XML~~
- 如何使用反射
- 如何移动无模式窗体?
- string.ToInt32在vs7正式版中不能用,怎么完成string转换成int型
- 动态添加的dateTimePicker如何赋值
- winfroms datageidview 合并第一行怎么实现?
http://www.cnblogs.com/hubcarl/archive/2009/05/10/1453489.html参考
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;
}
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;
}
/// <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
我是在 GridView_DataBound中一条一条判断修改他们的
比如这条和下面一条数据一样,我就把这条的rowspan设置成2(根据你相同条数来定义)
循环到下一条的时候 把这个数据的值给清空就可以了
使用sql查询的时候就出去相同类容的行(distinct)
然后再绑定gridview
另外,用repeater控件试试,第三方控件尽量别用
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
这些是什么东西?我直接拿过来就可以用吗?
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
<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始终相等,结果就是把这一列均改成第一行的第一列的内容了。问题出现在那里呢?
<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>这种方式中呢
<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>里面加链接和加参数
但不能实现网页的链接,用<asp:HyperLinkField或<ItemTemplate><%# DataBinder.Eval等
方法时可以实现链接,但又不能实现相同单元格的合并。