当我在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输入。
答案 0 :(得分:2)
对于您所描述的方案,我会使用FormB
中的EventHandler Delegate触发event
,FormA
由FormB
监控。
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
上的TextBox
个Form2
控件改变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());
}
}