问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

winform 数据的传递 如何把一个窗体上控件获取的值传递到另一个窗体的控件上?

发布网友 发布时间:2022-04-27 14:56

我来回答

5个回答

懂视网 时间:2022-04-27 19:17

实际上过去我也写过类似的主题,这里把各种方法总结一下,内容的确基础了一些,所以这篇文章是写给刚刚学习C#的同行们的,希望对大家有些帮助吧!很抱歉,这篇文章没有诡异的bug来勾起大家的兴趣,但是下篇文章我会努力写些有趣的主题的!

在窗体间传递数据的方法比较多:
1,在子窗体中自定义一个构造函数,参数类型是主窗体,当要显示子窗体的时候,就用这个构造函数来实例化子窗体,然后把this指针传进去,说起来太抽象了,我大概一写大家应该就明白了:
代码如下:


public class frmMain:Form
{
...
frmControl controlForm=new frmControl(this);
controlForm.Show();
}
public class frmControl:Form //子窗体,用来控制主窗体的某些显示!
{
private frmMain mainForm;
public frmControl(frmMain mainForm)
{
this.mainForm=mainForm;
}
private void button1_Click(object sender,EventArgs e)
{
frmMain.textBox1.Text=this.textBox1.Text; //把子窗体的文本框值传递给主窗体的文本框!
}
}

2,我个人感觉上面的方法不是很好,虽然实现起来很简单,只是想改变窗体的标题文本,就把整个主窗体的引用都传递给子窗体,这样的方式不是很幽雅,我们用接口来改进上面的方法,这样可以限制暴露给子窗体的功能,降低窗体之间的耦合度:
代码如下:

public interface IChangeTitle:
{
void ChangeTitle(string title);
}
public class frmMain:Form,IChangeTitle
{
...
frmControl controlForm=new frmControl(this);
controlForm.Show();
public void ChangeTitle(string title)
{
this.Text=title;
}
}
public class frmControl:Form //子窗体,用来控制主窗体的某些显示!
{
private IChangeTitle ichangeTitle;
public frmControl(IChangeTitle ichangeTitle)
{
this.ichangeTitle=ichangeTitle;
}
private void button1_Click(object sender,EventArgs e)
{
ichangeTitle.ChangeTitle(this.textBox1.Text); //通过接口来调用方法
}
}

3,为了进一步降低窗体之间的耦合度,我们可以用委托来实现这个需求:
代码如下:

public partial class ChildForm : Form
{
public delegate void TitleChangedHandler(string title);
public TitleChangedEventHandler TitleChanged;
public ChildForm()
{
InitializeComponent();
}
private void btn_Ok_Click(object sender, EventArgs e)
{
if (TitleChanged != null)
TitleChanged("Test Title"); //委托调用
}
}

主窗体给委托变量赋值就可以了:
代码如下:

public partial class MainForm : Form
{
private ChildForm loginForm = new ChildForm();
public MainForm()
{
InitializeComponent();
loginForm.TitleChanged = new ChildForm.TitleChangedEventHandler(FormTitleChanged);
}
protected void FormTitleChanged(string title)
{
this.Text = title;
}
private void button1_Click(object sender, EventArgs e)
{
loginForm.Show();
}
}

4,也可以在子窗体中定义一个自定义的事件,然后自定义一个事件参数,用来传递你想传递的一些信息:
代码如下:

public partial class ChildForm : Form
{
public class TitleChangedEventArgs : EventArgs //事件参数类
{
private string title = "";
public string Title
{
get
{
return title;
}
set
{
title = value;
}
}
}
public delegate void TitleChangedEventHandler(object sender, TitleChangedEventArgs e);
public event TitleChangedEventHandler TitleChanged;
public ChildForm()
{
InitializeComponent();
}
private void btn_Ok_Click(object sender, EventArgs e)
{
TitleChangedEventArgs e1=new TitleChangedEventArgs();
e1.Title="Login sucessed";
OnTitleChanged(e1);//触发事件
}
protected virtual void OnTitleChanged(TitleChangedEventArgs e) //触发事件的方法
{
if (TitleChanged != null)
TitleChanged(this, e);
}
}

主窗体订阅这个事件就可以了:
代码如下:

public partial class MainForm : Form
{
private ChildForm loginForm = new ChildForm();
public MainForm()
{
InitializeComponent();
loginForm.TitleChanged += new ChildForm.TitleChangedEventHandler(FormTitleChanged);
}
protected void FormTitleChanged(object sender, ChildForm.TitleChangedEventArgs e)
{
this.Text = e.Title;
}
private void button1_Click(object sender, EventArgs e)
{
loginForm.Show();
}
}


通过子窗口向外引发一个事件,父窗口去实现该事件,我们可以再不关闭父窗口和子窗口的情况下进行数据的传输显示

思路:在子窗口“添加用户”的中通过点击"添加用户",会动态的向外引发一个事件,通过该事件,我们可以进行数据传递

在其他窗口中,可以来响应该事件

其中,子窗口只负责向外引发一个事件,将事件的实现方法委托给别的对象,至于事件具体如何做处理,子窗口是不关心的,这一点体现了松耦合的一个设置

涉及到的知识点:
如何定义一个事件?
代码如下:
public delegate void UserAddEventHandler();
public event UserAddEventHandler UserAdd;
.如何响应子窗口引发出来的事件?

