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 ...
随机推荐
- python面向对象--类的内置方法
#isinstance(obj,cls)判断obj是否是类cls的实例 #issubclass(cls,cls1)判断cls是否是cls1的子类或派生类 class Foo: pass class B ...
- ltp-ddt eth_parallel_processing
ETH_S_FUNC_PARALLEL_PROCESSING: source 'common.sh'; prepare_nfs_mount.sh "/mnt/nfs_mount"| ...
- hive之wordcount
1.创建一张表,记录文件数据,使用换行符作为分隔符 create table file_data(content string) row format delimited fields termina ...
- AMROC可视化
备注 通过修改Filetype来改变输出数据的类型. hdf2tab.sh转换全部数据文件 hdf2tab.sh -m多维数据 <!DOCTYPE html PUBLIC "-//W3 ...
- FastDFS整合nginx模块报错
之前在本地虚拟机用的都是5.1的版本和1.12的nginx,在服务器上尝试一下高版本的6.1 一直报错各种,例如: undeclared (first use in this function) 尝试 ...
- 杂项 List
题目 1. 栈 #A 表达式的转换 (Unaccepted) 2. STL 模板库 #B 双栈排序(Unaccepted) #C 垃圾陷阱(Accepted) #D 合并果子(Acc ...
- [CSP-S模拟测试]:chess(搜索+最短路)
题目描述 $pig$在下象棋的时候特别喜欢用马,他总是计算着自己的马还需要几步才能吃掉对方的帅,以及方案数的个数,当然$pig$很笨,所以他只能求助于你.我们假设在$n\times m$的棋盘上,$p ...
- jstl学习资料
jstl印象中叫标准标签库,是apache的一个项目,网址为: Apache Taglibs - Apache Standard Taglib: JSP[tm] Standard Tag Librar ...
- pom里引入lib下的包后编译报 package com.sun.crypto.provider does not exist问题解决
最近正在迭代开发的一个项目编译安装时出现报“package com.sun.crypto.provider does not exist”的错误,由于本人能力水平有限,也是第一次遇到该问题,来来回回折 ...
- Apache检查配置文件语法
Windows环境:httpd -t或者: httpd.exe -w -t -f "C:\Apache2.2\conf\httpd.conf" -d "C:\Apache ...