0

当我点击FormA中的按钮时,我有两个winform FormAFormB ,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

4 回答 4

2

对于您描述的场景,我将使用您的EventHandler DelegateFormB来触发event由您的FormA.

FormB(我称为Form2)

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

FormA(我称为Form1)

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

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

Form2公开一个EventHandler订阅Form1的对象,当按下一个Buttonin时,会创建一个实例,该实例存储您要发送到的值(以及作为一个细节的 DateTime 值)并引发委托。 然后检测事件已引发并处理该事件。Form2MyEventArgsForm1OnMyEventHandlerForm1Form2EventHandler

如果您愿意,EventHandler委托方法也可以与其他控件一起使用。您可以根据需要更改MyEventArgs为拥有任意数量的控件,Properties这可以set通过多个TextBox控件来控制按下控件的Form2位置。Button

于 2013-10-08T08:11:57.013 回答
0

与其将 FormB 作为表单,不如将 FormB 创建为可以添加到 FormA的UserControl - 在表单设计器中编译后从工具箱中拖动。

然后,您可以通过 ParentForm 属性或传递给它的引用(具体类或接口)直接从 UserControl 访问 FormA 的属性/方法。简短教程。这意味着 FormA 和 Dialpad 可以同时处于活动状态,因为 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());           
    }
  }
于 2013-10-08T08:01:51.300 回答
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()method 而不是ShowDialog().

于 2013-10-08T07:57:12.050 回答
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;            
        }
于 2013-10-08T07:52:24.117 回答