将winform 2中的值传递给winform for process

时间:2013-10-08 07:44:05

标签: c# .net winforms

当我在FormA中单击按钮时,我有两个winform FormA FormB ,将启动FormB。

FormB有一些按钮,每个按钮都分配了一些值,当我点击任何按钮时,分配给该表单的值必须传递给我需要进程的formA,但两个Form都必须处于活动状态。

以下代码附加到启动formB

的formA按钮
            FormA bar = new FormA ("Login");
            bar = this;
            FormB pad = new FormB (ref bar);
            pad.ShowDialog();
            MessageBox.Show(this.getValue.ToString());

问题是我无法读取在FormB按钮中单击的值,直到我关闭formB屏幕。我正在寻找一些方法将值委托给FormA进行处理。

我的FormB看起来像,

   FormA s = null;
    string txtInput = String.Empty;

    public FormB (ref FormA form1handle)
    {
       InitializeComponent();
        s = form1handle;
    }

    public string getFormBValue {
        get { return txtInput; }
    }

 private void Dial1_Click(object sender, EventArgs e)
    {
        //txtInput = Dial1.Text;
        s.getValue = Dial1.Text;
        MessageBox.Show(s.getValue.ToString());           
    }

PS:使用FormB我正在尝试实现一个手机拨号盘,它将用于传递DTMF输入。

4 个答案:

答案 0 :(得分:2)

对于您所描述的方案,我会使用FormB中的EventHandler Delegate触发eventFormAFormB监控。

namespace WindowsFormsApplication { using System; using System.Windows.Forms; public partial class Form2 : Form { public EventHandler<MyEventArgs> MyEventHandler; public Form2() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { var eventArgs = new MyEventArgs() { TriggeredDateTime = DateTime.UtcNow, Value = 5 }; OnMyEventHandler(eventArgs); } private void button2_Click(object sender, EventArgs e) { var eventArgs = new MyEventArgs() { TriggeredDateTime = DateTime.UtcNow, Value = 10 }; OnMyEventHandler(eventArgs); } private void OnMyEventHandler(MyEventArgs args) { var handler = MyEventHandler; if (handler != null) { handler(this, args); } } } public class MyEventArgs : EventArgs { public DateTime TriggeredDateTime { get; set; } public int Value { get; set; } } } (我称之为Form2)

FormA

namespace WindowsFormsApplication { using System.Windows.Forms; public partial class Form1 : Form { private Form2 form2; public Form1() { InitializeComponent(); form2 = new Form2(); form2.MyEventHandler += Form2EventHandler; } public void Form2EventHandler(object sender, MyEventArgs args) { MessageBox.Show(string.Format("Received value: {0}", args.Value)); } private void button1_Click(object sender, System.EventArgs e) { form2.ShowDialog(); } } } (我称之为Form1)

FormB

我省略了设计代码,因为它很详细,但是,您可以从上面的示例中看到FormA(Form2)有两个按钮控件,Form2(Form1)有一个按钮控制。

EventHandler公开Form1 Button订阅的Form2,当MyEventArgs按下Form1时,OnMyEventHandler的实例被创建存储您要发送到Form1的值(以及DateTime值作为精确值)并引发Form2EventHandler委托。 EventHandler然后检测到事件已被引发,MyEventArgs处理该事件。

如果您愿意,Properties委托方法也可以与其他控件一起使用。您可以通过set上的TextBoxForm2控件改变Button,使{{1}}尽可能多{{1}} {{1}} {{1}}如果你愿意,可以按下控制。

答案 1 :(得分:0)

向表单B添加一个隐藏文本框,并向表单A添加方法SetChildFromValueToParent,当表单B中隐藏文本框的值发生更改时,将调用该方法。基本上对于表单B中的按钮客户端事件,您必须在表单B中将按钮值设置为隐藏文本框。

A按钮点击中添加以下逻辑,打开B

private void button1_Click(object sender, EventArgs e)
{
    B childForm = new B();

    //Find the textbox control in the child form
    Control[] controls = childForm.Controls.Find("textBox", true);

    if (null != controls[0])
    {
        //Bind the method in the parent form to child form text control's TextChanged event
        controls[0].TextChanged += new System.EventHandler(SetChildFromValueToParent);
    }

    childForm.ShowDialog();
}

将以下方法添加到From A

  private void SetChildFromValueToParent(object obj, EventArgs args)
        {
             //Read the child form's hidden control value and set it to parent form
             B from2 = new B();
             string value =  ((TextBox)form2.Controls["textBox1"]).Text;            
        }

答案 2 :(得分:0)

您可以在 FormB 中创建一些公共属性,并在该表单中进行设置。然后在 FormA 中使用这些属性来获取数据。下面是示例(假设您在FormB中有“关闭”按钮和文本框):

public partial class FormB : Form
{
   public string PhoneNumber { get; private set; }

   private void buttonClose_Click(object sender, EventArgs e)
   {
       this.PhoneNumber = textBoxPhone.Text;
       this.DialogResult = DialogResult.OK;
       this.Close();
   }
}

然后在 FormA

FormB pad = new FormB();
var phoneFromFormB = String.Empty;
if (pad.ShowDialog() == DialogResult.OK)
{
    phoneFromFormB = pad.PhoneNumber;            
}    

<强>更新

如果您需要两个表单都处于活动状态,只需在 FormB 中设置属性而不关闭它。设置属性后,可以从 FormA 访问它们。另外,为了使它们都处于活动状态,您需要使用Show()方法而不是ShowDialog()

答案 3 :(得分:0)

为什么不将FormB创建为UserControl而不是FormB,可以将其添加到FormA中 - 在表单设计器中编译后从Toolbox拖动。

然后,您可以直接从UserControl访问FormA的属性/方法,通过ParentForm属性或传递给它的引用(具体类或接口)。简短tutorial。这意味着FormA和Dialpad可以在ShowDialog是模态的同时处于活动状态。

不需要使用ref关键字,因为Forms是引用类型。注意:我将在FormA中实现一个接口,并将其用作类型而不是FormA。

public FormB : UserControl
{

    FormA s = null;
    string txtInput = String.Empty;

    public FormB (FormA form1handle)
    {
       InitializeComponent();
        s = form1handle;
    }

    public FormB()
    {

    }

    public FormA Parent 
    { 
        get 
        { 
            if(s == null)
               s = (FormA)ParentForm; 
             return s; 
         } 
     }

    public string getFormBValue {
        get { return txtInput; }
    }

 private void Dial1_Click(object sender, EventArgs e)
    {
        //txtInput = Dial1.Text;
        Parent.getValue = Dial1.Text;
        MessageBox.Show(Parent.getValue.ToString());           
    }
  }