高分求解简单的水晶报表问题,来者有分!

时间:2022-02-25 05:48:45
我不想用数据绑定,要自己写代码来填写报表,我写了查询语句然后用for循环把取出来的数据t赋值给报表里的text,但是只能取出来第一行,如果是直接绑定就是多行,请高说指教!急啊!

22 个解决方案

#1


up

#2


up

#3


up

#4


放的地方不对。。。
详细资料才是它该待的地方。

#5


我已经放到Detail里面了,因为直接绑定出来的都是多条记录的,只是我自己用循环写了放上去的只有一条

#6


循环就只是不断的为同一条赋值吧。你为什么一定不用绑定呢?

#7


把你的代码贴出来看看吧

#8


我的代码
DataTable dt=new DataTable();
DataTable dt1=new DataTable();
dt=dat_Report.DeviceCheckReport_Re("1");
//这里必须事先申明一个ReportDocument对象 Report,同时加载数据报表
ReportDocument oRpt = new ReportDocument();
oRpt.Load(Server.MapPath("CheckReport.rpt"));//修改为你自己的正确位置
//建立.rpt文件与CryStalReportviewer文件之间的连接
oRpt.SetDataSource(dt);
CrystalReportViewer1.ReportSource = oRpt;
//oRpt是需要改动内容的水晶报表文件
TextObject UnitName;
UnitName= oRpt.ReportDefinition.ReportObjects["UnitName"] as TextObject;
TextObject DeviceNo;
DeviceNo = oRpt.ReportDefinition.ReportObjects["DeviceNo"] as TextObject;
TextObject DeviceMode;
DeviceMode = oRpt.ReportDefinition.ReportObjects["DeviceMode"] as TextObject;
TextObject SerialNo;
SerialNo = oRpt.ReportDefinition.ReportObjects["SerialNo"] as TextObject;
TextObject dtUse;
dtUse = oRpt.ReportDefinition.ReportObjects["dtUse"] as TextObject;
//TextObject Keeper;
//Keeper = oRpt.ReportDefinition.ReportObjects["Keeper"] as TextObject;
TextObject KeeperPhone;
KeeperPhone = oRpt.ReportDefinition.ReportObjects["KeeperPhone"] as TextObject;
TextObject zsh;
zsh = oRpt.ReportDefinition.ReportObjects["zsh"] as TextObject;
TextObject yxrq;
yxrq = oRpt.ReportDefinition.ReportObjects["yxrq"] as TextObject;
TextObject FixDate;
FixDate = oRpt.ReportDefinition.ReportObjects["FixDate"] as TextObject;
for(int i=0;i<dt.Rows.Count;i++)
{                

string dtFix="2005";
dt1=dat_Report.DeviceCheckReport_Fix(dt.Rows[i]["cDeviceNo"].ToString(),dtFix);

if (dt1.Rows.Count==0)
{

                    zsh.Text="";  
yxrq.Text="";
FixDate.Text="";
}
else
{

if (dt1.Rows[0]["cCertificate"].ToString()=="")
{

zsh.Text="";
}
else
{

zsh.Text = dt1.Rows[0]["cCertificate"].ToString();
}
if (dt1.Rows[0]["dtCutoff"].ToString()=="")
{

yxrq.Text="";
}
else
{

yxrq.Text = Convert.ToDateTime(dt1.Rows[0]["dtCutoff"]).ToString("yyyy-MM-dd");
}
if (dt1.Rows[0]["dtFix"].ToString()=="")
{

FixDate.Text="";
}
else
{

FixDate.Text = Convert.ToDateTime(dt1.Rows[0]["dtFix"]).ToString("yyyy-MM-dd");
}

}
我有好多查询所有不能用绑定

#9


对了报表些什么事件啊,我是在放CrystalReportViewer的页面中的Page_Load中写的,是不是写代码的地方不对了,高手快快指教把,急死了

#10


mark

#11


你最好跟踪一下你的程序看看
for(int i=0;i<dt.Rows.Count;i++)
行获取到的dt.Rows.Count是不是确实等于1
如果在这儿获取到的行数是多行的 >1那可能在你的循环里面处理的时候出异常了,检查里面的程序

另外你这个程序也可以用绑定来实现的,把你循环里面的程序放在datagrid的绑定事件函数里执行就可以了

#12


对了报表些什么事件啊,我是在放CrystalReportViewer的页面中的Page_Load中写的,是不是写代码的地方不对了,高手快快指教把,急死了
-------------------------------------
这个基本没问题

#13


我调试了程序都对,查询出来了7行,但是只显示了最后一行,还有这个"把你循环里面的程序放在datagrid的绑定事件函数里执行就可以了"是什么意思,第一次用报表什么都不会,

#14


既然查询的结果有7条,那么说明问题出在执行循环的时候了,跟踪一下看看是不是真正执行了7次循环的,我这边目前没有开发环境,很多东西说不上具体的,只能帮你找找问题的可能了

就是指报表应该也有类似与datagrid有个数据绑定事件触发函数的吧,你可以在这个事件函数里面对绑定的数据做处理。我平时要用的报表都是比较复杂的,习惯与自己写样式表来做报表,对你的问题也不是非常熟悉,呵呵

#15


我就是找了怎么报表什么事件都没有,  Mars_grace(Mars) 用样式表怎么做报表啊

#16


学习。。

#17


用绑定就行了,何必这么麻烦呢

#18


to:lhyang761030(云儿)
报表有事件的,刚看了,绑定事件名称跟datagrid的一样的阿(DataBonding事件)
如果在页面上你找不到这个事件,那也可以在.cs代码文件里指定他的事件函数的

#19


你每一次循环都为FixDate.Text付值,所以你只能得到最后一次循环的记录,所以应该是这样:
FixDate.Text = FixDate.Text + Convert.ToDateTime(dt1.Rows[0]["dtFix"]).ToString("yyyy-MM-dd");

#20


我在这里面写了
private void CrystalReportViewer1_DataBinding(object sender, System.EventArgs e)
{
DataTable dt=new DataTable();
DataTable dt1=new DataTable();
dt=dat_Report.DeviceCheckReport_Re("1");
//这里必须事先申明一个ReportDocument对象 Report,同时加载数据报表
ReportDocument oRpt = new ReportDocument();
oRpt.Load(Server.MapPath("CheckReport.rpt"));//修改为你自己的正确位置
//建立.rpt文件与CryStalReportviewer文件之间的连接
oRpt.SetDataSource(dt);
CrystalReportViewer1.ReportSource = oRpt;
//oRpt是需要改动内容的水晶报表文件
FieldObject  UnitName;
UnitName=oRpt.ReportDefinition.ReportObjects["cUnitName1"] as FieldObject;
TextObject zsh;
zsh = oRpt.ReportDefinition.ReportObjects["zsh"] as TextObject;
TextObject yxrq;
yxrq = oRpt.ReportDefinition.ReportObjects["yxrq"] as TextObject;
TextObject FixDate;
FixDate = oRpt.ReportDefinition.ReportObjects["FixDate"] as TextObject;
TextObject UseDate;
UseDate = oRpt.ReportDefinition.ReportObjects["UseDate"] as TextObject;

for(int i=0;i<dt.Rows.Count;i++)
//    for(int i=1;i<oRpt.Database.Tables.Count;i++)
{   
UseDate.Text=Convert.ToDateTime(dt.Rows[i]["dtUse"]).ToString("yyyy-MM-dd");
string dtFix="2005";
dt1=dat_Report.DeviceCheckReport_Fix(dt.Rows[i]["cDeviceNo"].ToString(),dtFix);
if (dt1.Rows.Count==0)
{
zsh.Text=" ";  
yxrq.Text=" ";
FixDate.Text=" ";
}
else
{
if (dt1.Rows[0]["cCertificate"].ToString()=="")
{
zsh.Text=" ";
}
else
{
zsh.Text =dt1.Rows[0]["cCertificate"].ToString();
}
if (dt1.Rows[0]["dtCutoff"].ToString()=="")
{
yxrq.Text=" ";
}
else
{
yxrq.Text = Convert.ToDateTime(dt1.Rows[0]["dtCutoff"]).ToString("yyyy-MM-dd");
}
if (dt1.Rows[0]["dtFix"].ToString()=="")
{
FixDate.Text=" ";
}
else
{
FixDate.Text = Convert.ToDateTime(dt1.Rows[0]["dtFix"]).ToString("yyyy-MM-dd");
}

}


}


}也是一样的效果,我现在是第一列绑定了,其他的列是根据第一列的值来循环取,但是现在整个报表的行数是对了,第一列绑定的值也是对的,就是后面循环取了写上去的值都是都对应的是最后一行的值

#21


帮顶,jf!

#22


帮顶

#1


up

#2


up

#3


up

#4


放的地方不对。。。
详细资料才是它该待的地方。

#5


我已经放到Detail里面了,因为直接绑定出来的都是多条记录的,只是我自己用循环写了放上去的只有一条

#6


循环就只是不断的为同一条赋值吧。你为什么一定不用绑定呢?

#7


把你的代码贴出来看看吧

#8


我的代码
DataTable dt=new DataTable();
DataTable dt1=new DataTable();
dt=dat_Report.DeviceCheckReport_Re("1");
//这里必须事先申明一个ReportDocument对象 Report,同时加载数据报表
ReportDocument oRpt = new ReportDocument();
oRpt.Load(Server.MapPath("CheckReport.rpt"));//修改为你自己的正确位置
//建立.rpt文件与CryStalReportviewer文件之间的连接
oRpt.SetDataSource(dt);
CrystalReportViewer1.ReportSource = oRpt;
//oRpt是需要改动内容的水晶报表文件
TextObject UnitName;
UnitName= oRpt.ReportDefinition.ReportObjects["UnitName"] as TextObject;
TextObject DeviceNo;
DeviceNo = oRpt.ReportDefinition.ReportObjects["DeviceNo"] as TextObject;
TextObject DeviceMode;
DeviceMode = oRpt.ReportDefinition.ReportObjects["DeviceMode"] as TextObject;
TextObject SerialNo;
SerialNo = oRpt.ReportDefinition.ReportObjects["SerialNo"] as TextObject;
TextObject dtUse;
dtUse = oRpt.ReportDefinition.ReportObjects["dtUse"] as TextObject;
//TextObject Keeper;
//Keeper = oRpt.ReportDefinition.ReportObjects["Keeper"] as TextObject;
TextObject KeeperPhone;
KeeperPhone = oRpt.ReportDefinition.ReportObjects["KeeperPhone"] as TextObject;
TextObject zsh;
zsh = oRpt.ReportDefinition.ReportObjects["zsh"] as TextObject;
TextObject yxrq;
yxrq = oRpt.ReportDefinition.ReportObjects["yxrq"] as TextObject;
TextObject FixDate;
FixDate = oRpt.ReportDefinition.ReportObjects["FixDate"] as TextObject;
for(int i=0;i<dt.Rows.Count;i++)
{                

string dtFix="2005";
dt1=dat_Report.DeviceCheckReport_Fix(dt.Rows[i]["cDeviceNo"].ToString(),dtFix);

if (dt1.Rows.Count==0)
{

                    zsh.Text="";  
yxrq.Text="";
FixDate.Text="";
}
else
{

if (dt1.Rows[0]["cCertificate"].ToString()=="")
{

zsh.Text="";
}
else
{

zsh.Text = dt1.Rows[0]["cCertificate"].ToString();
}
if (dt1.Rows[0]["dtCutoff"].ToString()=="")
{

yxrq.Text="";
}
else
{

yxrq.Text = Convert.ToDateTime(dt1.Rows[0]["dtCutoff"]).ToString("yyyy-MM-dd");
}
if (dt1.Rows[0]["dtFix"].ToString()=="")
{

FixDate.Text="";
}
else
{

FixDate.Text = Convert.ToDateTime(dt1.Rows[0]["dtFix"]).ToString("yyyy-MM-dd");
}

}
我有好多查询所有不能用绑定

#9


对了报表些什么事件啊,我是在放CrystalReportViewer的页面中的Page_Load中写的,是不是写代码的地方不对了,高手快快指教把,急死了

#10


mark

#11


你最好跟踪一下你的程序看看
for(int i=0;i<dt.Rows.Count;i++)
行获取到的dt.Rows.Count是不是确实等于1
如果在这儿获取到的行数是多行的 >1那可能在你的循环里面处理的时候出异常了,检查里面的程序

另外你这个程序也可以用绑定来实现的,把你循环里面的程序放在datagrid的绑定事件函数里执行就可以了

#12


对了报表些什么事件啊,我是在放CrystalReportViewer的页面中的Page_Load中写的,是不是写代码的地方不对了,高手快快指教把,急死了
-------------------------------------
这个基本没问题

#13


我调试了程序都对,查询出来了7行,但是只显示了最后一行,还有这个"把你循环里面的程序放在datagrid的绑定事件函数里执行就可以了"是什么意思,第一次用报表什么都不会,

#14


既然查询的结果有7条,那么说明问题出在执行循环的时候了,跟踪一下看看是不是真正执行了7次循环的,我这边目前没有开发环境,很多东西说不上具体的,只能帮你找找问题的可能了

就是指报表应该也有类似与datagrid有个数据绑定事件触发函数的吧,你可以在这个事件函数里面对绑定的数据做处理。我平时要用的报表都是比较复杂的,习惯与自己写样式表来做报表,对你的问题也不是非常熟悉,呵呵

#15


我就是找了怎么报表什么事件都没有,  Mars_grace(Mars) 用样式表怎么做报表啊

#16


学习。。

#17


用绑定就行了,何必这么麻烦呢

#18


to:lhyang761030(云儿)
报表有事件的,刚看了,绑定事件名称跟datagrid的一样的阿(DataBonding事件)
如果在页面上你找不到这个事件,那也可以在.cs代码文件里指定他的事件函数的

#19


你每一次循环都为FixDate.Text付值,所以你只能得到最后一次循环的记录,所以应该是这样:
FixDate.Text = FixDate.Text + Convert.ToDateTime(dt1.Rows[0]["dtFix"]).ToString("yyyy-MM-dd");

#20


我在这里面写了
private void CrystalReportViewer1_DataBinding(object sender, System.EventArgs e)
{
DataTable dt=new DataTable();
DataTable dt1=new DataTable();
dt=dat_Report.DeviceCheckReport_Re("1");
//这里必须事先申明一个ReportDocument对象 Report,同时加载数据报表
ReportDocument oRpt = new ReportDocument();
oRpt.Load(Server.MapPath("CheckReport.rpt"));//修改为你自己的正确位置
//建立.rpt文件与CryStalReportviewer文件之间的连接
oRpt.SetDataSource(dt);
CrystalReportViewer1.ReportSource = oRpt;
//oRpt是需要改动内容的水晶报表文件
FieldObject  UnitName;
UnitName=oRpt.ReportDefinition.ReportObjects["cUnitName1"] as FieldObject;
TextObject zsh;
zsh = oRpt.ReportDefinition.ReportObjects["zsh"] as TextObject;
TextObject yxrq;
yxrq = oRpt.ReportDefinition.ReportObjects["yxrq"] as TextObject;
TextObject FixDate;
FixDate = oRpt.ReportDefinition.ReportObjects["FixDate"] as TextObject;
TextObject UseDate;
UseDate = oRpt.ReportDefinition.ReportObjects["UseDate"] as TextObject;

for(int i=0;i<dt.Rows.Count;i++)
//    for(int i=1;i<oRpt.Database.Tables.Count;i++)
{   
UseDate.Text=Convert.ToDateTime(dt.Rows[i]["dtUse"]).ToString("yyyy-MM-dd");
string dtFix="2005";
dt1=dat_Report.DeviceCheckReport_Fix(dt.Rows[i]["cDeviceNo"].ToString(),dtFix);
if (dt1.Rows.Count==0)
{
zsh.Text=" ";  
yxrq.Text=" ";
FixDate.Text=" ";
}
else
{
if (dt1.Rows[0]["cCertificate"].ToString()=="")
{
zsh.Text=" ";
}
else
{
zsh.Text =dt1.Rows[0]["cCertificate"].ToString();
}
if (dt1.Rows[0]["dtCutoff"].ToString()=="")
{
yxrq.Text=" ";
}
else
{
yxrq.Text = Convert.ToDateTime(dt1.Rows[0]["dtCutoff"]).ToString("yyyy-MM-dd");
}
if (dt1.Rows[0]["dtFix"].ToString()=="")
{
FixDate.Text=" ";
}
else
{
FixDate.Text = Convert.ToDateTime(dt1.Rows[0]["dtFix"]).ToString("yyyy-MM-dd");
}

}


}


}也是一样的效果,我现在是第一列绑定了,其他的列是根据第一列的值来循环取,但是现在整个报表的行数是对了,第一列绑定的值也是对的,就是后面循环取了写上去的值都是都对应的是最后一行的值

#21


帮顶,jf!

#22


帮顶