gpt4 book ai didi

c# - Form.Show()不适用于1台特定计算机

转载 作者:太空宇宙 更新时间:2023-11-03 14:52:07 24 4
gpt4 key购买 nike

我正在用C#开发Excel插件。
该插件包含带有一些按钮的面板,用于打开悬停表单。

我已收到通知,该功能不适用于我公司的一台计算机。它使用Excel Office 2016到最新版本。
这是发生了什么:

Form issue

灰色框应该是Windows窗体,但是由于某些原因它无法加载。用户单击一个按钮将其打开,它只是保持灰色,没有控件,没有事件,没有任何响应。

现在,这是应该打开Form的代码:

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; }
}
}


我提供此代码只是为了以防万一,但是我不确定它是否有问题。

完全相同的代码在任何其他机器上都可以正常工作,并且该插件的任何版本都出现了问题。
我已经用几个(稳定的)版本检查过它,即使是Beta版本,也仍然出现问题。

但是,它在外接程序重新安装到计算机上的先前版本之后出现。不应将任何外部因素弄混,但我认为指出这一点很重要。
我正在使用Wix 3.11生成的msi安装程序进行安装。

我没有修改代码,但是这是我尝试过的。我希望这不是荒谬的,我对此没有经验:
-卸载并重新安装插件,
-修复Office 2016,然后在不更改任何内容的情况下进行卸载/重新安装,
-将.NET版本从4.6更新到4.7.2(该插件需要4.6)
-更新了计算机上的图形卡驱动程序

另外,我尝试检查日志以查看是否生成了任何类型的错误:
-我的插件在日志中未显示任何错误
-我已经建立了Visual Studio项目,并在调试模式下启动了插件,并带有断点和所有->没有任何类型的错误
-我检查了Windows日志事件,没有发现任何相关信息。由于我没有阅读经验,所以我可能会错过一些东西。

我终于找到了一个“做某事”的链接:
How to revert to an earlier version of office 2016

我将Office版本还原为16.0.9330.2118,并且表单开始按预期运行了大约30分钟。然后,我被告知问题再次出现,即使计算机上没有任何更新。它只是“再次出错”。我将Office更新到最新版本,并且直到第二天早上才重新开始工作。

如您所见,不会产生任何错误,但是将Office版本替换为其他版本“会有所作为”。看起来与某些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总是返回与屏幕坐标几乎相同的位置。

我最终永久删除了对PointToClient的调用,从而解决了问题。表单的内容再次跟随其容器。

我仍然不知道为什么PointToClient导致此行为。
几天后,另一位同事遇到了完全相同的问题,而他的计算机上没有任何更新。该插件从在Excel工作簿上正常运行到在下一个工作簿上显示灰色框。

我不知道是否应该将此问题标记为已解决,因为我能够消除此问题,但不完全了解是什么原因引起的。

最佳答案

我相信我已经找到了导致此问题的原因。
该问题“传播”到我公司的另外2台计算机上,即使我不知道真正的原因,也可以通过我进行的更正来修复它们。
随着时间的推移,又出现了一个问题:插件窗体中不再显示ToolStrips控件。

最终,我的一位同事不得不更新他的Windows版本,这彻底消除了所有问题。
我检查了一下,所有3台计算机都在Windows 10版本1709上运行。
我找到了有关此版本问题的链接,但我不完全确定这正是导致错误行为的原因:
https://support.microsoft.com/en-us/help/4340917/windows-10-update-kb4340917

其他计算机很快更新为Windows 10 April 2018升级,并且该加载项的每个版本上的所有功能都再次正常运行。

关于c# - Form.Show()不适用于1台特定计算机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51307132/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com