Что может заставить форму не закрываться?
Мне интересно, что может заставить форму не закрываться.
У меня есть большая форма, с несколькими TabControls, DataGridViews и многими Databound-элементами управления, по крайней мере, 10 BindingSources задействованы. (Вот почему я не могу разместить свой код здесь, Извините).
Теперь у меня проблема, что где-то в разработке (просто рефакторинг) форма перестала закрываться правильно. Когда я нажимаю на кнопку закрытия (Красный Крест), я прохожу через FormClosing и FormClosed, но больше ничего не происходит. VisualStudio2008 с отладкой и остановкой на всех ошибках, когда брошенное событие не упоминает, что что-то пошло не так, форма просто остается там, где она есть.
Что могло вызвать такое поведение? Это не то, что е. отмена в FormClosing-событие задано!
После пошагового слияния моих изменений в другую чистую рабочую копию форма закрывается правильно, но возникает исключение:
ArgumentNullException с сообщением: "значение не может быть null. Имя_параметра: компонент". Это бросается в Форма.Дизайнер.Утилизируйте после вызова базы.Распорядиться(распоряжаться) линии.
Похоже, что-то с привязкой к базе данных, любые намеки приветствуются.
Я помещу в StackTrace, это действительно любой из элементов управления DataBound, из того, что я понимаю из StackTrace, это текстовое поле - я не получаю фреймворк Source Stepping включен, поэтому я не могу понять, что текстовое поле ломается здесь.
bei System.ComponentModel.ReflectPropertyDescriptor.RemoveValueChanged(Object component, EventHandler handler)
bei System.Windows.Forms.BindToObject.CheckBinding()
bei System.Windows.Forms.Binding.CheckBinding()
bei System.Windows.Forms.Binding.SetBindableComponent(IBindableComponent value)
bei System.Windows.Forms.ControlBindingsCollection.ClearCore()
bei System.Windows.Forms.BindingsCollection.Clear()
bei System.Windows.Forms.ControlBindingsCollection.Clear()
bei System.Windows.Forms.Control.ResetBindings()
bei System.Windows.Forms.Control.Dispose(Boolean disposing)
bei System.Windows.Forms.TextBox.Dispose(Boolean disposing)
bei System.ComponentModel.Component.Dispose()
bei System.Windows.Forms.Control.Dispose(Boolean disposing)
bei System.ComponentModel.Component.Dispose()
bei System.Windows.Forms.Control.Dispose(Boolean disposing)
bei System.ComponentModel.Component.Dispose()
bei System.Windows.Forms.Control.Dispose(Boolean disposing)
bei System.ComponentModel.Component.Dispose()
bei System.Windows.Forms.Control.Dispose(Boolean disposing)
bei System.Windows.Forms.ContainerControl.Dispose(Boolean disposing)
bei System.ComponentModel.Component.Dispose()
bei System.Windows.Forms.Control.Dispose(Boolean disposing)
bei System.ComponentModel.Component.Dispose()
bei System.Windows.Forms.Control.Dispose(Boolean disposing)
bei System.Windows.Forms.TabControl.Dispose(Boolean disposing)
bei System.ComponentModel.Component.Dispose()
bei System.Windows.Forms.Control.Dispose(Boolean disposing)
bei System.Windows.Forms.ContainerControl.Dispose(Boolean disposing)
bei System.Windows.Forms.Form.Dispose(Boolean disposing)
bei My.BaseForm.Dispose(Boolean disposing) in BaseForm.Designer.cs:Zeile 30.
bei My.InheritedForm.Dispose(Boolean disposing) in InheritedForm.Designer.cs:Zeile 25.
bei System.ComponentModel.Component.Dispose()
bei System.Windows.Forms.Form.WmClose(Message& m)
bei System.Windows.Forms.Form.WndProc(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Хорошо, понял, с фреймворком source stepping работает (почему это так сложно) я мог бы выяснить, какая привязка данных не удалась. Это была привязка данных к свойству объекта, которое было null во время выполнения. Спасибо за помощь.
PS: мне жаль тех, кто сердится на меня, но я задал этот вопрос явно для того, чтобы не получить эти ответы на весь день. Приятно напоминать мне об этих возможных неудачах, но если я утверждаю, что это не так, не будьте ребенком, чтобы притворяться на это.
3 ответов:
Я думаю, что один из ваших 10 источников привязки имеет ошибку (в одном из ваших многочисленных элементов управления databound) и не освобождает вас от поля где-то. VS не очень прозрачен, если есть ошибки в привязке данных, и проблемы действительно молча проглатываются.
Хотя, если это так:
Тогда это несколько противоречит моей теории.Когда я нажимаю на кнопку закрытия (Красный Крест), я прохожу через FormClosing и FormClosed
Почему бы не попробовать развязать привязка данных кусок за куском и посмотреть, если вы можете закрыть форму?
Пример того, как предотвратить закрытие формы:
protected override void OnFormClosing(FormClosingEventArgs e) { e.Cancel = true; base.OnFormClosing(e); }Возможно, эта форма наследуется и базовый класс предотвращает закрытие формы, когда некоторые условия не выполняются.
Наконец, если вы не достигнете никакого решения, вы можетевыполнить отладку с помощью кода .NET Framework и посмотреть, что происходит в методеOnClosing вашей формы.
Форму можно предотвратить от закрытия даже из вашего обработчика событий Form_Closing.
private void Form1_Closing(Object sender, CancelEventArgs e) { e.Cancel = true; }Проверьте, устанавливаете ли вы e. Cancel в true .. в любом месте кода, которое препятствует его закрытию.
Comments