C# 将值从winform 2传递给进程的winform

C# 将值从winform 2传递给进程的winform,c#,.net,winforms,C#,.net,Winforms,我有两个winformFormA和FormB当我点击FormA中的按钮时,FormB将启动 FormB有一些按钮每个按钮都分配了一些值,当我单击任何按钮时,分配给该表单的值必须传递给formA,在那里我需要处理,但两个表单都必须处于活动状态 以下代码附在启动formB的formA按钮上 FormA bar = new FormA ("Login"); bar = this; FormB pad = new FormB (re

我有两个winformFormAFormB当我点击FormA中的按钮时,FormB将启动

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

以下代码附在启动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进行处理

我的表格看起来像

   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输入

将隐藏文本框添加到表单B,并将方法
SetChildFromValueToParent
添加到表单a,该方法在表单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();
}

  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;            
        }

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

然后在你的表格中

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


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

而不是将FormB创建为表单,在表单设计器中编译后,可以将其添加到FormA-从工具箱中拖动

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

不需要使用ref关键字,因为表单是引用类型。注意:我将在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());           
    }
  }

对于您描述的场景,我将使用您的
表单中的触发
事件的
,该事件由您的
表单监控

FormB
(我称为Form2)

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

Form2
公开
Form1
订阅的
EventHandler
,当按下
Form2
中的
按钮时,将创建一个
MyEventArgs
实例,该实例存储要发送到
Form1
的值(以及一个精确的日期时间值)并引发OnMyEventHandler
委托
Form1
然后检测已引发的事件,并且
Form2EventHandler
处理该事件


EventHandler
delegate方法也可以与其他控件一起使用。您可以通过
Form2
上的许多
TextBox
控件将
MyEventArgs
更改为具有任意数量的
Properties
,在
Form2
上,如果您需要,可以按下
按钮
控件。

我尝试按照您的建议更新代码。但是当我点击FormA中的按钮启动FormB时,整个应用程序崩溃了。你是否在FormB中添加了一个名为textbox的隐藏文本框。此行需要控件[]controls=childForm.controls.Find(“textBox”,true);是的,我有,ToolStripTextBox textbox=新ToolStripTextBox()。我也试过使用TextBox,但没有成功。你必须在表单B中添加一个TextBox,并将visible设置为False,并在控件中给出该TextBox的名称。Find(“TextBox”,true);和((TextBox)form2.控件[“textBox1”]).Text;我在找这样的东西。我将测试它并尽快更新;我得到这个错误。“类型'FormA.FormB.MyEventTargs'不能用作泛型类型或方法'System.EventHandler'中的类型参数'TEventArgs',这是由类
MyEventTargs
未显式派生自
EventArgs
引起的。”。NET4要求您显式地从
EventArgs
派生,.NET4.5(我在其下构建了我的示例)没有。我已经更新了我的示例,例如
Form2
,以显示从
EventArgs
派生的
MyEventArgs
。我应该更明确一些,.NET 4和更早版本要求您显式从
EventArgs
派生。我之前所做的更新仍然可以在.NET3.5下工作。我已经相应地修改了我的代码,但仍然会收到相同的错误。类型'FormA.FormB.MyEventTargs'不能用作泛型类型或方法'System.EventHandler'中的类型参数'TEventArgs'
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());           
    }
  }
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; }
    }
}
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();
        }
    }
}