更新 GridView 中的 ReadOnlyCollection
Posted
技术标签:
【中文标题】更新 GridView 中的 ReadOnlyCollection【英文标题】:Update a ReadOnlyCollection in a GridView 【发布时间】:2015-11-20 14:33:12 【问题描述】:我正在尝试修改另一位先生编写的一些代码,这些代码生成各种格式的平面文件。有问题的特定平面文件是一个位置定义的文件 - 值 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。它是从该例程中的存储过程“GetMerrillLynchData”填充的:
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 并继续编写代码。
这个可以吗?
【问题讨论】:
是的,可以做到,但堆栈溢出不应该是“获取免费解决方案”的地方,所以请尝试一下自己,然后提出一个真正的问题 相当严厉的回应 Thorarins。我已经为此苦苦挣扎了两天,试图修改超出我想象的代码。这个问题非常真实,我并不是在寻找“免费解决方案”,因为你如此粗鲁地猜测。我正在寻找不是你的人的善意指导。 【参考方案1】:如果 ReadOnlyCollection 是 Datarows 的集合,只是强制转换为 IDataRow 接口,这可能是 Datarow 类的一个子集,您可以将该集合用作 Datagrid 中的 ItemsSource 并查看您得到的内容。 之后,我认为您必须将数据网格设置为允许编辑,并且将修改集合的内容。 为了帮助您更多,我们需要了解 IDataRow 接口是如何制作的,以及 ReadOnlyCollection 使用哪种类型的基本集合。 如果集合真的是只读的,要编辑它,您可能需要将其内容放入非只读集合中,并使用它来编辑数据,然后从修改后的数据创建一个新的 ReadOnlyCollection 并使用它来创建文件。 高温
【讨论】:
萨布丽娜,感谢您的友好回复。我将创建一个 DataGrid 并将其指定为 DataRows 作为 ItemsSource,然后看看会发生什么。正如我在上面对 Thorarins 所说的那样,这是我过去两天的方法 - 以某种方式调整它,看看我能得到什么。关于另一个建议:我确实尝试将 ReadOnlyCollection 更改为简单的 Collection 并且我在整个地方都遇到了构建错误。试图将他们全部追下来,但最终还是回到了起点。我可能需要再次走这条路,努力追查问题。 您不能简单地更改集合中的 ReadOnlyCollection(这可能是由实现该代码的人在您的一个库中实现的类),但您可以创建一个 List解决方案 1:
制作数据行的读写副本:
return new List<IDataRow>(dataRows);
当然,如果您需要保存更改后的集合,则必须手动进行。
解决方案 2:
如果ReadOnlyCollection
包装了一个重要的 BL 集合对象,该对象是可写的并且在集合更新时维护更改,那么您可能想要提取原始集合。这实际上是一个 hack,根本不是一个好的解决方案:
FieldInfo wrappedCollection = dataRows.GetType().GetField("list",
BindingFlags.Instance | BindingFlags.NonPublic);
return (IList<IDataRow>)wrappedCollection.GetValue(dataRows);
【讨论】:
Taffer,是的,我需要在将 dataRows 传递给 FlatFileGenerator 之前保存编辑。我现在正在处理 Sabrina 的建议,如果我在那里没有得到快乐,我会尝试你上面的“hack”。如果它有效,黑客就可以了! ;-)以上是关于更新 GridView 中的 ReadOnlyCollection的主要内容,如果未能解决你的问题,请参考以下文章
更新 GridView 中的 ReadOnlyCollection
Gridview 中的更新命令停止工作(以前工作和删除,选择工作正常)