-1

场景是我有一个父表单,每次单击时search button,都会出现一个搜索表单父表单只是被禁用但可以看到

问题是每次我单击搜索表单exit button上的,搜索表单退出,但父表单或仍然禁用MainForm

exit button搜索表单上的代码:

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

4 回答 4

1

您的代码创建 MainForm 类的一个新实例。这个新实例不是启动搜索表单的原始实例。Obvioulsy第一个实例仍然被禁用,而新的实例被启用,但是你看不到它,因为没有显示

通常这个问题可以通过多种方式解决。

  • 将打开搜索表单的表单(MainForm)实例传递给搜索表单
  • 注册要在搜索表单关闭时通知的主实例
  • 创建并引发您自己的事件,该事件向外部表单发出搜索结束的信号

如何注册 MainForm 以在 SearchForm 关闭时收到通知
启动 SearchForm 的 MainForm 的代码应更改为类似这样的 内容EDIT这种方法要求您有效地关闭 SearchForm。简单的 Hide 不会关闭表单,因此 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;
}

如何传递调用 SearchForm 实例的 MainForm 实例
在我看来,第二种方法不太可取,因为您将强制搜索表单获取对主表单的引用,并且您将从 SearchForm 操作 MainForm。
通过这种方式,您将 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();
    // ....
}

如何创建和引发自定义事件
第三种方法具有第一种方法的优点,并将通知的责任留给开发人员(这意味着您可以引发自己的事件,并且无论对哪个感兴趣)事件可以处理自己的事务)

在 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;
}
于 2013-04-07T08:28:48.940 回答
1

更优雅的解决方案是将搜索表单设置为模态对话框。每当打开模式对话框时,它的父窗体就会自动禁用。

您可以通过将创建搜索表单的父表单上的代码更改为:

searchform.ShowDialog(this);

这将禁用父表单,直到搜索表单关闭,然后父表单将自动重新启用。

于 2013-04-07T09:06:24.960 回答
0

您应该只将 MainForm 传递给 SearchForm,这样在您关闭搜索表单之前,您将能够隐藏原始 MainForm 而无需创建新的 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();
    };
}

基本上这是最简单的方法,不需要复杂的事件等等。如果不是我在这里提供帮助,我希望这能解决您的问题。

于 2013-04-07T09:35:02.750 回答
0
UpgradeLicenseDialog dialogBox = new UpgradeLicenseDialog();
dialogBox.FormClosing+=dialogBox_FormClosing;
dialogBox.StartPosition = FormStartPosition.CenterScreen;
this.Enabled = false;
dialogBox.Show();`

使用关闭事件来启用父...

私人无效 dialogBox_FormClosing(对象发送者,System.ComponentModel.CancelEventArgs e){ this.Enabled = true; }

于 2015-03-24T11:53:47.913 回答