子窗体获取父窗体中控件值的问题~

tckoo 2009-04-12 02:03:54
在我的winform窗体里有一个listview用来显示我的查询结果,现在我需要选中一项结果,然后点击窗体上的按钮新建一个子窗体,这个窗体用来修改刚才选中的那项结果,这个窗体有个textbox,我要完成的是在加载这个窗体的时候,就是在窗体的load事件中,在textbox里显示在listview中选中的那项结果,我该怎么实现呢?现在假设那项结果中有编号、姓名、性别这3项吧,子窗体中有textbox1、textbox2、textbox3这3个控件分别显示结果中的3项,我在子窗体的load事件中的代码是:
Form2 ff = new Form2();
if (ff.listView2.SelectedItems.Count > 0)
{
textBox1.Text = ff.listView2.SelectedItems[0].Text;
textBox2.Text = ff.listView2.SelectedItems[0].SubItems[1].Text;
textBox3.Text=ff.listView2.SelectedItems[0].SubItems[2].Text;
}
并没有报错,可是运行后在子窗体的textbox中却没有数据,请问这是什么原因呢?该怎么改啊?请各位帮帮忙啊。
...全文
1043 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
super06man 2010-08-21
  • 打赏
  • 举报
回复
不知道楼主的问题解决了没有?
sushou2009 2009-04-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fuqiang19871117 的回复:]
C# code
//主窗体
string str1= ff.listView2.SelectedItems[0].Text;
string str2= ff.listView2.SelectedItems[0].SubItems[1].Text;
string str3=ff.listView2.SelectedItems[0].SubItems[2].Text;
Form2 frm=new Form2 (str1,str2,str3);//子窗体
frm.Show();
//子窗体Form2
string str1,str2,str3;
public Form2(str1,str2,str3)
{
this.str1=str1;
this.str2=str2;
t…
[/Quote]
帮顶正解..
sillf 2009-04-12
  • 打赏
  • 举报
回复
楼上的方法最简单,赞同
dawnbear 2009-04-12
  • 打赏
  • 举报
回复
父窗体打开子窗体的时候 把父窗体传过去 this
子窗体里面初始化方法里面 在子窗体里面定义一个父窗体对象 就可以获取了
zhangkunit 2009-04-12
  • 打赏
  • 举报
回复
第一种方法 :利用构造函数 和上面的实现类似
第二种方法:第一字符串或者stringBuilder对象把你要修改的所有的值按某种规则放进去
通过子窗体SubForm的Tag传过去,在子窗体内完成解析,后在传回来
在主窗体的代码可以是:
SubForm sf=new SubForm()
if(sf.ShowDialog()==DialogResult.Ok)
{
解析sf.Tag函数
}.
第三种 定义一个类 包含你所要传递的信息把要修该得信息放进这个类的对象中 通过Tag实现即可
sunny906 2009-04-12
  • 打赏
  • 举报
回复
用构造函数实现:
Form1代码:
private void Form1_Load(object sender, EventArgs e) //初始化listview
{
listView2.Columns.Add("编号");
listView2.Columns.Add("姓名");
listView2.Columns.Add("性别");
ListViewItem lvi = listView2.Items.Add("1001");
lvi.SubItems.Add("aa");
lvi.SubItems.Add("男");
ListViewItem lvi1 = listView2.Items.Add("1002");
lvi1.SubItems.Add("cc");
lvi1.SubItems.Add("女");
listView2.View = View.Details;
}

private void button5_Click(object sender, EventArgs e)
{
for (int i = 0; i < listView2.Items.Count; i++)
{
if(listView2.Items[i].Selected)
{
l1 = listView2.Items[i].Text.ToString().Trim();
ListViewItem lvi = listView2.Items[i];
l2 = lvi.SubItems[1].Text;
l3 = lvi.SubItems[2].Text;
}
}
Form2 f2 = new Form2(l1,l2,l3); //实例化Form2
f2.ShowDialog();
}
Form2代码:
public Form2(string l1,string l2,string l3) //定义构造函数
{
InitializeComponent();
textBox1.Text = l1;
textBox2.Text = l2;
textBox3.Text = l3;
}
lishuhua19820919 2009-04-12
  • 打赏
  • 举报
回复
这个问题我也遇到过,我是这样实现的。
看你的代码知道,Form2是主窗体。
这里假设子窗体是FormSub.
首先在子窗体声明成员函数private Form2 main,其次修改子窗体的构造函数Formmain()
Formmain(Form2 main)
{
...
this.main = main;
}
然后在主窗体中新建事件函数中写入如下代码:
FormSub sub = new FormSub(this);
sub.showDialog();
并且将listView2的声明由private改为public.

最后在子窗体的Load函数中添加如下代码:
if (main.listView2.SelectedItems.Count > 0)
{
textBox1.Text = main.listView2.SelectedItems[0].Text;
textBox2.Text = main.listView2.SelectedItems[0].SubItems[1].Text;
textBox3.Text=main.listView2.SelectedItems[0].SubItems[2].Text;
}

lishuhua19820919 2009-04-12
  • 打赏
  • 举报
回复
这个问题我也遇到过,我是这样实现的。
看你的代码知道,Form2是主窗体。
这里假设子窗体是FormSub.
首先在子窗体声明成员函数private Form2 main,其次修改子窗体的构造函数Formmain()
Formmain(Form2 main)
{
...
this.main = main;
}
然后在主窗体中新建事件函数中写入如下代码:
FormSub sub = new FormSub(this);
sub.showDialog();
并且将listView2的声明由private改为public.

最后在子窗体的Load函数中添加如下代码:
if (main.listView2.SelectedItems.Count > 0)
{
textBox1.Text = main.listView2.SelectedItems[0].Text;
textBox2.Text = main.listView2.SelectedItems[0].SubItems[1].Text;
textBox3.Text=main.listView2.SelectedItems[0].SubItems[2].Text;
}

FAFA2008 2009-04-12
  • 打赏
  • 举报
回复
用属性传递就行了,给楼主一个简单例子

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

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

private void Form1_Load(object sender, EventArgs e)
{
// 测试数据
listBox1.Items.Add("a");
listBox1.Items.Add("b");
listBox1.Items.Add("c");
listBox1.Items.Add("d");
}

private void button1_Click(object sender, EventArgs e)
{
int index = listBox1.SelectedIndex;
if (index == -1)
{
MessageBox.Show("请选择", "error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
else
{
string itemtext = listBox1.Items[index].ToString();
Form2 form2 = new Form2();
form2.Item = itemtext;
if (form2.ShowDialog() == DialogResult.OK)
{
listBox1.Items[index] = form2.Item;
}
}
}
}
}

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

namespace WindowsApplication1
{
public partial class Form2 : Form
{
private string item = "";

public Form2()
{
InitializeComponent();
}

public string Item
{
get { return item; }
set { item = value; }
}

private void Form2_Load(object sender, EventArgs e)
{
textBox1.Text = Item;
}

private void button1_Click(object sender, EventArgs e)
{
Item = textBox1.Text;
this.DialogResult = DialogResult.OK;
}
}
}
whowhen21 2009-04-12
  • 打赏
  • 举报
回复
可以把那个控件设置成公共的,然后就可以访问的,但是在show、之前要加上:ff.Owner = this;
fatinmidage 2009-04-12
  • 打赏
  • 举报
回复
这个Form2是主窗体吧?
我假设这个Form2是主窗体,SubForm是子窗体,修改SubForm的构造函数
public SubForm3(string strID,string strName,string strSex)
{
InitializeComponent();
textBoxID.Text = strID;
textBoxName.Text = strName;
textBoxSex.Text = strSex;
}
主窗口每次新建子窗口的时候,记得把参数传过去给子窗口的这个构造函数就行了
68435970 2009-04-12
  • 打赏
  • 举报
回复

//主窗体
string str1= ff.listView2.SelectedItems[0].Text;
string str2= ff.listView2.SelectedItems[0].SubItems[1].Text;
string str3=ff.listView2.SelectedItems[0].SubItems[2].Text;
Form2 frm=new Form2 (str1,str2,str3);//子窗体
frm.Show();
//子窗体Form2
string str1,str2,str3;
public Form2(str1,str2,str3)
{
this.str1=str1;
this.str2=str2;
this.str3=str3;
}
public void Form2_Load(object sender, EventArgs e)
{
textBox1.Text = str1;
textBox2.Text = str2;
textBox3.Text=str3;
}
行者无疆-Kevin 2009-04-12
  • 打赏
  • 举报
回复
Form2 ff = new Form2();
了解new的含义,它在内存中重新声明了一个地址.属性没有默认的都是空的.

所以你不能用new ,
用构造函数将Form2传递过来就好了.

110,545

社区成员

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

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

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