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 ...
随机推荐
- Linux学习之旅(一)Linux常用命令
pwd命令 显示当前所在的目录 ls命令 显示目录下的子目录和文件 ls 显示当前目录下的子目录和文件 ls -a 显示当前目录下的所以子目录和文件(包括隐藏文件和文件夹) ls -al 显 ...
- Jenkins构建触发器(定时构建项目)
如上图所示,Jenkins通常通过点击“立即构建”来进行手动构建项目,其实也可以使用配置中的 Poll SCM和Build periodically来进行定时自动构建项目: 在“配置”——>“构 ...
- count(*),count(1),count(列名)的区别
count(*)和count(1)无任何差别,永远优于count其他字段只要存在普通索引,count就会使用普通索引,只存在主键时,count(*)和或count(1)会使用主键索引 count(a) ...
- vue兄弟组件之前传信
1.使用vuex 2.子传父,父传子 3.使用中央事件总线 1.新建一个js文件,然后引入vue 实例化vue 最后暴露这个实例 2.在要用的组件内引入这个组件 3.通过vueEmit.$emit(' ...
- Task1.PyTorch的基本概念
1.什么是Pytorch,为什么选择Pytroch? PyTorch的前身便是Torch,其底层和Torch框架一样,但是使用Python重新写了很多内容,不仅更加灵活,支持动态图,而且提供了Pyth ...
- LeetCode--046--全排列(java)
给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1 ...
- python每日练习0730
""" 1. 现有面包.热狗.番茄酱.芥末酱以及洋葱,数字显 示有多少种订购组合, 其中面包必订,0 不订,1 订,比如 10000,表示只订购面包 "&quo ...
- php array_slice()函数 语法
php array_slice()函数 语法 作用:在数组中根据条件取出一段值,并返回.大理石平台支架 语法:array_slice(array,start,length,preserve) 参数: ...
- php大文件断点续传
该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开始. 如何分 ...
- HelloServlet类继承HttpServlet利用HttpServletResponse对象
HelloServlet类继承HttpServlet利用HttpServletResponse对象 HelloServlet类的doGet()方法先得到username请求参数,对其进行中文字符编码转 ...