gpt4 book ai didi

c# - 为什么在单击 ToolStrip 按钮两次时抛出 NullReferenceException - openFileDialog.showDialog()?

转载 作者:行者123 更新时间:2023-11-30 17:19:50 25 4
gpt4 key购买 nike

我创建了一个干净的 WindowsFormsApplication 解决方案,向主窗体添加了一个 ToolStrip,并在其上放置了一个按钮。我还添加了一个 OpenFileDialog,因此 ToolStripButtonClick 事件如下所示:

private void toolStripButton1_Click(object sender, EventArgs e)  
{
openFileDialog1.ShowDialog();
}

我没有更改任何其他属性或事件。

有趣的是,当我双击 ToolStripButton(第二次单击必须非常快,在对话框打开之前),然后取消两个对话框(或选择一个文件,它不会这真的很重要)然后单击主窗体的客户区,NullReferenceException 使应用程序崩溃(错误详细信息附在帖子末尾)。 请注意,Click 事件已实现,而 DoubleClick 未实现

更奇怪的是,当 OpenFileDialog 被任何用户实现的表单替换时,ToolStripButton 阻止被点击两次

我在 Windows 7 Professional(来自 MSDNAA)上使用带有 .NET3.5 的 VS2008 和最新更新。我没有更改 VS 中的许多选项(只有字体大小、工作区文件夹和行编号)。

有人知道怎么解决吗?它在我的机器上是 100% 可复制的,在其他机器上也是吗?

我能想到的一个解决方案是在调用 OpenFileDialog.ShowDialog() 之前禁用该按钮,然后再启用该按钮(但这并不好)。还有其他想法吗?

现在是 promise 的错误详细信息:

System.NullReferenceException was unhandled
Message="Object reference not set to an instance of an object."
Source="System.Windows.Forms"
StackTrace:
at System.Windows.Forms.NativeWindow.WindowClass.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.PeekMessage(MSG& msg, HandleRef hwnd, Int32 msgMin, Int32 msgMax, Int32 remove)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at WindowsFormsApplication1.Program.Main() w C:\Users\Marchewek\Desktop\Workspaces\VisualStudio\WindowsFormsApplication1\Program.cs:line 20
at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:

最佳答案

我能够在 Windows 7 机器上复制这样的东西——我没有遇到异常,但我的表单将不再重绘。可能是因为我没有在 win 7 机器上的调试器中运行,所以异常被吞掉了。

这不会发生在我的 XP 机器上。这只发生在我使用 toolStripButton 并在我第一次打开对话框时双击它。如果我正常打开对话框然后先关闭它,则双击不会打开对话框两次。

怀疑这里发生的事情与竞争条件相似 - 框架开发人员从没想过他们的代码会被输入两次,但这种情况发生了,因为一个新的回调进入消息循环。那么为什么会发生这种情况 - 对我来说看起来像是一个错误。

我找到了一个非常简单的解决方法来阻止它发生——启用 toolStripButton 的 DoubleClickEnabled 属性。您不必实现双击处理程序 - 它会将双击视为单击,然后一切正常。

我会这样处理:

    public Form1()
{
InitializeComponent();

// This is a workaround for a framework bug
// see blah blah
toolStripButton1.DoubleClickEnabled = true;

}

下次升级框架时,您可以尝试将其删除。

尼尔

关于c# - 为什么在单击 ToolStrip 按钮两次时抛出 NullReferenceException - openFileDialog.showDialog()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4576775/

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