C# 将值从winform 2传递给进程的winform
我有两个winformFormA和FormB当我点击FormA中的按钮时,FormB将启动 FormB有一些按钮每个按钮都分配了一些值,当我单击任何按钮时,分配给该表单的值必须传递给formA,在那里我需要处理,但两个表单都必须处于活动状态 以下代码附在启动formB的formA按钮上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
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();
}
}
}