读书人

?c# 有两个窗口怎么调用另一窗口的

发布时间: 2012-09-09 09:27:54 作者: rapoo

求助?c# 有两个窗口,如何调用另一窗口的控件?
Form1 有个listbox1,Form2有个textbox1,button1.
最终结果:按form2的button1按钮,把textbox1.text的值添加到form1的listbox1中

本人试过把listbox1设成public,
在form2中
private void button2_Click(object sender, EventArgs e)
{
Form1 pForm1=new Form1();
pForm1.listbox1.items.add(textbox1.text);
}


经过试验。。。form1中的listbox1没反应。。没出错,没有添加到任何东西!!
如何做才对??知道的各位大侠能否告诉一下小弟!

[解决办法]
private void button2_Click(object sender, EventArgs e)
{
Form1 pForm1=Form1(Application.OpenForms["Form1"]);
pForm1.listbox1.items.add(textbox1.text);
}

要理解new的意思,既然写了new,那就是新生成的一个实例,跟你已经存在的Form1不是一回事
[解决办法]
Form1 pForm1=new Form1();
pForm1没有显示啊!怎么看啊?
[解决办法]
//form1 调用
Form2 frm=new Form2();
form.ShowDialog (this);

private void button2_Click(object sender, EventArgs e)
{
Form1 pForm1=( Form1)this.Owner;
pForm1.listbox1.items.add(textbox1.text);
}

*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码)

http://feiyun0112.cnblogs.com/
[解决办法]
form1中加入:
Form2 dlg = new Form2();
dlg.Owner = this;
dlg.ShowDialog();
同时设置listBox1的属性为public

form2中加入:
private void button1_Click(object sender, EventArgs e)
{
Form1 pForm1 = (Form1)this.Owner;
pForm1.listBox1.Items.Add(textBox1.Text);
}
[解决办法]

探讨
private void button2_Click(object sender, EventArgs e)
{
Form1 pForm1=Form1(Application.OpenForms["Form1"]);
pForm1.listbox1.items.add(textbox1.text);
}

要理解new的意思,既然写了new,那就是新生成的一个实例,跟你已经存在的Form1不是一回事

[解决办法]
C# code
((ListBox)Application.OpenForms["Form1"].Controls.Find("listbox1", true)[0]).Items.Add(textbox1.text);
[解决办法]
探讨
private void button2_Click(object sender, EventArgs e)
{
Form1 pForm1=Form1(Application.OpenForms["Form1"]);
pForm1.listbox1.items.add(textbox1.text);
}

要理解new的意思,既然写了new,那就是新生成的一个实例,跟你已经存在的Form1不是一回事

[解决办法]
Form1 pForm1=new Form1();
-------------
这句将生成一个隐藏的Form,因为你没让这个form show出来.
在form2中需要一个form1的引用,要保证他就是你要的那个form1.

Form1 pForm1=(Form1)Application.OpenForms["Form1"]

这么做可以得到之前的对象,然后再按你那么做就可以了.
[解决办法]
private void button2_Click(object sender, EventArgs e)
{
Form1 pForm1=Form1(Application.OpenForms["Form1"]);
pForm1.listbox1.items.add(this.textbox1.text);
}

[解决办法]
在form2 中定一事件 clickEvent;


form2 的button_click,事件
button_click(object sender,evetargs e)
{
if(clickEvent!=null)
clickEvent(this,e);
}


form1 中在建form2的象
form2 frm=new form2();
frm.clickEvent+=new EventHandle(addItem);


frm.show();


private void addItem(object sender,eventArgs e)
{
form2 frm=sender as form2;
this.listbox1.items.add(frm.textBox1.text);
}

包你可以!!

[解决办法]

探讨
引用:
跨窗口的控件访问,  要砍头的, 非常SB的做法.


这种简单问题用事件、委托、参数不觉得杀鸡用牛刀么,练ms都觉得提供个OpenForms比较省事,而且绝对不会错,把简单事情复杂化,孤芳自赏,标榜技术没有意义,

[解决办法]
探讨

public static FormCollection OpenForms { get; }

这个跟暴露窗体内控件对象有何相同的地方吗?

稍微上点规模的程序都不建议将控件 public 出来, 不知道你说的复杂化来自哪里.

如果这也算作孤芳自赏, 标榜技术, 那你对技术的理解也忒低了.

[解决办法]
委托事件
form1
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

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

private void button1_Click(object sender, EventArgs e)
{
Form2 f = new Form2();
f.Show();
f.Myevet += new Form2.Mydel(f_Myevet);
}

void f_Myevet(string str)
{
listBox1.Items.Add(str);
//throw new NotImplementedException();
}
}
}

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

namespace WindowsFormsApplication1
{
public partial class Form2 : Form
{
public delegate void Mydel(string str);
public event Mydel Myevet;
public Form2()
{
InitializeComponent();
}

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

读书人网 >C#

热点推荐