Form.Show() 不适用于 1 台特定计算机
Form.Show() doesn't work for 1 specific computer
我正在用 C# 开发一个 Excel 插件。
此插件包含带有一些按钮的面板,用于打开悬停表单。
我被告知此功能不再适用于我公司的一台计算机。它使用Excel Office 2016 到最新版本。
这是发生了什么:
灰色方框应该是 Windows 表单,但由于某些原因它没有加载。用户单击一个按钮打开它,它只是保持灰色,没有控件,没有事件,没有任何类型的响应。
现在,这是打开表单的代码:
private void _Form_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
// ActiveForm() returns basically a UserForm with some methods to fit my specific needs
ActiveForm().ShowMyForm(_columnButton); // --> ClickEvent
}
public void ShowMyForm(object parent = null)
{
ActiveForm().StartPosition = FormStartPosition.CenterScreen;
if (parent != null)
ComputeLocation(parent);
IntPtr handle = new IntPtr(Excel.Hwnd);
ActiveForm().Show(new WindowWrapper(handle)); // --> Shows a grey box
}
public class WindowWrapper : IWin32Window
{
private IntPtr _hwnd;
public WindowWrapper(IntPtr handle)
{
_hwnd = handle;
}
public IntPtr Handle
{
get { return _hwnd; }
}
}
我提供此代码以防万一,但我不确定它是否有问题。
完全相同的代码在任何其他机器上都能正常工作,我的插件的任何版本都会出现问题。
我已经用几个(稳定的)版本检查过,即使是测试版,问题仍然存在。
但是,在电脑上重新安装了以前版本的插件后出现了。它不应该与任何外部事物混淆,但我认为指出这一点很重要。
我正在使用 Wix 3.11 生成的 msi 安装程序进行安装。
我没有修改代码,但这是我尝试过的。我希望这不是荒谬的,我对此还没有经验:
- 卸载并重新安装插件,
- 修复 Office 2016,然后 Uninstall/Reinstall 当它不会改变任何东西时,
- 将 .NET 版本从 4.6 更新到 4.7.2(插件需要 4.6)
- 更新了计算机上的显卡驱动程序
此外,我尝试检查日志以查看是否生成了任何类型的错误:
- 我的插件在日志中没有显示错误
- 我已经设置了 Visual Studio 项目并在调试模式下启动了插件,带有断点和所有 --> 没有任何类型的错误
- 我检查了 Windows 日志事件,没有发现任何相关内容。我可能错过了一些东西,因为我没有阅读它们的经验。
我终于找到了 link "did something" :
How to revert to an earlier version of office 2016
我将 Office 版本恢复到 16.0.9330.2118,然后表单按预期开始工作大约 30 分钟。然后我被告知问题又回来了,尽管计算机上没有任何更新。它只是 "went wrong again"。我将 Office 更新到最新版本,它再次开始工作,直到第二天早上。
如您所见,没有生成任何错误,但将 Office 版本换成了另一个 "does something"。似乎与某些 Office 库有某种冲突,但我不知道该怎么做或如何处理。
尽管我注意到一些主题看起来像我的问题,但它们都与代码和表单管理有关。我真的相信这与代码无关,尽管我无法肯定地证明这一点。
有人可以帮我解决这个问题吗?即使是关于如何处理这个问题的一些想法也会受到赞赏,因为我真的对此感到不舒服。
编辑:
所以我有点明白发生了什么,但不完全明白。
我按照@HansPassant 告诉我的和 运行 我同事电脑上的 VS 调试器,一步一步地做了,一次又一次地得到它 运行。
看来问题出在 ComputeLocation 方法上(见原文)。
ComputeLocation 基本上是这样工作的(我稍微简化了一下):
private void ComputeLocation(object parent)
{
Control parentControl = (Control) parent;
Point location = parentControl .PointToScreen(new Point(0,0));
//Process location's coordinates here
location = parentControl.PointToClient(location);
ActiveForm().StartPosition = FormStartPosition.Manual;
ActiveForm().Location = location;
}
我终于注意到使用 PointToClient 时会发生此问题。表单会更改其位置,但其内容不会。
删除对 PointToClient 的调用后,我得到了预期的行为。
我想指出这段代码实际上是错误的(与我在原始部分所说的相反),因为 ActiveForm() 是一个 topMost Form 并且没有父级。在这种情况下使用 PointToClient 是一个错误,因为它的位置总是用屏幕坐标表示,尽管这不是导致我出现问题的原因:在这种情况下,PointToClient 总是 returns 一个与屏幕坐标几乎相同的位置.
我最终永久删除了对 PointToClient 的调用,从而解决了问题。表单的内容再次跟随其容器。
我仍然不知道为什么 PointToClient 会导致此行为。
几天后,另一位同事遇到了完全相同的问题,而他的计算机上没有任何更新。插件从通常在 excel 工作簿上的 运行 到在下一个工作簿上显示灰色框。
我不知道是否应该将这个问题标记为已解决,因为我能够解决这个问题,但不完全理解是什么原因造成的。
我相信我已经找到导致此问题的原因。
"spread" 我公司另外 2 台计算机的问题,我能够通过我所做的更正修复它们,即使我不知道真正的原因。
随着时间的推移又出现了一个问题:ToolStrips 控件不再显示在加载项表单中。
最终,我的一位同事不得不更新他的 Windows 版本,这完全消除了所有问题。
我检查过,所有 3 台计算机都是 运行 Windows 10 版本 1709。
我发现了一个关于此版本问题的 link,但我不完全确定这正是导致错误行为的原因:
https://support.microsoft.com/en-us/help/4340917/windows-10-update-kb4340917
其他机器很快更新到 Windows 2018 年 4 月 10 日的升级,并且每个版本的插件都运行再次正常。
我正在用 C# 开发一个 Excel 插件。 此插件包含带有一些按钮的面板,用于打开悬停表单。
我被告知此功能不再适用于我公司的一台计算机。它使用Excel Office 2016 到最新版本。
这是发生了什么:
灰色方框应该是 Windows 表单,但由于某些原因它没有加载。用户单击一个按钮打开它,它只是保持灰色,没有控件,没有事件,没有任何类型的响应。
现在,这是打开表单的代码:
private void _Form_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
// ActiveForm() returns basically a UserForm with some methods to fit my specific needs
ActiveForm().ShowMyForm(_columnButton); // --> ClickEvent
}
public void ShowMyForm(object parent = null)
{
ActiveForm().StartPosition = FormStartPosition.CenterScreen;
if (parent != null)
ComputeLocation(parent);
IntPtr handle = new IntPtr(Excel.Hwnd);
ActiveForm().Show(new WindowWrapper(handle)); // --> Shows a grey box
}
public class WindowWrapper : IWin32Window
{
private IntPtr _hwnd;
public WindowWrapper(IntPtr handle)
{
_hwnd = handle;
}
public IntPtr Handle
{
get { return _hwnd; }
}
}
我提供此代码以防万一,但我不确定它是否有问题。
完全相同的代码在任何其他机器上都能正常工作,我的插件的任何版本都会出现问题。
我已经用几个(稳定的)版本检查过,即使是测试版,问题仍然存在。
但是,在电脑上重新安装了以前版本的插件后出现了。它不应该与任何外部事物混淆,但我认为指出这一点很重要。
我正在使用 Wix 3.11 生成的 msi 安装程序进行安装。
我没有修改代码,但这是我尝试过的。我希望这不是荒谬的,我对此还没有经验:
- 卸载并重新安装插件,
- 修复 Office 2016,然后 Uninstall/Reinstall 当它不会改变任何东西时,
- 将 .NET 版本从 4.6 更新到 4.7.2(插件需要 4.6)
- 更新了计算机上的显卡驱动程序
此外,我尝试检查日志以查看是否生成了任何类型的错误:
- 我的插件在日志中没有显示错误
- 我已经设置了 Visual Studio 项目并在调试模式下启动了插件,带有断点和所有 --> 没有任何类型的错误
- 我检查了 Windows 日志事件,没有发现任何相关内容。我可能错过了一些东西,因为我没有阅读它们的经验。
我终于找到了 link "did something" :
How to revert to an earlier version of office 2016
我将 Office 版本恢复到 16.0.9330.2118,然后表单按预期开始工作大约 30 分钟。然后我被告知问题又回来了,尽管计算机上没有任何更新。它只是 "went wrong again"。我将 Office 更新到最新版本,它再次开始工作,直到第二天早上。
如您所见,没有生成任何错误,但将 Office 版本换成了另一个 "does something"。似乎与某些 Office 库有某种冲突,但我不知道该怎么做或如何处理。
尽管我注意到一些主题看起来像我的问题,但它们都与代码和表单管理有关。我真的相信这与代码无关,尽管我无法肯定地证明这一点。
有人可以帮我解决这个问题吗?即使是关于如何处理这个问题的一些想法也会受到赞赏,因为我真的对此感到不舒服。
编辑:
所以我有点明白发生了什么,但不完全明白。
我按照@HansPassant 告诉我的和 运行 我同事电脑上的 VS 调试器,一步一步地做了,一次又一次地得到它 运行。
看来问题出在 ComputeLocation 方法上(见原文)。
ComputeLocation 基本上是这样工作的(我稍微简化了一下):
private void ComputeLocation(object parent)
{
Control parentControl = (Control) parent;
Point location = parentControl .PointToScreen(new Point(0,0));
//Process location's coordinates here
location = parentControl.PointToClient(location);
ActiveForm().StartPosition = FormStartPosition.Manual;
ActiveForm().Location = location;
}
我终于注意到使用 PointToClient 时会发生此问题。表单会更改其位置,但其内容不会。
删除对 PointToClient 的调用后,我得到了预期的行为。
我想指出这段代码实际上是错误的(与我在原始部分所说的相反),因为 ActiveForm() 是一个 topMost Form 并且没有父级。在这种情况下使用 PointToClient 是一个错误,因为它的位置总是用屏幕坐标表示,尽管这不是导致我出现问题的原因:在这种情况下,PointToClient 总是 returns 一个与屏幕坐标几乎相同的位置.
我最终永久删除了对 PointToClient 的调用,从而解决了问题。表单的内容再次跟随其容器。
我仍然不知道为什么 PointToClient 会导致此行为。
几天后,另一位同事遇到了完全相同的问题,而他的计算机上没有任何更新。插件从通常在 excel 工作簿上的 运行 到在下一个工作簿上显示灰色框。
我不知道是否应该将这个问题标记为已解决,因为我能够解决这个问题,但不完全理解是什么原因造成的。
我相信我已经找到导致此问题的原因。
"spread" 我公司另外 2 台计算机的问题,我能够通过我所做的更正修复它们,即使我不知道真正的原因。
随着时间的推移又出现了一个问题:ToolStrips 控件不再显示在加载项表单中。
最终,我的一位同事不得不更新他的 Windows 版本,这完全消除了所有问题。
我检查过,所有 3 台计算机都是 运行 Windows 10 版本 1709。
我发现了一个关于此版本问题的 link,但我不完全确定这正是导致错误行为的原因:
https://support.microsoft.com/en-us/help/4340917/windows-10-update-kb4340917
其他机器很快更新到 Windows 2018 年 4 月 10 日的升级,并且每个版本的插件都运行再次正常。