【问题标题】:what is the best way populate the status bar of non- parent form填充非父表单状态栏的最佳方法是什么
【发布时间】:2014-05-21 04:31:28
【问题描述】:

如何在 C# 中从另一个窗体访问或更新非父窗体或非 mdi 窗体的控件。

如果是,我有一个表单 - Form1 和按钮。当我单击按钮时,新表单 - Form**2 打开,它不是子表单。我想尝试的是,当我在 **Form2 上进行一些活动时,应该在状态上显示一些信息 - Form1 的栏。

如果有样品就好了。

谢谢,

【问题讨论】:

  • 添加公共属性/方法来做到这一点;替代方法(但不好的做法)是将相应的 StatusBars 公开

标签: c# winforms statusbar


【解决方案1】:

您可以在 Form2 中设置一个事件来通知其他人触发了某些操作:

public partial class Form2 : Form
{
    public class StatusChangedArgs : EventArgs
    {
        // Put useful information here which would be retrieved from Form1
    }

    public event EventHandler<StatusChangedArgs> StatusChanged;

    private void OnStatusChanged()
    {
        var handler = StatusChanged;
        if (handler != null)
            handler(this, new StatusChangedArgs());
    }

    // Call OnStatusChanged in other Form2's functions, e.g. button click ...
}

那么当Form1创建Form2时,就可以将Form1注册为Form2的事件的监听器了:

public partial class Form1 : Form
{
    private void button1_Click(object sender, EventArgs e)
    {
        var form2 = new Form2();
        form2.StatusChanged += form2_StatusChanged;
    }

    void form2_StatusChanged(object sender, Form2.StatusChangedArgs e)
    {
        // Update Form1's status bar here
    }
}

【讨论】:

    【解决方案2】:

    您可以使用mediator pattern,基本上您必须创建共享同一个中介对象的两个表单。

    更新示例代码

    public class SimpleMediator{
    
        public Form1 MainForm {get; set;}
    
        public void DisplayStatus(string message){
            MainForm.StatusBar.Text = message;
        }
    }
    
    public class Form2 : Form{
    
        public SimpleMediator Mediator {get; set;}
    
        //...
    }
    

    然后当你打开 Form2

        public void OpenSubForm(){
            var mediator = new Mediator{
                MainForm = this;
            };
            var f2 = new Form2(){
                Mediator = mediator;
            };
            f2.Show();
        }
    

    现在您可以在 Form2 中访问Mediator.DisplayStatus() 方法

    【讨论】:

    • 任何类似的例子
    【解决方案3】:

    编辑 Form2 的构造函数并添加一个新的 Form1 的引用:

        public Form2(Form1 form1Para)
        {
            InitializeComponent();
    
            // This is the Form1 reference
            Form1 form1 = form1Para;
        }
    

    然后编辑 Form1,这里有打开新 Form2 的方法:

            // Give Form1 in the constructor (this <- the Form1)
            Form2 form2 = new Form2(this);
            form2.Show();
    

    【讨论】:

      【解决方案4】:

      我建议 Form2 引发 Form1 处理的事件。事件 args 可以包含数据,或者 Form1 可以从 Form2 的属性中获取数据。

      http://jmcilhinney.blogspot.com.au/2013/10/managing-data-among-multiple-forms-part.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-30
        • 2010-12-05
        • 2010-11-26
        • 1970-01-01
        相关资源
        最近更新 更多