Что может заставить форму не закрываться? - PullRequest
2 голосов
/ 25 января 2010

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

У меня большая форма, с несколькими TabControls, DataGridViews и многими DataBound-Controls, по крайней мере, 10 BindingSources задействованы.(Вот почему я не могу опубликовать свой код здесь, извините).

Теперь у меня проблема в том, что где-то в разработке (просто рефакторинг) форма перестала корректно закрываться.Когда я нажимаю кнопку «Закрыть» (Red-Cross-Box), я прохожу через FormClosing и FormClosed, но больше ничего не происходит.VisualStudio2008 с отладкой и остановкой всех ошибок, когда выброшенное событие не указывает, что что-то пошло не так, форма просто остается на месте.

Что может вызвать такое поведение?Это не то, что e.Cancel в FormClosing-Event установлен!

После поэтапного объединения моих изменений в другую чистую рабочую копию форма корректно закрывается, но выдается исключение:

ArgumentNullException с сообщением: «Значение не может быть нулевым. Имя_параметра: компонент».Он добавляется в Form.Designer.Dispose при вызове base.Dispose (распоряжения) линии.

Кажется, что-то с DataBinging, приветствуются любые подсказки.

Я положу в StackTrace, это действительно любой элемент управления DataBound, из того, что я понимаю из StackTrace,это TextBox - я не включаю пошаговое изменение исходного кода Framework, поэтому я не могу понять, что здесь ломает TextBox.

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)

Хорошо, понял, с работающим пошаговым перемещением исходного кода Framework (почему это так?сложный) Я мог понять, что связывание данных не удалось.Это была привязка данных к свойству объекта, который был нулевым во время выполнения.Спасибо за помощь.

PS: Я извиняюсь за злость на меня, но я задал этот вопрос явно за то, что не получил эти ответы в течение всего дня.Приятно напомнить мне об этих возможных неудачах, но если я утверждаю, что это не так, не будьте по-детски притворяться на это.

Ответы [ 3 ]

2 голосов
/ 25 января 2010

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

Хотя, если это так:

Когда я нажимаю кнопку «Закрыть» (красный крестик), я прохожу через FormClosing и FormClosed

тогда это несколько противоречит моей теории.

Почему бы не попробовать отделить связывание данных от кусочка и посмотреть, сможете ли вы тогда закрыть форму?

1 голос
/ 25 января 2010

пример того, как предотвратить закрытие формы:

protected override void OnFormClosing(FormClosingEventArgs e)
{
    e.Cancel = true;
    base.OnFormClosing(e);
}

возможно, эта форма наследуется, и базовый класс предотвращает закрытие формы, когда некоторые условия не выполняются.

Наконец, если вы не можете найти какое-либо решение, вы можете выполнить отладку с помощью кода .NET Framework и посмотреть, что происходит в методе OnClosing вашей формы.

0 голосов
/ 25 января 2010

Форма может быть закрыта даже из вашего обработчика события Form_Closing.

private void Form1_Closing(Object sender, CancelEventArgs e) 
{

          e.Cancel = true;

}

Проверьте, не устанавливаете ли вы значение e.Cancel в true ... где-нибудь в коде, которое не позволяет ему закрыться.

...