در اینجا دو حال پیش می آید یا گزارش subreport , هست یا داکیومنت معمولی
ابندا باید داکیومنت گزارش و کانکشن اینفو را به توابع بدهد
نحوه پر کردن connectionInfo




ConnectionInfo ConnectionInfoRpt = newConnectionInfo();
ConnectionInfoRpt.IntegratedSecurity =
true;
ConnectionInfoRpt.DatabaseName =
"database";
ConnectionInfoRpt.Password =
"pass";
ConnectionInfoRpt.UserID =
"user";
ConnectionInfoRpt.ServerName =
SystemInformation.ComputerName.ToString();
Finassl rpt = newFinassl();
حالا نوبت به ارسال هم داکیومنت و کاننکشن است
ApplyLogOnInfoForSubreports(rpt, ConnectionInfoRpt);

تابع را فراخوانی می کنیم
privatevoid ApplyReportLogon(CrystalDecisions.CrystalReports.E ngine.ReportDocument RptYears, ConnectionInfo sa)
{
foreach (CrystalDecisions.CrystalReports.Engine.Table tablex in RptYears.Database.Tables)
{
tablex.LogOnInfo.ConnectionInfo.AllowCustomConnect ion =
true;
TableLogOnInfo tablelog = tablex.LogOnInfo;
tablelog.ConnectionInfo = sa;
tablex.ApplyLogOnInfo(tablelog);
}
}

حال اگر فرم شما ساب ریپورت داشته باشد فرم ریپورت خود را به جای ارسال به تابع فوق به تابع زیر ارسال می نمایید

privatevoid ApplyLogOnInfoForSubreports(CrystalDecisions.Cryst alReports.Engine.ReportDocument rpt, ConnectionInfo ConnectionInfoRpt)
{


Sections Sections = rpt.ReportDefinition.Sections;
foreach (Section section in Sections)
{
ReportObjects reportObjects = section.ReportObjects;
foreach (ReportObject reportObject in reportObjects)
{
if (reportObject.Kind == ReportObjectKind.SubreportObject)
{
var subreportobject = (SubreportObject)reportObject;
ReportDocument SubReportDocument = subreportobject.OpenSubreport(subreportobject.Subr eportName);
ApplyReportLogon(SubReportDocument, ConnectionInfoRpt);
}
}
}


}










امیدوارم تونسته باشم مشکلی را حل کرده باشم