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 ...
随机推荐
- UNIX网络编程总结一
客户与服务器通信使用TCP在同一网络通信时,大致按下面的方式通信:client→TCP→IP→以太网驱动程序→以太网→以太网驱动程序→IP→TCP→server.若不在同一网络则需要路由器连接. 客户 ...
- hdu 4655 Cut Pieces(想法题)
Cut Pieces Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Tota ...
- vue 概念与使用vue-cli脚手架快速构建项目
vue 定义:是一套构建用户界面的渐进式框架,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层,它不仅易于上手,还便于与第三方库或既有项目整合. 数据渲染机制: 核心: 响应式数据绑定 ...
- js实时计算价格
//通过数量,单价的输入,实时显示总价 $("#number,#price").on("input",function(e){ $("#totalPr ...
- 设置div 居中 和得到dom元素高度
javascript中获取dom元素高度和宽度的方法如下: 网页可见区域宽: document.body.clientWidth网页可见区域高: document.body.clientHeight网 ...
- 容器(collection)初步
容器(集合)的分类: 泛型(generic):本质是数据类型的参数化(提前告诉编译器,在调用泛型时必须传入实际类型) 例:E即为在主函数中定义的传入的实际类型 class MyCollection&l ...
- 项目中dubbo的标准配置
# Spring boot applicationspring: application: name: hello-dubbo-service-user-provider # UserService ...
- Windows 下搭建 SVN服务器
目录 一 .安装Visual SVN 二.配置SVN 三.安装TortoiseSVN 四.上传项目到远程仓库 五.从远程仓库下载项目 六.检出项目 七.版本回退 参考链接 https://blog ...
- Python---字符串拼接和严格字符串
BIF内建函数 Python3中提供了多少个内置函数 68 Python3中TUling tuling是不是一样的 严格区别大小 “=”和“==”的运用与区别 - ‘=‘ 是用来赋值的 - ...
- Task2.特征提取
参考:https://blog.csdn.net/u012052268/article/details/77825981/ 利用jieba分词工具去除停用词: 停用词:1.在SEO中为节省空间和提高搜 ...