窗体之间调用事件(委托)

编程有钱人了 2009-05-07 10:22:08
form1

public partial class CarManeger : Form
{
public delegate void MyDelegate(string text);
public event EventHandler MyEvent;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{

}

public void ShowCarNume(string txt)
{
MessageBox.Show(txt);
}
private void button2_Click(object sender, EventArgs e)
{
string str="测试数据";
ShowCarNume(str);
}
}


form2

public partial class Add : Form
{

public Add()
{

InitializeComponent();
}


private void button1_Click(object sender, EventArgs e)
{
//怎么在这里用委托调用form1里面的ShowCarNume方法 要用委托
}
}


怎么在form2里用调用form1里面的ShowCarNume方法 要用委托


除了委托还有别的方法吗?
...全文
335 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
impossible_misson 2009-05-09
  • 打赏
  • 举报
回复
顶。
龙宜坡 2009-05-09
  • 打赏
  • 举报
回复
代码实现

Form1中,一个Lable1;在Form2中控制Form1中的Lable1的显示或隐藏!


Form1代码:

namespace WindowsApplication2
{
public delegate void SetVisiableHandler();

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
Form2 frm = new Form2(new SetVisiableHandler(SetVisiable));
frm.Show();
}

private void SetVisiable()
{
SetVisiable(this.label1, !this.label1.Visible);
}

private void SetVisiable(Control control, bool visiable)
{
if (this.Controls.Contains(control))
{
control.Visible = visiable;
}
}
}
}




Form2代码
namespace WindowsApplication2
{
public partial class Form2 : Form
{
private SetVisiableHandler m_setVisible;
public Form2(SetVisiableHandler setvisible)
{
InitializeComponent();
this.m_setVisible = setvisible;
}

private void btnVisible_Click(object sender, EventArgs e)
{
if (this.m_setVisible != null)
{
this.m_setVisible();
}
}
}
}


事件和委托其实是一回事!参考:委托 事件
bingbingw 2009-05-09
  • 打赏
  • 举报
回复
嗯。。学习了
hui690367451 2009-05-09
  • 打赏
  • 举报
回复

学习一个
mqmmx 2009-05-09
  • 打赏
  • 举报
回复

// form1
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
Form2 frm = new Form2();
frm.Handle += new DelegateHandle(frm_Handle);
frm.Show();
}

void frm_Handle(string st)
{
MessageBox.Show(st);
}
}

// form2
public delegate void DelegateHandle(string st );

public partial class Form2 : Form
{
public event DelegateHandle Handle;

public Form2()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
if (Handle != null)
Handle(textBox1.Text);
}
}



楼主要的是不是这样的结果?
CqCoder 2009-05-08
  • 打赏
  • 举报
回复
最好设置为静态方法

Form1.ShowCarNume("参数");
就可以调用了
我姓区不姓区 2009-05-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wangjun8868 的回复:]
引用 4 楼 ojlovecd 的回复:
直接实例化一个Form1对象后调用不就行了吗?何须委托?

不好意思 上面说错了

我是想调用 form1里面 的button2_Click 事件
[/Quote]
用反射实现,参考:

private void button1_Click(object sender, EventArgs e)//Form2中的Button1_Click
{
Form1 fm = new Form1();
Button btn = fm.Controls["button1"] as Button;
if (btn != null)
{
PropertyInfo pi = btn.GetType().GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);
if (pi != null)
{
EventHandlerList ehl = (EventHandlerList)pi.GetValue(btn, null);
if (ehl != null)
{
FieldInfo fi = (typeof(Control)).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic);
if (fi != null)
{
Delegate d = ehl[fi.GetValue(null)];
if (d != null)
{
d.DynamicInvoke(btn, e);
}
}
}
}
}
}
zgke 2009-05-08
  • 打赏
  • 举报
回复
1 反射事件...
2 其他方法


Form1
Add _AddForm = new Add();
_AddForm .Show();
Button _Button =(Button)a.Controls["button1"];
_Button.PerformClick();
jdhlowforever 2009-05-08
  • 打赏
  • 举报
回复
不好理解
jdhlowforever 2009-05-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ojlovecd 的回复:]
引用 6 楼 wangjun8868 的回复:
引用 4 楼 ojlovecd 的回复:
直接实例化一个Form1对象后调用不就行了吗?何须委托?

不好意思 上面说错了

我是想调用 form1里面 的button2_Click 事件

用反射实现,参考:
C# codeprivatevoidbutton1_Click(objectsender, EventArgs e)//Form2中的Button1_Click{
Form1 fm=newForm1();
Button btn=fm.Controls["button1"]asButton;if(btn!=null)

[/Quote]

难以理解!
normalpeople 2009-05-08
  • 打赏
  • 举报
回复
设成static方法应该就可以
程序海哥 2009-05-08
  • 打赏
  • 举报
回复
这样修改一下就可以了

第一步:

public partial class CarManeger : Form
{
public delegate void MyDelegate(string text);
public event EventHandler MyEvent;

//放在这里
public string str="测试数据";


public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{

}

public void ShowCarNume(string txt)
{
MessageBox.Show(txt);
}
private void button2_Click(object sender, EventArgs e)
{
string str="测试数据";(这个你是要传入一个会变化的字符串吧.哪么不放这里)
ShowCarNume(str);
}
}



第二步:


{

public Add()
{

InitializeComponent();
}


private void button1_Click(object sender, EventArgs e)
{
//怎么在这里用委托调用form1里面的ShowCarNume方法 要用委托

//直接实例化From1
Form1 Frm1=new Form1();

//开始调动ShowCarNume()方法,因为str是公共变量字符串,与你button2字符串str一致的,这样其实就相当
//于你执行了button2
Frm1.ShowCarNume(Frm1.str);



}
}



qgylovelj 2009-05-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wangjun8868 的回复:]
引用 4 楼 ojlovecd 的回复:
直接实例化一个Form1对象后调用不就行了吗?何须委托?

不好意思 上面说错了

我是想调用 form1里面 的button2_Click 事件
[/Quote]

汗水狂掉
ayymbirst 2009-05-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ojlovecd 的回复:]
直接实例化一个Form1对象后调用不就行了吗?何须委托?
[/Quote]

赞同,如果将该方法设为静态 使用 CarManeger.ShowCarNume(),更快 哈哈.
编程有钱人了 2009-05-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ojlovecd 的回复:]
直接实例化一个Form1对象后调用不就行了吗?何须委托?
[/Quote]
不好意思 上面说错了

我是想调用 form1里面 的button2_Click 事件
qldsrx 2009-05-07
  • 打赏
  • 举报
回复
这样不行吗?

private void button1_Click(object sender, EventArgs e)
{
CarManeger form1 = new CarManeger();
string str="测试数据";
form1.ShowCarNume(str);
}

如果不是想创建一个新的form1,你可以将先前的form1对象传递给form2啊。
我姓区不姓区 2009-05-07
  • 打赏
  • 举报
回复
直接实例化一个Form1对象后调用不就行了吗?何须委托?
DREAM_LSQ 2009-05-07
  • 打赏
  • 举报
回复
public partial class Add : Form
{
//声明代理
public delegate void mydelegate(string text);

public Add()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
//设CarManeger类的实例为form1
mydelegate de = new mydelegate(form1.ShowCarNume);
form1.Invoke(de, new object[] {myParameter });//myParameter为要传输的数据
}
}
聖少俊 2009-05-07
  • 打赏
  • 举报
回复
学习
编程有钱人了 2009-05-07
  • 打赏
  • 举报
回复
不要笑 我菜鸟

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