Что может заставить форму не закрываться?



Мне интересно, что может заставить форму не закрываться.



У меня есть большая форма, с несколькими 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: мне жаль тех, кто сердится на меня, но я задал этот вопрос явно для того, чтобы не получить эти ответы на весь день. Приятно напоминать мне об этих возможных неудачах, но если я утверждаю, что это не так, не будьте ребенком, чтобы притворяться на это.
557   3  

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

    Ничего не найдено.