【问题标题】:How to get string data in main form from second from, when button on second form is clicked in C# .net?当在 C# .net 中单击第二个表单上的按钮时,如何从第二个中获取主表单中的字符串数据?
【发布时间】:2014-03-09 00:02:38
【问题描述】:

一开始我以为这对我来说不会有问题,但现在我想不通了。所以, 当我在主窗体中单击 Button1 时,会打开 form2。 Form2 是简单的数字键盘,用户可以输入一些数据。在 form2 上也是保存。当用户点击它时,输入的值应该传递给主窗体,从那一刻起,主窗体中必须发生一些事件,其中包含来自 form2 的数据。你能给我一些例子或任何帮助吗?谢谢!

 // code from main form to create form2
 private void button1_Click(object sender, EventArgs e)
    {
        // Create a new instance of the Form2 class
        Form2 settingsForm = new Form2();

        // Show the settings form
        settingsForm.Show();

        string val = settingsForm.ReturnValue1;            

        MessageBox.Show(val);
    }

//button save on form2
private void button13_Click(object sender, EventArgs e)
    {
        this.ReturnValue1 = "Something";
        this.ReturnValue2 = DateTime.Now.ToString(); //example
        this.Close();
        //after this, some event should happen in main form !
    }

【问题讨论】:

  • 你已经尝试过发布一些代码

标签: c# .net winforms


【解决方案1】:

有很多解决方案可以做你想做的事;但我认为其中之一将解决您的问题。

1-简单易行:在Form2中使用公共属性,buttonSave被点击时初始化,Form1中访问:

Form2:

public partial class Form2 : Form {
    public Form2() {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e){
        YourDate = "something";
        Close();
    }

    public object YourDate { get; private set; }
}

Form1:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e){
        var f2 = new Form2();
        f2.ShowDialog();
        var data = f2.YourDate;
    }
}

2- 更好的方法是使用更灵活、更专业的编程友好的事件:

Form2:

public partial class Form2 : Form {

    public Form2() {
        InitializeComponent();
    }

    // create an event of Action<T> which T is your data-type. e.g. in this example I use an object. 
    public event Action<object> SaveClicked;

    // create an event invocator, to invoke event whenever you want
    protected virtual void OnSaveClicked(object data){
        var handler = SaveClicked;
        if (handler != null)
            handler(data);
    }

    private void button1_Click(object sender, EventArgs e){
        // prepare your data here, -object, or string, or int, or whatever it is
        var data = PrepareYourDataHere;
        // invoke the event
        OnSaveClicked(data);
        Close();
    }
}

Form1:

public partial class Form1 : Form {

    public Form1() {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e){
        // create an instance of Form2
        var f2 = new Form2();
        // add an event listener to SaveClicked event -which we have declared it in Form2
        f2.SaveClicked += f2_SaveClicked;
        f2.Show();
        // or: f2.ShowDialog();
    }

    void f2_SaveClicked(object obj) {
        // get data and use it here...
        // any data which you pass in Form2.OnSaveClicked method, will be accessible here
    }
}

更新:

如果你想在form1中触发一些事件,在form2关闭之后,你可以简单地给Form2.FormClosed事件添加一个监听器:

// code from main form to create form2
private void button1_Click(object sender, EventArgs e) {
    // Create a new instance of the Form2 class
    Form2 settingsForm = new Form2();
    settingsForm.FormClosed += SettingFormClosed;

    // Show the settings form
    settingsForm.Show();

    string val = settingsForm.ReturnValue1;            

    MessageBox.Show(val);
}

void SettingFormClosed(object sender, FormClosedEventArgs e) {
    // this method will be called automatically when form2 closed
}

【讨论】:

    【解决方案2】:

    这里有一个示例如何实现这一目标

    //这里我假设form1是mainform

    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            public void UpdateMainForm(string updatedString)
            {
                //here you can update  and invoke methods
                 //Once called you could raise events in your mainform 
    
    
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                using (Form2 form2 = new Form2(this))
                {
                    form2.ShowDialog();
    
                }
            }
    
        }
    

    Form2

    public partial class Form2 : Form
        {
            private Form1 _mainForm1; 
            public Form2(Form1  mainForm1)
            {
                InitializeComponent();
                _mainForm1 = mainForm1; 
            }
    
    
            private void button1_Click(object sender, EventArgs e)
            {
                _mainForm1.UpdateMainForm( DateTime.Now.ToString());
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-30
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-03
      相关资源
      最近更新 更多