我尝试使用Export to Excell,PDF,TextFile生成报告。好吧,我在MVC中这样做。我有一个名为SPBatch的类(这是我的SQL中存储过程的确切名称),它包含以下内容:
public string BatchNo { get; set; }
public string ProviderName { get; set; }
public Nullable<System.Int32> NoOfClaims { get; set; }
public Nullable<System.Int32> TotalNoOfClaims { get; set; }
public Nullable<System.Decimal> TotalBilled { get; set; }
public Nullable<System.Decimal> TotalInputtedBill { get; set; }
public Nullable<System.DateTime> DateCreated { get; set; }
public Nullable<System.DateTime> DateSubmitted { get; set; }
public Nullable<System.DateTime> DueDate { get; set; }
public string Status { get; set; }
public string RefNo { get; set; }
public string BatchStatus { get; set; }
public string ClaimType { get; set; }
正如您所看到的,我的一些列被声明为Nullable。从搜索和在表格中显示结果顺利进行。我有几个按钮,下面是用于导出的图像按钮,每次我尝试在Excel中导出时,我总是遇到问题“ DataSet不支持System.Nullable&lt;&gt; ”代码:
foreach (MemberInfo mi in miArray)
{
if (mi.MemberType == MemberTypes.Property)
{
PropertyInfo pi = mi as PropertyInfo;
dt.Columns.Add(pi.Name, pi.PropertyType); //where the error pop's up.
}
else if (mi.MemberType == MemberTypes.Field)
{
FieldInfo fi = mi as FieldInfo;
dt.Columns.Add(fi.Name, fi.FieldType);
}
}
错误显示在带注释的错误上。你能帮帮我怎么办?我尝试在我的代码中添加DBNull但仍然得到相同的错误。我尝试在我的SPBatch中删除Nullable但是我得到一个错误,一些表需要声明为Nullable。
我该怎么办?
答案 0 :(得分:100)
尝试
dt.Columns.Add(pi.Name, Nullable.GetUnderlyingType(
pi.PropertyType) ?? pi.PropertyType);
答案 1 :(得分:4)
感谢C#版本的生成数据和一些黑客攻击,我可以在VB中提供这个答案 - 我把它放在这里因为我只是有很多麻烦想要从存储中获取可过滤的数据集proc使用简单的数据层。我希望它可以帮助别人!
注意:用例是您希望使用BindingSource.Filter =“some query string”的地方:
Imports System.Reflection
Public Module Extenders
<System.Runtime.CompilerServices.Extension>
Public Function ToDataTable(Of T)(collection As IEnumerable(Of T), tableName As String) As DataTable
Dim tbl As DataTable = ToDataTable(collection)
tbl.TableName = tableName
Return tbl
End Function
<System.Runtime.CompilerServices.Extension>
Public Function ToDataTable(Of T)(collection As IEnumerable(Of T)) As DataTable
Dim dt As New DataTable()
Dim tt As Type = GetType(T)
Dim pia As PropertyInfo() = tt.GetProperties()
'Create the columns in the DataTable
For Each pi As PropertyInfo In pia
Dim a =
If(Nullable.GetUnderlyingType(pi.PropertyType), pi.PropertyType)
dt.Columns.Add(pi.Name, If(Nullable.GetUnderlyingType(pi.PropertyType), pi.PropertyType))
Next
'Populate the table
For Each item As T In collection
Dim dr As DataRow = dt.NewRow()
dr.BeginEdit()
For Each pi As PropertyInfo In pia
dr(pi.Name) = If(Nullable.GetUnderlyingType(pi.PropertyType) Is GetType(DateTime), DBNull.Value, pi.GetValue(item, Nothing))
Next
dr.EndEdit()
dt.Rows.Add(dr)
Next
Return dt
End Function
End Module
答案 2 :(得分:1)
我会搜索nullable并将其替换为一个字符串,与DateTime不同,该字符串可以为null。
foreach (PropertyInfo pi in properties)
{
if (pi.PropertyType.Name.Contains("Nullable"))
myDataType = typeof(String);
else
myDataType = pi.PropertyType;
}
以下是完整版本:
private DataTable CreateDataTable(PropertyInfo[] properties)
{
DataTable dt = new DataTable();
DataColumn dc = null;
foreach (PropertyInfo pi in properties)
{
dc = new DataColumn();
dc.ColumnName = pi.Name;
if (pi.PropertyType.Name.Contains("Nullable"))
dc.DataType = typeof(String);
else
dc.DataType = pi.PropertyType;
// dc.DataType = pi.PropertyType;
dt.Columns.Add(dc);
}
return dt;
}
答案 3 :(得分:0)
1)如下定义此扩展
public static class ListExtensions
{
public static DataTable ToDataTable<T>(this List<T> list)
{
DataTable table = new DataTable(typeof(T).Name);
//Get Properites of List Fiels
PropertyInfo[] props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
//Create Columns as Fields of List
foreach (PropertyInfo propertyInfo in props)
{
var column = new DataColumn
{
ColumnName = propertyInfo.Name,
DataType = propertyInfo.PropertyType.Name.Contains("Nullable") ? typeof(string) : propertyInfo.PropertyType
};
table.Columns.Add(column);
}
//Fill DataTable with Rows of List
foreach (var item in list)
{
var values = new object[props.Length];
for (var i = 0; i < props.Length; i++)
{
values[i] = props[i].GetValue(item, null);
}
table.Rows.Add(values);
}
return table;
}
}
2)如下所示的呼叫扩展方法,其中[_lstOperationDetails]是要从列表转换为数据表的列表
DataTable operationDetails = _lstOperationDetails.ToDataTable();