2010-01-25 4 views
2

Интересно, что может привести к тому, что форма не будет закрыта.Что может привести к тому, что форма не закрывается?

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

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

Что может привести к такому поведению? Это НЕ, что установлен e.Cancel в FormClosing-Event!

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

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

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

Я вложу в StackTrace, это действительно любой элемент управления DataBound, из того, что я понимаю из StackTrace, это TextBox - я не получаю Step Framework Step Stepping, поэтому я не могу понять что 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) 

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

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

+0

* «Это НЕ, что e.Cancel в FormClosing-Event установлен!» * Откуда вы знаете? этот e.cancel может быть установлен в родительском объекте. – serhio

+0

Вы проверили, что форма не будет воссоздана, как только она будет закрыта? Я полагаю, что после этого форма функционирует правильно? Нить gui не заблокирована или что-то еще? Это после проверки свойства cancel в закрытии, конечно, поскольку это наиболее распространенный. – Glenn

+0

Нет, он не воссоздается. Я вижу, как очищаются DataGridViews (но строки не удаляются, удаляются только все поля). –

ответ

2

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

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

Когда я нажимаю на Close-Button (Red-Cross-Box) Я проходит через FormClosing и FormClosed

то, что несколько противоречит моему теория.

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

+0

Хорошая идея, я попробую это. Я думаю, что это должно быть что-то, что удержит форму ... –

+0

Как вы можете видеть с помощью StackTrace, которую я получил после демонстрации отказа, это действительно что-то с привязкой данных. Спасибо за подсказку. –

1

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

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

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

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

+0

Спасибо, но это было не то, что я думал по моему вопросу, мне не нужно знать, как я могу это предотвратить, но как это может быть случайно/нежелательно предотвращено. –

+0

благодарю вас, прошу прощения за помощь. ПОИСК в вашем коде 'Cancel = true', например, чувак. или проверьте свои события OnClosing-overrides. – serhio

+0

1. Я рад каждому ответу. 2. Получили ли вы сообщение, кто вас подал? 3. Ответ вы не отвечаете на мой вопрос - так что нисходящее движение будет вполне правильным. –

0

Запрещается закрывать форму даже из обработчика события Form_Closing.

private void Form1_Closing(Object sender, CancelEventArgs e) 
{ 

      e.Cancel = true; 

} 

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

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