我有一个应用程序,它有btn预览水晶报告中的报告。我添加了数据集作为报表的数据源,并从工具箱中拖动了数据表,并添加了我需要的字段作为列。我从此链接获得了指示 http://aspalliance.com/2049_Use_LINQ_to_Retrieve_Data_for_Your_Crystal_Reports.2 。这是我的第二个报告第一个工作,并没有遇到任何问题,这就是为什么我很困惑,更不用说它也有可空列。错误说: DataSet不支持System.Nullable<>。
private void ShowReportView()
{
string reportFile = "JudgeInfoFMReport.rpt";
ObservableCollection<tblJudgeFileMaint> judgeFileMaintList;
judgeFileMaintList = GenerateReport();
if (judgeFileMaintList.Count > 0)
{
CrystalReportViewerUC crview2 = new CrystalReportViewerUC();
crview2.SetReportPathFile(reportFile, judgeFileMaintList);
crview2.ShowDialog();
}
else
{
System.Windows.MessageBox.Show("No record found.", module, MessageBoxButton.OK, MessageBoxImage.Information);
}
}
private ObservableCollection<tblJudgeFileMaint> GenerateReport()
{
var result = FileMaintenanceBusiness.Instance.GetAllJudgeInfoList();
return new ObservableCollection<tblJudgeFileMaint>(result);
}
错误发生在我设置数据源report.SetDataSource
的部分 public bool SetReportPathFile(string reportPathFile, IEnumerable enumerable)
{
string reportFolder = @"\CrystalReportViewer\Reports\";
string filename = System.Windows.Forms.Application.StartupPath + reportFolder + reportPathFile; // "\\Reports\\CrystalReports\\DateWiseEmployeeInfoReport.rpt";
ReportPathFile = filename;
report.Load(ReportPathFile);
report.SetDataSource(enumerable);
report.SetDatabaseLogon("sa", "admin007");
bRet = true;
}
_IsLoaded = bRet;
return bRet;
}
我读了一些答案并说我应该将空值设置为DBNUll,如果它可以为空,我会在每列的属性窗口中进行设置。有人可以帮我吗?感谢
答案 0 :(得分:4)
你的问题可以在这篇文章中看到,但是以通用的方式......你可以通过这种方式将一个Object传递给一个输入的DataSet!
答案 1 :(得分:0)
想通了。通过使用collectionextention,复制到某处,我忘记了链接。不管是谁造的,都要归功于你。
类方法看起来像这样。
public statis class CollectionExtension {
public static DataSet ToDataSet<T>(this IEnumerable<T> collection, string dataTableName)
{
if (collection == null)
{
throw new ArgumentNullException("collection");
}
if (string.IsNullOrEmpty(dataTableName))
{
throw new ArgumentNullException("dataTableName");
}
DataSet data = new DataSet("NewDataSet");
data.Tables.Add(FillDataTable(dataTableName, collection));
return data;
}
}
然后您可以通过执行此操作来获取报告来源:
private DataSet GenerateNeutralContEducReport(string dsName)
{
var contEduHistoryList = FileMaintenanceBusiness.Instance.GetManyNeutralFMContEducHistoryInfobyKeyword(CurrentNeutralFM.NeutralID, "NeutralID").ToList();
return CollectionExtensions.ToDataSet<tblContinuingEducationHistory>(contEduHistoryList, dsName);
}
答案 2 :(得分:0)
我从其他建议的答案中几乎找不到帮助,但是此解决方案有效。 解决此问题的另一种方法是使数据列可为空。
DataColumn column = new DataColumn("column", Type.GetType("System.Int32"));
column.AllowDBNull = true;
dataTable.Columns.Add(column);
https://docs.microsoft.com/en-us/dotnet/api/system.data.datacolumn.allowdbnull?view=netcore-3.1
答案 3 :(得分:-1)
foreach (PropertyDescriptor property in properties)
{
dt.Columns.Add(property.Name, Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType);
}