C#中两个窗体间的函数调用
程序中有两个窗口,窗口1中有listview1控件,操作正常,在窗口1中调用窗口2,然后窗口2若干操作后调用窗口1的某个函数如NetPlay(),返回窗口1的NetPla...
程序中有两个窗口,窗口1中有listview1控件,操作正常,在窗口1中调用窗口2,然后窗口2若干操作后调用窗口1的某个函数如NetPlay(),返回窗口1的NetPlay函数,进入正常(NetPlay中的messagebox能弹出)但是我在操作listview1(如listview1.Items.Clear())的时候无法操作,对程序没有任何的反应,但程序没有报错
也就是说,我进入了从窗口1进入窗口2后,在窗口2中调用窗口1的某个函数,该函数其它一切正常,只是在调用窗口1里面的控件的时候没反应(但也没报错),这是什么原因
相关代码 MiniMedia是窗口1的名字 NetMedia窗口2
MiniMedia某函数()
{
NetMedia Dlg = new NetMedia();
Dlg.ShowDialog(this);
}
窗口2中
MiniMedia MiniMediaClass = new MiniMedia();
NetMedia某函数()
{
MiniMediaClass.NetPlay();//此函数是窗口1中的
}
窗口1中的 NetPlay()
{
MessageBox.Show("哈哈");//正常显示
listView1.Items.Clear();//不起作用,不报错,但是在其他函数中使用正常
}
看到楼下有说传值,我需要的不是传值,传值我会,我需要在窗口2中操作大量窗口1里面的函数,而且是反复调用窗口1窗口2的函数,传值太麻烦 展开
也就是说,我进入了从窗口1进入窗口2后,在窗口2中调用窗口1的某个函数,该函数其它一切正常,只是在调用窗口1里面的控件的时候没反应(但也没报错),这是什么原因
相关代码 MiniMedia是窗口1的名字 NetMedia窗口2
MiniMedia某函数()
{
NetMedia Dlg = new NetMedia();
Dlg.ShowDialog(this);
}
窗口2中
MiniMedia MiniMediaClass = new MiniMedia();
NetMedia某函数()
{
MiniMediaClass.NetPlay();//此函数是窗口1中的
}
窗口1中的 NetPlay()
{
MessageBox.Show("哈哈");//正常显示
listView1.Items.Clear();//不起作用,不报错,但是在其他函数中使用正常
}
看到楼下有说传值,我需要的不是传值,传值我会,我需要在窗口2中操作大量窗口1里面的函数,而且是反复调用窗口1窗口2的函数,传值太麻烦 展开
4个回答
展开全部
你已经跨线程调用控件了,当然无作用也不报错。在Form1中调用当然可以,但在Form2中(另一线程)调用就无效。
delegate ListViewItemClearDelegate();
ListViewItemClearDelegate _dListViewItemClear;
public void Form1_Load()
{
_dListViewItemClear=new ListViewItemClearDelegate(ListViewItemClear);
}
NetPlay()
{
MessageBox.Show("哈哈");//正常显示
ListViewItemClear();
}
public void ListViewItemClear()
{
if(listView1.InvokeRequired)
{
listView1.Invoke(_dListViewItemClea);
}
else
{
listView1.Items.Clear();
}
}
解决思路就这样,代码没有调试过,只是凭印象写的,你试着编译一下。
delegate ListViewItemClearDelegate();
ListViewItemClearDelegate _dListViewItemClear;
public void Form1_Load()
{
_dListViewItemClear=new ListViewItemClearDelegate(ListViewItemClear);
}
NetPlay()
{
MessageBox.Show("哈哈");//正常显示
ListViewItemClear();
}
public void ListViewItemClear()
{
if(listView1.InvokeRequired)
{
listView1.Invoke(_dListViewItemClea);
}
else
{
listView1.Items.Clear();
}
}
解决思路就这样,代码没有调试过,只是凭印象写的,你试着编译一下。
展开全部
凡是窗体间的通信都是采用事件(或者委托:一种特殊的事件)的机制来完成的,因为这才是最佳的方案。像你这样直接调用方法即便有时没有出错也是后患无穷的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个问题很好解决的。。。在programe.cs文件中Application.Run(from)的时候,把form在programe里面把form设置成为静态的窗体
publi static form1 form=new form1();
Application.Run(form1);
之后再运行from2之后,就可以在form2里面通过调用 programe.form.(方法名)......来调用 from1里面公开的方法
publi static form1 form=new form1();
Application.Run(form1);
之后再运行from2之后,就可以在form2里面通过调用 programe.form.(方法名)......来调用 from1里面公开的方法
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
两个窗口间传值用owner,设置一个窗口A是另外一个窗口B的owner,在把窗口B中的数据传到A中就要把窗口A中的空间的Modifiers设置为public,然后在A中定义一个B,就可以让B中的数据传到窗口A中的控件上
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询