我正在尝试修改由另一位生成各种格式的平面文件的绅士编写的代码。有问题的特定平面文件是位置定义的文件 - 值X位于位置10,值Y位于17,值Z位于26,等等。
当用户点击"创建文件"按钮,这个提取被调用:
ReadOnlyCollection<IDataRow> dataRows = null;
try
{
dataRows = FlatFileExporter.MerrillLynch.GetMerrillLynchData(mPostSeq, mPaycheckDate, mPayrollStartDate, mPayrollEndDate);
}
catch (Exception ex)
{
Response.Write((ex.InnerException != null ? ex.InnerException.Message + "; " : "") + ex.Message);
}
此时,我知道我有一个名为dataRows的ReadOnlyCollection。它来自存储过程&#34; GetMerrillLynchData&#34;在这个例行程序中:
public static ReadOnlyCollection<IDataRow> GetMerrillLynchData(string postSeq, DateTime paycheckDate, DateTime payrollStartDate, DateTime payrollEndDate)
{
string dateFormat = "MM/dd/yyyy";
string query = string.Format(
"exec GatherMerrillLynchPayrollData {0}, '{1}', '{2}', '{3}'",
"'" + postSeq + "'",
paycheckDate.ToString(dateFormat),
payrollStartDate.ToString(dateFormat),
payrollEndDate.ToString(dateFormat)
);
return FileGenerator.GetDataRows(query, MerrillLynchMeta.Columns, dict => new MerrillLynchDataRow(dict));
}
ReadOnlyCollection将被送到FlatFileGenerator,它将输出格式正确的文件。
问题: 我们的工资管理员希望能够在FTP到美林之前对该文件进行编辑。我想知道在将数据流发送到FlatFileGenerator之前是否可以打开和编辑dataRows(可能在GridView中?)。在完成编辑之后,我想将她的编辑内容保存回dataRows并继续编写代码。
可以这样做吗?
答案 0 :(得分:1)
解决方案1:
制作数据行的读写副本:
return new List<IDataRow>(dataRows);
当然,如果您需要保存更改的集合,则必须手动完成。
解决方案2:
如果ReadOnlyCollection
包装了一个非常重要的BL集合对象,该集合是可写的并且在更新集合时保持更改,那么您可能想要提取原始集合。这实际上是一个黑客,并不是一个很好的解决方案:
FieldInfo wrappedCollection = dataRows.GetType().GetField("list",
BindingFlags.Instance | BindingFlags.NonPublic);
return (IList<IDataRow>)wrappedCollection.GetValue(dataRows);