急!!!C# winForm 不同窗口之间的事件调用问题

leiounasi 2009-04-01 10:53:49
问题是这样的 我想在form1 里面点一个按钮 执行form2的一个按钮的事件 怎么弄~~
我把form2的按钮事件制成pubilc,然后form2 f2 = new from2 在 f2.这个事件,这样不行~我要执行的这个事件比较复杂~
我想到了一种方法~当form1点击这个按钮后 制一个全局变量 from2里面去起一个Timer去循环检测这个变量如果变量变了 就执行from2的这个按钮事件。这样可以实现但是觉得比较白痴~不知道有没有什么注册事件之类的方法?比如我form1点击按钮后form2可以捕获到我这个事件然后去执行我最开始要执行的那个事件~~~~

求达人指点一二~~最好详细点~~我有点白~~~
...全文
582 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
david_anwei 2009-04-01
  • 打赏
  • 举报
回复
这个问题好好反映一下
ztenv 2009-04-01
  • 打赏
  • 举报
回复
一不小心回了两次,不知道CSDN能不能解决这个问题;
ztenv 2009-04-01
  • 打赏
  • 举报
回复

public partial class Form1 : Form
{
Form2 f =null;

IDoMethod dm = null;
public Form1()
{
InitializeComponent();
f = new Form2();
dm = f as IDoMethod;
}

protected override void OnClick(EventArgs e)
{

if (dm != null)
{
dm.Run();
}
}
}


public interface IDoMethod
{
void Run();
}

//以下是form2的代码
public partial class Form2 : Form,IDoMethod
{
Button button1 = new Button();

public Form2()
{
InitializeComponent();
button1.Click += new EventHandler(button1_Click);

}

void button1_Click(object sender, EventArgs e)
{
Run();
}

#region IDoMethod Members

public void Run()
{
MessageBox.Show("Form2.Button1.OnClick");
}

#endregion
}
ztenv 2009-04-01
  • 打赏
  • 举报
回复

public partial class Form1 : Form
{
Form2 f =null;

IDoMethod dm = null;
public Form1()
{
InitializeComponent();
f = new Form2();
dm = f as IDoMethod;
}

protected override void OnClick(EventArgs e)
{

if (dm != null)
{
dm.Run();
}
}
}


public interface IDoMethod
{
void Run();
}

//以下是form2的代码
public partial class Form2 : Form,IDoMethod
{
Button button1 = new Button();

public Form2()
{
InitializeComponent();
button1.Click += new EventHandler(button1_Click);

}

void button1_Click(object sender, EventArgs e)
{
Run();
}

#region IDoMethod Members

public void Run()
{
MessageBox.Show("Form2.Button1.OnClick");
}

#endregion
}
cancerser 2009-04-01
  • 打赏
  • 举报
回复
目前来看 你的第一个方法是最好的解决方案.认真想象 看能不能把你那比较复杂的事件 集中一下
其实你form2的事件和你form1的事件没有关系
使两个事件执行同一方法问题就解决了
leiounasi 2009-04-01
  • 打赏
  • 举报
回复
回复1楼:你说的这个方法我在我的问题里面已经描述了“我把form2的按钮事件制成pubilc,然后form2 f2 = new from2 在 f2.这个事件,这样不行~”
回复2楼:你意思是让我show出form2以后,再手动去点form2的这个按钮??你还没看懂我的问题 我就是要他自动~~~
回复3楼:感觉你这个方法好像靠谱儿~不过太抽象了。。。我看不太懂。。。
cbgn 2009-04-01
  • 打赏
  • 举报
回复
http://blog.csdn.net/cbgn/archive/2009/03/12/3982846.aspx
ztenv 2009-04-01
  • 打赏
  • 举报
回复
抽象一个接口,添加事件响应的操作集合,由form2实现此接口,form1中只对抽象的接口进行操作,可以把form2的实例转为此接口,这样就好了;
cpio 2009-04-01
  • 打赏
  • 举报
回复
要看你两个窗口是什么关系,是在Form1里面创建的Form2的话?

最简单的就是Form2里面公开一个方法

Form1里面:
Form2 m_form2 = new Form2();

Button1_Clicked(...)
{
m_form2.show(this);
}

Button2_Clicked(...)
{
m_form2.Hello();
}

Form2里面:
public Hello()
{
MessageBox.Show(this, "Hello");
}
cja03 2009-04-01
  • 打赏
  • 举报
回复
Form2中的:


public void button1_Click(object sender, EventArgs e)
{

}


调用如:

Form2 form = new Form2();
form.button1_Click(null, null);
leiounasi 2009-04-01
  • 打赏
  • 举报
回复
谢谢 15楼~不过在看你的帖子之前 我已经弄好了~方法和你说的意思很相向~就是要把form1 传给 form2,再在form2里面点取form1里的事件方法就可以了~~感谢楼上给我给我提供的帮助 结贴了~
swalp 2009-04-01
  • 打赏
  • 举报
