3

Я создал чистое решение WindowsFormsApplication, добавив ToolStrip в основную форму и разместил на нем одну кнопку. Я добавил также OpenFileDialog, так что Click событие ToolStripButton выглядит следующим образом:Почему исключение NullReferenceException, когда дважды нажата кнопка ToolStrip - openFileDialog.showDialog()?

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

я не изменил какие-либо другие свойства или события.

Самое смешное, что при двойном щелчке по ToolStripButton (второй щелчок должен быть довольно быстрым, перед открытием диалогового окна) щелкните в клиентской области основной формы, NullReferenceException сбой приложения (сведения об ошибках прилагаются в конце сообщения). Обратите внимание, что событие Click реализовано, а DoubleClick - не.

Что еще более странно, что, когда OpenFileDialog заменяются любым пользователем Реализуемой формы, ToolStripButtonблоков от того щелкнули дважды.

Я использую VS2008 с .NET3.5 на Windows 7 Professional (из MSDNAA) с последними обновлениями. Я не изменил много параметров в VS (только fontsize, папка рабочего пространства и нумерация строк).

Кто-нибудь знает, как это решить? Это 100% реплицируемое на моей машине, это тоже на других?

Одним из решений, о котором я могу думать, является отключение кнопки до вызова OpenFileDialog.ShowDialog(), а затем включение кнопки назад (но это не приятно). Любые другие идеи?

А теперь обещанные подробности об ошибке:

System.NullReferenceException было необработанное
Message = «ссылка на объект не указывает на экземпляр объекта.»
Source = "System.Windows.Forms"
StackTrace:
на System.Windows.Forms.NativeWindow.WindowClass.Callback (IntPtr HWND, Int32 сообщ, IntPtr WPARAM, IntPtr LPARAM)
в System.Windows.Forms .UnsafeNativeMethods.PeekMessage (MSG & тзд, HandleRef HWND, Int32 msgMin, Int32 MSGMAX, Int32 удалить)
на System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop (Int32, Int32 dwComponentID причина, Int32 pvLoopData)
в System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner (причина Int32, контекст ApplicationContext)
в System.Windows.Forms.Application.ThreadContext.RunMessageLoop (Int32 причине, ApplicationContext контекст)
в System.Windows.Forms.Application.Run (форма MainForm)
в WindowsFormsApplication1.Program.Main (ш) C: \ Users \ Marchewek \ Desktop \ Workspaces \ VisualStudio \ WindowsFormsApplication1 \ Program.cs: линия 20
на System.AppDomain._nExecuteAssembly (монтаж монтаж, String [] арг)
на System.AppDomain.ExecuteAssembly (String assemblyFile, Evidence assemblySecurity , String [] args)
у Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
в System.Threading.ThreadHelper.ThreadStart_Context (состояние объекта)
в System.Threading.ExecutionContext.Run (ExecutionContext ExecutionContext, ContextCallback обратного вызова, объект состояния)
в System.Threading. ThreadHelper.ThreadStart()
InnerException:

+0

Варианты VS не имеют значения. Это выглядит как ошибка в рамках. – SLaks

+0

Мне не удалось воспроизвести вашу проблему с помощью VS2008 на W2K3 и VS2010 на W2K8. –

+0

Также невозможно воспроизвести с использованием XPsp3, VS2008 и .NET2.0 или 3.5 – Andy

ответ

2

Я был в состоянии повторить что-то подобное на Windows 7 Machine - я не получаю исключения, но моя форма больше не будет перерисовывать. Возможно, потому, что я не запущен в отладчике в поле win 7, что исключение проглатывается.

Это не происходит на моей машине XP. Это произошло только тогда, когда я использовал toolStripButton и дважды щелкнул по нему при первом открытии диалога. Если я открываю диалог нормально, а затем сначала закрываю его, двойной щелчок не открывает диалог дважды.

Я подозреваю, что происходит здесь похож состояния гонки - когда разработчик базы не ожидали, что их код может быть введен в два раза, но это произошло из-за нового вызова обратно в цикл обработки сообщений , Так почему это происходит - выглядит как ошибка для меня.

Я нашел одно очень легкое обходное решение, которое не позволяет ему произойти - включите свойство DoubleClickEnabled инструмента toolStripButton. Вам не нужно реализовывать обработчик двойного щелчка - он обрабатывает двойной щелчок одним щелчком мыши, и все это работает.

Я бы справиться с этим следующим образом:

public Form1() 
    { 
     InitializeComponent(); 

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

    } 

В следующий раз обновить базы вы можете попробовать удалить его.

Нил

0

Метод ShowDialog модально. Обычно после вызова ShowDialog OpenFileDialog имеет эксклюзивный фокус UI приложения, пока диалог не будет закрыт.

Быстрый двойной щелчок по кнопке, которую вы вызываете ShowDialog еще раз, прежде чем инфраструктура имеет шанс предоставить эксклюзивный фокус OpenFileDialog. Это помещает ваше приложение в недопустимое состояние.

Хотя это не должно быть возможно, ясно, что это так, и теперь это ваша проблема. Либо подписаться на событие Click кнопки и отключить кнопку после первого нажатия; или удалить OpenFileDialog из конструктора и создать его программно в обработчике Click. Если вы сделаете последнее, завернуть его в использовании блока для обеспечения сбора мусора:

private void toolStripButton1_Click(object sender, EventArgs e) 
{ 
    using(var OFD = new OpenFileDialog()) 
    { 
     OFD.ShowDialog(); 
    } 
} 
0

Разрешение экрана может быть одна из причин, которые вызывают ошибку в рамках. В моем случае я изменил свое разрешение экрана, и проблема не возникла в этой резолюции, и когда я возвращаюсь к рекомендуемому разрешению, у меня возникла проблема.

 Смежные вопросы

  • Нет связанных вопросов^_^