0

.NET 框架 4.5.2

操作系统: Windows Server 2012 RS 标准

IIS: 6.2

应用程序池: .NET CLR 版本 v.4.0.30319

托管管道模式:集成

Spread.NET 版本: 11.45.20183.0

注意: 仅当从我们的 Web 服务器托管在 IIS 中时,才会出现以下问题。在我的本地计算机上通过 IIS Express (v.10.0.18362.1) 托管时不会发生这种情况。在从 Web 服务器上的 Visual Studio 附加到正在运行的 IIS 进程 ID 时,我能够调试此问题。

ISSUE: 我们有一些逻辑来检查绑定到 FpSpread 控件的数据源中的更改。如果检测到更改,我们将提取存在增量的单元格值。代码检测更改没有问题;但是,返回的结果有问题。

示例代码:

public static DataTable getUpdatedGrid(FpSpread FpExcel, DataTable beforeDt)
{
    FpExcel.SaveChanges();
    if (FpExcel.Columns.Count == beforeDt.Columns.Count)
    {
        // No added headers. HasChanges does not track added headers.
        if (((DataSet)FpExcel.DataSource).HasChanges())
        {
            DataTable changes = ((DataSet)FpExcel.DataSource).GetChanges().Tables[0];

        etc...

上面的代码按预期工作,它检测到更改并将其放入“DataTable changes”语句。唯一的问题是如果更改涉及更改大小写,则该值不能反映用户所做的更改。例如,如果用户尝试将单元格从“单击”更改为“单击”,则“HasChanges”条件将评估为“真”;但是,该值仍然是“单击”。

下面是用户尝试将单元格值从“假”更改为“假”的屏幕截图。正如你所看到的,这个案子被保留了下来,没有被改变。

同样,这只发生在用户尝试更改单元格值的大小写时。将值更改为全新的东西可以按预期工作。

在此处输入图像描述

如前所述,这只发生在 IIS 中托管时。此外,绑定到控件的数据集将“CaseSensitive”设置为“true”,如下面的屏幕截图所示:

在此处输入图像描述

4

1 回答 1

0

我们找到了原因和解决方案。在查看了已发布代码的其他实例后,发现此问题有些间歇性,但当单元格值等于 True 或 False 时,它​​似乎相当一致。

在我们的解决方案中,我们在绑定之前进行了大量的单元格格式化。此逻辑的一部分涉及将所有列的 CellType 设置为 TextCellType,示例如下。

TextCellType txt = new TextCellType();
txt.AllowWrap = false;
txt.Multiline = true;
FpExcel.Columns[0, FpExcel.Columns.Count - 1].CellType = txt;

这段代码有效,但它给了我们一个错误的假设,即这个“类型”不会被任何其他逻辑覆盖。

显然,这个假设被证明有些不正确,因为具有特定值的单元格似乎间歇性地抑制了它们的变化,如上面的 True/False 所述。这将我们引向 DataAutoCellTypes 方法,默认情况下为 True。通过使用下面的语句将 DataAutoCellTypes 设置为 False,我们的问题就消失了。

FpExcel.Sheets[0].DataAutoCellTypes = false;
于 2020-05-14T21:10:45.867 回答