仅托管 - 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;
.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;