2013-04-07 3 views
-1

Сценарий этого у меня есть родительской формы, каждый раз я нажимаю search button, форму поиска появляется и родительской форма просто отключен, но можно увидеть.Включение родительской формы из дочерней формы

Проблема заключается в каждый раз, когда я нажимаю exit buttonна форме поиска, то поисковой форме выходов, но родительской форма или MainForm является еще отключена.

код на мой exit buttonна форме поиска:

MainForm mainForm = new MainForm(); 
mainForm.Enabled = true; 
this.Hide(); 

ответ

1

Ваш код создает новый экземпляр класса 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; 
} 
+0

Так что делать, чтобы вызвать mainForm.Enabled из дочерней формы? – eaponz

+0

все это в главной форме? – eaponz

+0

все еще не работает. – eaponz

1

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

Вы можете сделать это, изменив код на вашей родительской форме, которая создает форму поиска для:

searchform.ShowDialog(this); 

Это отключит родительскую форму, пока форма поиска не закрывается, то родительская форма будет автоматически повторно -Enabled.

+0

Haha .. не думаю об этом. Отличная идея. Спасибо друг. – eaponz

0

Вы должны просто передать MainForm в SearchForm, таким образом, прежде чем закрыть форму поиска, вы сможете скрыть исходный MainForm без создания нового. Смотрите код ниже:

public class MainForm:Form 
{ 
    private SearchForm searchForm;//for keeping the search form 
    public MainForm()//your main form constructor 
    { 

    } 
    this.searchBtn.Click+=(s,e)=> 
    { 
     if(this.searchForm == null) 
     { 
      this.searchForm = new SearchForm(this);//creating new searchForm if it does no exist 
      this.searchForm.Show(); 
      this.Enabled = false; 
     } 

    }; 

} 

public class SearchForm:Form 
{ 
    private MainForm mainForm;//this will keep the original mainform 
    public SearchForm(MainForm mainForm) 
    { 
     this.mainForm = mainForm; 
    } 

    this.OnFormClosing+=(s,e)=> 
    { 
     this.mainForm.Enabled = true; 
    }; 
} 

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

public class MainForm:Form 
{ 
    private SearchForm searchForm;//for keeping the search form 
    public MainForm()//your main form constructor 
    { 

    } 
    this.searchBtn.Click+=(s,e)=> 
    { 
     if(this.searchForm == null) 
     { 
      this.searchForm = new SearchForm(this);//creating new searchForm if it does no exist 
      this.searchForm.Show(); 
      this.Enabled = false; 
     } 
     else 
     { 
      this.Enabled = false; 
      this.searchForm.Show(); 
     } 

    }; 

} 

public class SearchForm:Form 
{ 
    private MainForm mainForm;//this will keep the original mainform 
    public SearchForm(MainForm mainForm) 
    { 
     this.mainForm = mainForm; 
    } 

    this.OnFormClosing+=(s,e)=> 
    { 
     e.Cancel = true; 
     this.mainForm.Enabled = true; 
     this.Hide(); 
    }; 
} 

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

0
UpgradeLicenseDialog dialogBox = new UpgradeLicenseDialog(); 
dialogBox.FormClosing+=dialogBox_FormClosing; 
dialogBox.StartPosition = FormStartPosition.CenterScreen; 
this.Enabled = false; 
dialogBox.Show();` 

использование от clossing событие, чтобы позволить родителю ...

частная пустота dialogBox_FormClosing (объект отправителя, System.ComponentModel.CancelEventArgs е) { this.Enabled = истина; }

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