userDialog.UserAdd += userDialog_UserAdd;//将UserAdd的实现委托为userDialog_UserAdd方法

void userDialog_UserAdd()
{
  //方法体
}
.子窗口中如何向父窗口传递数据?

通过delegate的声明中,添加两个参数:

public delegate void UserAddEventHandler(object sender,UserEventArgs e);

其中UserEventArgs是一个继承自EventArgs的类

public class UserEventArgs : EventArgs
{
public User currentUser { get;set;}
public UserEventArgs(User user)
{
this.currentUser = user;
}
}
从而,在向外引发事件的时候,将User的信息通过第二个参数传递出去

private void button1_Click(object sender, EventArgs e)
{
//向外引发一个事件
if(UserAdd!=null)
{
User user = new User();
user.UserName = textBox3.Text;
user.PassWord = textBox4.Text;
UserAdd(this,new UserEventArgs(user));
}
}
在父窗口的userDialog_UserAdd方法中,就可以对接收到的数据进行处理
private void 添加用户ToolStripMenuItem_Click(object sender, EventArgs e)
{
  FrmUser userDialog = new FrmUser();
  //将UserAdd的实现委托为userDialog_UserAdd方法
  userDialog.UserAdd += userDialog_UserAdd;

  userDialog.ShowDialog();
}

void userDialog_UserAdd(object sender,UserEventArgs e)
{
  MessageBox.Show(e.currentUser.UserName);
}

热心网友 时间:2022-04-27 16:25

两种方式:
1.构造函数中。2,以属性形式

第一种方法:
FormB构造时
private Image _image;
public FormB(Image image)
{
this._image = image;
}
FormA点击按钮时:
FormB formB = new FormB(this.picturebox1.Image);
formB.Show();

第二种方法:
FormB种设置属性:
private Image _myImage;
public Image MyImage
{
get;set;
}
FormA点击按钮时:
FormB formB = new FormB();
formB.MyImage = this.picturebox1.Image;
formB.Show();

热心网友 时间:2022-04-27 17:43

在B窗体里写一个public setImage(Image img)函数
用于设置B的PictureBox
然后在按钮中调用B的这个函数就行了

热心网友 时间:2022-04-27 19:18

利用句柄。。。

热心网友 时间:2022-04-27 21:09

方法1:
在B窗体中添加一个构造函数,如:
fromB(Image img)
{
picturebox.Image=img;
}
A窗体的按钮事件:
fromB frm = new fromB(picturebox.Image);
frm.Show();

方法2:
在B窗体中添加方法,如:
public SetImage(Image img)
{
picturebox.Image=img;
}
A窗体的按钮事件:
fromB frm = new fromB();
frm.SetImage(picturebox.Image);
frm.Show();
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
Surfer Babe歌词 剁椒蒸?的做法 冲销支出是什么意思6 清蒸洞庭鱼的家常做法是什么? 肌肤保养做到位 秋天防晒很重要 长秋痱子怎么办 痱子和湿疹的图片对比 佛山市顺德区的邮政编码是多少 C语言文本文档写上代码后,要怎么样生成程序呀? 用记事本编代码怎么运行啊 商标注册流程,如何申请商标注册,办理商标注册的程序 CAD前置命令是什么? CAD画图的时候,字和线画在一起看不清,怎么能把字悬浮于线上啊??? 奇秀我填好的主播申请表给公会的一个人,他说他帮我交给官方,会不会有风险 我想做个传奇直播主播!老是没人气!听他们说要加什么工会!怎么加? 奇秀做主播,加什么家族好??奇秀最短签约多久,奇秀必须每天直播么 脑筋急转弯:26个字母哪个最恨你? 在爸爸的关爱中,我长大了 800字作文 谁能帮我写个《万氏兄弟与中国动画》的小论文1500字左右 求用友通财务软件正确安装步骤 用友财务软件学习 用友通财务软件的使用 用友通财务软件如何设置凭证行数 用友通财务软件,出月末报表的整个流程步骤如何? 6G的视频文件怎么传输到移动硬盘上 6G的视频怎么上传到网上? 初三英语保护环境行动作文带翻译考试型的 求速度 加赏金啊》》》《《 英语环保作文(有翻译) 工行信用卡贷款额度 我刚还完工行车贷信用卡可以在工行办张高额度的信用卡吗 篮坛最美裁判亓浩想打篮球吗? 二本b类大三学生,要不要考研? 2019年3X3黄金联赛全国总决赛男子组合肥队员都有谁? 亓浩楠找女朋友,谁愿意? 宽带连接时用户名和密码不对怎么办? 路由器密码输入正确而连接时却显示网络密码不正确是什么原因 元旦是不是中国节日 元旦是我国传统节日吗? 有关土地流转合同条款的理解 录音棚上了大众点评后如何经营? qq群成员的等级怎么升 冥北霖长什么样 我要写一部关于古代女生探案的小说,主角名字叫什么好? 跪求 好看的 奇幻小说 不要垃圾 C#窗体间传值的几种方法总结 w10系统蓝屏什么原因 w10系统蓝屏问题怎么解决? 求助刚刚装的w10-1703,老是蓝屏 沃支付怎么解绑银行卡 问…沃钱包怎么解除和银行卡的绑定