C# form 传参数的几个方法
方法一:传值
最先想到的,Form2构造函数中接收一个string类型参数,即Form1中选中行的文本,将Form2的TextBox控件的Text设置为该string,即完成了Form1向Form2的传值。当Form2的AcceptChange按钮按下,需要修改Form1中ListBox中相应列的值,因此可以考虑同时将Form1中的ListBox控件当参数也传入Form2,所有修改工作都在Form2中完成,根据这个思路,Form2代码如下:
-
<pre name="code" class="csharp">public partial class Form2 : Form
-
{
-
private string text;
-
private ListBox lb;
-
private int index;
-
-
//构造函数接收三个参数:选中行文本,ListBox控件,选中行索引
-
-
public Form2(string text,ListBox lb,int index)
-
{
-
this.text = text;
-
this.lb = lb;
-
this.index = index;
-
InitializeComponent();
-
this.textBox1.Text = text;
-
}
-
private void btnChange_Click(object sender, EventArgs e)
-
{
-
string text = this.textBox1.Text;
-
this.lb.Items.RemoveAt(index);
-
this.lb.Items.Insert(index, text);
-
this.Close();
-
}
-
}
Form1中new窗体2时这么写:
-
public partial class Form1 : Form
-
{
-
int index = 0;
-
string text = null;
-
public Form1()
-
{
-
InitializeComponent();
-
}
-
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
-
{
-
if (this.listBox1.SelectedItem != null)
-
{
-
text = this.listBox1.SelectedItem.ToString();
-
index = this.listBox1.SelectedIndex;
-
//构造Form2同时传递参数
-
Form2 form2 = new Form2(text, listBox1, index);
-
form2.ShowDialog();
-
}
-
}
-
}
OK,方法一的解决方法就是这样,好处是直观,需要什么就传什么,缺点也是显而易见的,如果窗体1中需要修改的是一百个控件,难道构造的时候还传100个参数进去?况且如果其他窗体仍然需要弹Form2,那Form2就废了,只能供窗体1使用,除非写重载的构造函数,不利于代码的复用,继续看下一个方法。
方法二:继承
这个方法我试了很多次,继承的确可以做,但是麻烦不说,还不方便,因此个人认为如果为了互相操作数据而使用继承,是不合适的,但既然是个方法,就扔出来看看,实际作用≈0。
Form2:
-
//声明Form2继承于Form1
-
public partial class Form2 : Form1
-
{
-
public int index;
-
public ListBox lb;
-
public Form2(string text)
-
{
-
//将继承过来的listBox设置为不可见
-
this.listBox1.Visible=false;
-
InitializeComponent();
-
this.textBox1.Text = text;
-
}
-
private void btnChange_Click(object sender, EventArgs e)
-
{
-
string text = this.textBox1.Text;
-
this.lb.Items.RemoveAt(index);
-
this.lb.Items.Insert(index, text);
-
this.Close();
-
}
-
}
Form1:
-
public partial class Form1 : Form
-
{
-
public int index = 0;
-
public string text = null;
-
public Form1()
-
{
-
InitializeComponent();
-
}
-
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
-
{
-
if (this.listBox1.SelectedItem != null)
-
{
-
text = this.listBox1.SelectedItem.ToString();
-
index = this.listBox1.SelectedIndex;
-
Form2 form2 = new Form2(text);
-
//构造完Form2后,为Form2中各参数赋值
-
form2.lb = this.listBox1;
-
form2.index = index;
-
form2.Show();
-
}
-
}
-
}
这里有几点问题需要注意,Form2中各属性需要哪种赋值方法?从Java过渡来的都知道,Java继承中在子类中使用关键字super可以访问基类中公有的方法及参数,而C#中super换成了base,那是不是意味着我们可以在Form2中这么为参数赋值呢?
this.lb=base.listBox1;
this.index=base.index;
OK,第二种写法没问题,可以保存index值,但是对ListBox控件,这么赋值就会出问题,通过测试我发现,base.listBox1指向的是子类继承过来的listBox1对象,并不是基类自己的listBox1对象。因此我们猜测,那base.index值是不是也是指向子类的index呢?测试一下发现的确是这样,因此this.index=base.index等于没写,去掉照样可以用,因为index一样被Form2继承过来了,因此我们可以了解到,C#中的窗体继承通过base.控件是无法操作基类控件的。
方法三:事件回调
既然C#有事件这个东西,为啥不用呢,而且事件在窗体通信方面,有着更为方便的作用,我们知道事件实际上就是状态的捕获,在最后我会举一个捕获状态的例子,先看数据互相操作的例子。
Form2:
-
//定义一个需要string类型参数的委托
-
public delegate void MyDelegate(string text);
-
public partial class Form2 : Form1
-
{
-
//定义该委托的事件
-
public event MyDelegate MyEvent;
-
public Form2(string text)
-
{
-
InitializeComponent();
-
this.textBox1.Text = text;
-
}
-
private void btnChange_Click(object sender, EventArgs e)
-
{
-
//触发事件,并将修改后的文本回传
-
MyEvent(this.textBox1.Text);
-
this.Close();
-
}
-
}
Form1:
-
public partial class Form1 : Form
-
{
-
public int index = 0;
-
public string text = null;
-
public Form1()
-
{
-
InitializeComponent();
-
}
-
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
-
{
-
if (this.listBox1.SelectedItem != null)
-
{
-
text = this.listBox1.SelectedItem.ToString();
-
index = this.listBox1.SelectedIndex;
-
Form2 form2 = new Form2(text);
-
//注册form2_MyEvent方法的MyEvent事件
-
form2.MyEvent += new MyDelegate(form2_MyEvent);
-
form2.Show();
-
}
-
}
-
//处理
-
void form2_MyEvent(string text)
-
{
-
this.listBox1.Items.RemoveAt(index);
-
this.listBox1.Items.Insert(index, text);
-
}
-
}
可以看出,使用事件做是很方便的,并且不需要传递那么多参数,不需要有继承关系,且提高了代码重用,因此在一般的需求下,建议这么使用。最后说一下事件的状态捕获:
当点Form1中的ShowForm2按钮时,弹出Form2,且在TextBox里写入"Show Form2",当点Form2中Form2Close按钮时,关闭Form2,且将Form1的TextBox文本改为"Close Form2",这就是一个状态的捕获过程,常用在应用程序的状态栏。
Form1:
-
public partial class Form1 : Form
-
{
-
public Form1()
-
{
-
InitializeComponent();
-
}
-
private void button1_Click(object sender, EventArgs e)
-
{
-
Form2 form2 = new Form2();
-
this.textBox1.Text = "Show Form2";
-
form2.MyEvent += new EventHandler(form2_MyEvent);
-
form2.Show();
-
}
-
void form2_MyEvent(object sender, EventArgs e)
-
{
-
this.textBox1.Text = "Close Form2";
-
}
-
}
Form2:
-
public partial class Form2 : Form
-
{
-
public event EventHandler MyEvent;
-
public Form2()
-
{
-
InitializeComponent();
-
}
-
private void button1_Click(object sender, EventArgs e)
-
{
-
MyEvent(sender,e);
-
this.Close();
-
}
-
}
From : http://www.cnblogs.com/Asa-Zhu/archive/2012/12/06/2805074.html
转自https://blog.csdn.net/u011981242/article/details/48785639
C# form 传参数的几个方法的更多相关文章
- 微信小程序传参数的几种方法
1,navigator 跳转时 wxml页面(参数多时可用“&”) <navigator url='../index/index?id=1&name=aaa'></n ...
- EXPRESS项目PM2启动NODE_ENV传参数不生效问题解决方法
expree项目开发完,涉及到不同环境,要在启动到时候就要配置好环境变量, packge.json文件如下: "scripts": { "dev": " ...
- setintervalue传参数的三种方法
http://www.cnblogs.com/wkylin/archive/2012/09/07/2674911.html http://www.bhcode.net/article/20110822 ...
- 【ASP.NET Core】给中间件传参数的方法
最近博客更新频率慢了些,原因有三: 其一,最近老周每星期六都录 ASP.NET Core 的直播,有些内容在视频里讲过,就不太想在博客里面重复.有兴趣的话可以去老周的微博看,或者去一直播,直播帐号与微 ...
- 传参数应该用哪种形式——值、引用、指针?
类型:C++ & Qt4,创建时间:十二月 30, 2011, 7:43 p.m. 标题无"转载"即原创文章,版权所有.转载请注明来源:http://hgoldfish.c ...
- 编程写一个方法时,注意方法中传参数的数量最好不要超过5个,超过5个怎么办?可以用struct或class,或一个字典类
图 1 一.从图1发现了什么问题呢? 答案:1.参数传的的太多了:2.另外注释也没写好. 说明:一个方法中,传参数的数量最好不要超过5个. 应该采用:struct或class,或一个字典类都行.其中 ...
- ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 用javascript在客户端删除某一个cookie键值对 input点击链接另一个页面,各种操作。 C# 往线程里传参数的方法总结 TCP/IP 协议 用C#+Selenium+ChromeDriver 生成我的咕咚跑步路线地图 (转)值得学习百度开源70+项目
ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 我们都知道在使用WebApi的时候Controller会自动将Action的返回值自动进行各种序列化处理(序列化为 ...
- mvc中多参数URL会很长,首次加载不传参数让url很短,路由规则实现方法[bubuko.com]
如要实现列表中地址全路径“bubuko-11-2.html”,在首次进入时,使用短路径“bubuko.html”,只有再次href后才显示全路径“bubuko-11-2.html”,下面使用路由规则来 ...
- C语言 数组做函数参数不传数组个数的遍历方法
//数组做函数参数不传数组个数的遍历方法 #include<stdio.h> #include<stdlib.h> #include<string.h> void ...
随机推荐
- 3-基于双TMS320C6678+双XC6VSX315T的6U VPX高速数据处理平台
基于双TMS320C6678+双XC6VSX315T的6U VPX高速数据处理平台 一.板卡概述 板卡由我公司自主研发,基于VPX架构,主体芯片为两片 TI DSP TMS320C6678,两片V ...
- nginx http正向代理简单配置及systemd 配置
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #erro ...
- 一篇文章理解JS数据类型、深拷贝和浅拷贝
前言 笔者最近整理了一些前端技术文章,如果有兴趣可以参考这里:muwoo blogs.接下来我们进入正片: js 数据类型 六种 基本数据类型: Boolean. 布尔值,true 和 false. ...
- RMQ Message ACK
原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11808680.html 消息持久化机制 消息丢失了,需要将队列持久化,即将autoDelete设置成f ...
- Atcoder2134 Zigzag MST
问题描述 We have a graph with N vertices, numbered 0 through N−1. Edges are yet to be added. We will pro ...
- hdu 4641K-string SAM的O(n^2)算法 以及 SAM+并查集优化
转载:http://www.cnblogs.com/hxer/p/5675149.html 题意:有一个长度为n(n < 5e4)的字符串,Q(Q<=2e5)次操作:操作分为:在末尾插入一 ...
- C#通过文件头判断文件的类型(不是后缀名)
FileStream fs=new FileStream(@"D:\6",FileMode.Open,FileAccess.Read); BinaryReader reader= ...
- Nexus Repository OSS 3安装配置使用
Nexus Repository OSS 3是一个开源的仓库管理系统,提供了更加丰富的功能,而且安装.配置.使用起来也更加简单方便.OSS 3版本主要支持的仓库(Repository)包括如下: bo ...
- CAD到ArcGIS相关操作
1.Ctrl+N(新建图形)→复制原数据,粘贴到原坐标 2.将CAD数据转为矢量数据方法众多,此处将提供三种方法: 方法一:CAD转地理数据库注记 在[ArcToolBox]窗口中,双击[转换工具]→ ...
- Jira中的Tempo查看component以及issue的工作量汇总
在右侧group by的地方,同时选中component和issue