更新 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 并添加到列出 ReadonlyCollection 中的所有元素,或者,如果 ReadOnlyCollection 允许,您可以使用 Linq 并使用 select 创建 List【参考方案2】:

解决方案 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

ASP.NET中的GridView自带的编辑更新功能

Gridview 中的更新命令停止工作(以前工作和删除,选择工作正常)

无法将 Gridview 的更改更新到数据库

JavaScript setInterval 函数不更新 <div> 元素中的 Gridview

使用ajax c#自动刷新带有更新数据的Gridview?