请教个winform窗体传值的问题

jdps200 2010-11-17 09:18:34
网上看了一些窗体传值的方法,自己试了下,都是可用的

现在遇到个问题

我的winform main界面利用tabcontrol做了个动态加载窗体的效果,那每个窗体被加载后其实就是一个tabpage

这时候再用窗体传值的方法传值的话,就会报错,不能强制转换类型

请教这时候如何实现窗体传值?谢谢!
...全文
171 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
whrspsoft3723 2010-11-17
  • 打赏
  • 举报
回复

类型为“窗体传值.Form1”的对象强制转换为类型“窗体传值.Form2”。
显然,是类型错误造成的。 建议跟踪下程序,看下 Form2 f2 = (Form2)this.Owner;
this.owner是什么类型?
你这种作法耦合度有点高, 建议你声明一个接口,进行解耦。

public form1{

interfacea x;
}

public interface interfacea{
void Notify_Form2(YourData);
}


这样,你通知改变的窗体可以是N多个, 只要实现不同的接口就可以了。

看似麻烦,其实,你收获得会更多。













ZengHD 2010-11-17
  • 打赏
  • 举报
回复
Form1:
private void button1_Click(object sender, EventArgs e)
{
Form2 frm = new Form2();
frm.TopLevel = false;
frm.Parent = this.tabControl1.TabPages[0];
frm.Show();
}


Form2:
private void button1_Click(object sender, EventArgs e)
{
Form3 frm = new Form3(this);
frm.Show();
}

public void SetText(string strText)
{
textBox1.Text = strText;
}


Form3:
public partial class Form3 : Form
{
private Form2 frm2 = null;
public Form3(Form2 frm)
{
InitializeComponent();
frm2 = frm;
}

private void button1_Click(object sender, EventArgs e)
{
if (frm2 != null)
{
frm2.SetText(textBox1.Text);
}
}
}
#blackheart 2010-11-17
  • 打赏
  • 举报
回复
ref 关键字,写一个传值的方法,
colorall 2010-11-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zenghd 的回复:]
C# code

Form1:
private void button1_Click(object sender, EventArgs e)
{
Form2 frm = new Form2();
frm.TopLevel = false;
frm.Parent = this.tabCont……
[/Quote]Smart
colorall 2010-11-17
  • 打赏
  • 举报
回复
说明this.Owner是Form1
ZengHD 2010-11-17
  • 打赏
  • 举报
回复
    
Form1:
private void button1_Click(object sender, EventArgs e)
{
Form2 frm = new Form2();
frm.TopLevel = false;
frm.Parent = this.tabControl1.TabPages[0];
frm.Show();
}


Form2:
private void button1_Click(object sender, EventArgs e)
{
Form3 frm = new Form3();
frm.OnSetText += SetText;
frm.Show();
}

public void SetText(string strText)
{
textBox1.Text = strText;
}


Form3:
public delegate void SetText(string strText);
public event SetText OnSetText;

private void button1_Click(object sender, EventArgs e)
{
if (OnSetText != null)
{
OnSetText(textBox1.Text);
}
}
jdps200 2010-11-17
  • 打赏
  • 举报
回复
很感谢LS的回答,可能是我表述不清楚,我举个例子

现在我有3个窗体,form1,form2,form3

form1有一个button和一个tabcontrol,form2有一个textbox和button,form3有一个textbox和button

在form1里点击butto会加载form2到tabcontrol里,这时form2作为一个tabpage了,实际我使用时,是多个form被动态加载作为tabpage的,页签顺序是不固定的!

然后在form2里点击button,出现form3,在form3中的textbox随便输入后,点击form3的button,我希望出现的效果是form2的textbox中出现和form3中一样的字符串,form3中的button代码:

public Form3()
{
InitializeComponent();
}

public string strtxt;

private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = (Form2)this.Owner;
strtxt =textBox1 .Text ;
f2.textBox1.Text = strtxt;
this.Close();
}

但实际运行中会报这样的错:

无法将类型为“窗体传值.Form1”的对象强制转换为类型“窗体传值.Form2”。

我请教的是这种情况的窗体传值,是要动态适用的,谢谢!
ZengHD 2010-11-17
  • 打赏
  • 举报
回复
        private void Form1_Load(object sender, EventArgs e)
{
Form frm = new Form();
frm.TopLevel = false;
frm.Parent = this.tabControl1.TabPages[0];
this.tabControl1.TabPages[0].Tag = frm;
frm.Show();
}

private void button1_Click(object sender, EventArgs e)
{
if (this.tabControl1.TabPages[0].Tag != null)
{
((Form)this.tabControl1.TabPages[0].Tag).Text = "ddd";
}
}
jdps200 2010-11-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zenghd 的回复:]
没有区别,一样的
代码
[/Quote]

我的意思是,目前我用的是这样的传值代码:

在form2中
Form1 f1 = ( Form1 ) this.Owner;


问题是 1,不能用个new方法传值
2此时我使用的form,在窗体中应该算tabpage,而不是form了吧

ZengHD 2010-11-17
  • 打赏
  • 举报
回复
没有区别,一样的
代码

111,129

社区成员

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

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

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