Ваш код создает новый экземпляр класса MainForm. Этот новый экземпляр не является оригинальным, который запустил форму поиска. Obvioulsy первый экземпляр все еще отключен, а новый включен, но вы его не видите, потому что не отображается
Обычно эту проблему можно решить разными способами.
- Передайте экземпляр формы (MainForm), открывшую форму поиска в форму поиска
- Регистрация главного экземпляра уведомление, когда форма поиска закрывается
- Создания и поднимают собственное событие, сигнал к внешней форме, поиска завершившегося
Как зарегистрировать MainForm быть уведомлен о закрытии SearchForm
Код MainForm, который запускает форму поиска, должен быть заменен на что-то вроде этого EDIT Этот подход требует, чтобы вы эффективно закрывали SearchForm. Простым Скрыть не закрыть форму и, таким образом, ни одно событие закрытия не будет поднят SearchForm
SearchForm f = new SearchForm();
// Here the current (this) instance of the MainForm requires
// to be notified of the closing of the search form
f.Closing += new System.ComponentModel.CancelEventHandler(OnSearchClosing);
this.Enabled = false;
f.Show();
....
и добавить этот код, чтобы получить уведомление, когда форма поиска близко
// When the search form closes you get this event
// Here `this` is the correct instance of the MainForm (the one disabled)
private void OnSearchClosing(object sender, System.ComponentModel.CancelEventArgs e)
{
this.Enabled = true;
}
Как пройти Экземпляр MainForm вызывает экземпляр SearchForm
Второй подход, на мой взгляд, менее предпочтителен, потому что вы заставите форму поиска ссылаться на основную форму, и вы будете манипулировать MainForm из SearchForm.
Таким образом, вы передаете ссылку в MainForm к SearchForm и использовать эту ссылку, чтобы повторно включить MainForm
// In the calling code of the search form pass the reference to the caller
SearchForm f = new SearchForm(this);
f.Show();
в виде конструктора SearchForm получить ссылку и хранить в глобальном переменном классе
public class SearchForm:Form
{
private MainForm _callerForm;
public void SearchForm(MainForm callingForm)
{
InitializeComponent();
_callerForm = callingForm;
_callerForm.Enabled = false;
}
// ... somewhere in this class
_callerForm.Enabled = true;
this.Hide();
// ....
}
Как создать и поднять пользовательское событие
Существует третий подход, который имеет преимущества первого и оставить ResponsAbility уведомления в руке й Разработчики е (это означает, что вы можете поднять свое мероприятие и, в зависимости от того заинтересован в том случае, может обрабатывать свой собственный бизнес)
Создать пользовательское событие в SearchForm
в SearchForm.cs
// Build a delegate that returns nothing and receive nothing
// Define an event based on that delegate
public delegate void OnSearchEnded();
public event OnSearchEnded SearchEnded;
... somewhere in this class
// If some external entity choose to be notified when whe have finished search
// raise the event to which this external entity has subscribed (MainForm)
if(SearchEnded != null)
SearchEnded();
....
в MainForm.cs
SearchForm f = new SearchForm();
// Here the current (this) instance of the MainForm infom the SearchForm
// that it wants to be notified when the search end
f.SearchEnded += new SearchForm.OnSearchEnded(EnableThisForm);
this.Enabled = false;
f.Show();
....
// Here the main form receives the notification from the Search Form
public void EnableThisForm()
{
this.Enabled = true;
}
Так что делать, чтобы вызвать mainForm.Enabled из дочерней формы? – eaponz
все это в главной форме? – eaponz
все еще не работает. – eaponz