回复
呵呵。看到这么多高手,来看看他们的代码。要是给那么两分我也不介意。哈哈
ZSW53362465 2009-04-01
  • 打赏
  • 举报
回复
哦,少打个东西

FROM1

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace FormPassEvent
{
public delegate void EventHandler();
public partial class Form1 : Form
{

public event EventHandler Event;
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;


}
Form2 f2;
private void button1_Click(object sender, EventArgs e)
{
Form2 win = (Form2)this.Invoke(new form2(getwin), this);

}

private void button2_Click(object sender, EventArgs e)
{
Event();
}

delegate Form2 form2(Form1 f);
Form2 getwin(Form1 f1)
{
Form2 f2 = new Form2(f1);
f2.Show();
return f2;
}
}
}

FORM2

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace FormPassEvent
{
public partial class Form2 : Form
{

Form1 f;
public Form2(Form1 a)
{

InitializeComponent();

a.Event += new EventHandler(f_Event);
}

void f_Event()
{
button1_Click(null, null);
}



private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("asdfa");
}

private void Form2_Load(object sender, EventArgs e)
{

}
}
}

FROM1中有BUTTON1和BUTTON2
FROM2中有BUTTON1
操作:

点FORM1上的BUTTON1 这是为了让FORM2运行
然后在点FROM1上的BUTTON2,为了触发FORM2上BUTTON1_CLICK事件 弹出消息框asdfa
不知道楼主是不是要这样的效果
如果直接点FORM2上的BUTTON1 弹出消息框asdfa
ZSW53362465 2009-04-01
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace FormPassEvent
{
public delegate void EventHandler();
public partial class Form1 : Form
{

public event EventHandler Event;
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;


}
Form2 f2;
private void button1_Click(object sender, EventArgs e)
{
Form2 win = (Form2)this.Invoke(new form2(getwin), this);

}

private void button2_Click(object sender, EventArgs e)
{
Event();
}

delegate Form2 form2(Form1 f);
Form2 getwin(Form1 f1)
{
Form2 f2 = new Form2(f1);
f2.Show();
return f2;
}
}
}

FORM2

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace FormPassEvent
{
public partial class Form2 : Form
{

Form1 f;
public Form2(Form1 a)
{

InitializeComponent();

a.Event += new EventHandler(f_Event);
}

void f_Event()
{
button1_Click(null, null);
}



private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("asdfa");
}

private void Form2_Load(object sender, EventArgs e)
{

}
}
}

FROM1中有BUTTON1和BUTTON2
FROM2中有BUTTON1
操作:

点FORM1上的BUTTON1 这是为了让FORM2运行
然后在点FROM1上的BUTTON2,为了触发FORM2上BUTTON1_CLICK事件
不知道楼主是不是要这样的效果
ztenv 2009-04-01
  • 打赏
  • 举报
回复
那就是逻辑问题了,是另外的问题了;
leiounasi 2009-04-01
  • 打赏
  • 举报
回复
回复lianshaohua:你的方法我试了,和我form2 f2 = new from2 在 f2.这个事件 报一样的错~我这个事件是一个结束事件~里面要关掉一些线程,而这样form2 f2 = new from2 初始化这个form2 这些线程没有被初始化 所以这样直接结束会报错(这是我的推理。。。可能不对~~)

回复liujiayu10:我很想试试你的方法。。。但是不知道 你的着两块代码那个是写在我的form1里的 那个是写在form2里的。。。。还请指点
liujiayu10 2009-04-01
  • 打赏
  • 举报
回复

FrmSel form = new FrmSel();
form.MyEvent += new MyDelegate(form_MyEvent);
form.ShowDialog();

void form_MyEvent(string text, string tag)
{
txtcDepCode.Text = text;
txtcDepCode.Tag = tag;
}

//FrmSel.cs:

public delegate void MyDelegate(string text, string tag);
public partial class FrmSel : Form
{
public event MyDelegate MyEvent;

private void btnOK_Click(object sender, EventArgs e)
{
string tmpName = "aaaaaaaaa";
string tmpCode = "bbbbbbb";
this.MyEvent(tmpName, tmpCode);
this.Close();
}

}
liujiayu10 2009-04-01
  • 打赏
  • 举报
回复
委托

FrmSel form = new FrmSel();
form.MyEvent += new MyDelegate(form_MyEvent);
form.ShowDialog();

void form_MyEvent(string text, string tag)
{
txtcDepCode.Text = text;
txtcDepCode.Tag = tag;
}

FrmSel.cs:

public delegate void MyDelegate(string text, string tag);
public partial class FrmSel : Form
{
public event MyDelegate MyEvent;

private void btnOK_Click(object sender, EventArgs e)
{
string tmpName = "aaaaaaaaa";
string tmpCode = "bbbbbbb";
this.MyEvent(tmpName, tmpCode);
this.Close();
}

}

110,534

社区成员

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

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

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