仅托管 - FpSpread 数据源字体大小写未保留

HOSTING ONLY - FpSpread DataSource Font Case Not Preserved

.NET Framework 4.5.2

OS: Windows 服务器 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) 托管时不会发生。我能够在网络服务器上从 Visual Studio 附加到 运行 IIS 进程 ID 时调试此问题。

问题: 我们有一些逻辑来检查已绑定到 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" 语句。唯一的问题是如果更改涉及更改大小写,则该值不会反映用户所做的更改。例如,如果用户试图将单元格从 "Click" 更改为 "click",则 "HasChanges" 条件将计算为 "true";但是,该值仍然是 "Click."

下面是用户试图将单元格值从 "False" 更改为 "false" 的屏幕截图。如您所见,该案例已保留且未更改。

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

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

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

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

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

此代码有效,但它给了我们一个错误的假设,即此 "type" 不会被任何其他逻辑覆盖。

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

FpExcel.Sheets[0].DataAutoCellTypes = false;