在C_中使用foreach语句实现调用其它窗体上的控件

合集下载

在C_中使用foreach语句实现调用其它窗体上的控件

在C_中使用foreach语句实现调用其它窗体上的控件

开发研究与设计技术本栏目责任编辑:谢媛媛为了适应Internet的快速发展,微软自2000年推出了.NET战略,反映了微软这位软件巨人对未来软件的思考,囊括了微软所有的最新技术成果,从而掀起了计算机领域的一场革命;特别是目前最新的MicrosoftVisualStudio2005集成开发环境中,微软提供了VisualBasic、VisualC#、VisualJ#和VisualC++四种编程语言实现.NET技术,毫无疑问,VisualC#语言是.NET技术的核心开发语言,是.NET新技术最忠实的实践者和实现者。

由于.NET技术采用结构化程序设计思想,所有控件都封装在各自的窗体中,为了尽量最小占用系统资源,在C#项目中的一个窗体不能调用其它窗体的控件;而我们在实际开发中又经常会遇到调用其它窗体的控件的情形,特别是在项目中采用一个父窗体多个子窗体架构时,这种调用不可避免的。

要进行这种调用,稍有编程经验的人首先想到将需要被调用的控件所在的窗体作为当前窗体的函数参数传递过来,然后调用。

如下程序实现在当前窗体Form1调用中窗体Form2。

首先在Form1的构造函数中把Form2加进去,如:classform1:Form{form2myForm;publicform1(form2f){this.myForm=f;}}然后在Form1中通过this.myForm就可以调用Form2了,这时如果你有this.myForm.Text=”aaaaa”这样的语句确实能够实现,但是this.myForm在Form1中只是表示一个窗体容器,这也就意味着你只能调用窗体的共有属性如Visible、Width等属性,如果你仅想对一个窗体的共有属性或某个特定控件进行操作,如对活动控件进行操作,可以在Form2中用“this.ActiveControl=this.But-ton1;”把按钮Button1指定为活动控件,然后在Form1中“Buttonm=(Button)this.myForm.ActiveControl;m.PerformClick();”从而执行对Form2中Button的Click事件。

C_中foreach遍历的用法2015

C_中foreach遍历的用法2015

ppC#中foreach遍历的用法分类:C#2012-04-29 13:56 367人阅读评论(1) 收藏举报c#存储stringforeach循环用于列举出集合中所有的元素,foreach语句中的表达式由关键字in隔开的两个项组成。

in右边的项是集合名,in左边的项是变量名,用来存放该集合中的每个元素。

该循环的运行过程如下:每一次循环时,从集合中取出一个新的元素值。

放到只读变量中去,如果括号中的整个表达式返回值为true,foreach块中的语句就能够执行。

一旦集合中的元素都已经被访问到,整个表达式的值为false,控制流程就转入到foreach块后面的执行语句。

foreach语句经常与数组一起使用,下面实例将通过foreach语句读取数组的值并进行显示。

数组的属性:Array.Length数组的容量利用这个属性,我们可以取得数组对象允许存储的容量值,也就是数组的长度、元素个数,这个比较好理解,数组还有其他的属性,比如数组的维数等,属性的用法比较简单,学会一种,其他的格式基本一致,这里我们就不举例了。

当数组的维数、容量较多时,C#提供了foreach语句,专门用来读取集合/数组中的所有元素,我们把这种功能叫做遍历。

语法书写如下:遍历数组:foreach(type objName in collection/Array)这段语句会逐一检查数组中的所存储的变量值,并且一一将其取出,其中的type是你所要读取的数组对象将要存储在objName变量的数据类型,而objName是定义了一个type类型的变量名,代表每一次从集合和数组(collection/Array)中取得的元素,collection/Array 则是所要存取的数组对象。

用这种方法只需写一个foreach就可以遍历出除交错数组以外的所有维数的数组。

注:objName的数据类型type必须与collection/Array对象的类型相同或比它大。

jstl中c:forEach的用法

jstl中c:forEach的用法

jstl中c:forEach的⽤法1.<c:forEach>标签的作⽤:迭代输出标签内部的内容。

它既可以进⾏固定次数的迭代输出,也可以依据集合中对象的个数来决定迭代的次数。

2.<c:forEach>标签,需要与el表达式联合使⽤3. <c:forEach>标签的语法定义如下所⽰。

<c:forEach var="每个变量名字" items="要迭代的list" varStatus="每个对象的状态"begin="循环从哪⼉开始" end="循环到哪⼉结束" step="循环的步长">循环要输出的东西</c:forEach>4.<c:forEach>标签具有以下⼀些属性:var:迭代参数的名称。

在迭代体中可以使⽤的变量的名称,⽤来表⽰每⼀个迭代变量。

类型为String。

items:要进⾏迭代的集合。

对于它所⽀持的类型将在下⾯进⾏讲解。

varStatus:(varStatus="status")迭代变量的名称,⽤来表⽰迭代的状态,可以访问到迭代⾃⾝的信息。

begin:如果指定了items,那么迭代就从items[begin]开始进⾏迭代;如果没有指定items,那么就从begin开始迭代。

它的类型为整数。

end:如果指定了items,那么就在items[end]结束迭代;如果没有指定items,那么就在end结束迭代。

它的类型也为整数。

step:迭代的步长。

5. 不论是对整数还是对集合进⾏迭代,<c:forEach>的varStatus属性所起的作⽤相同。

和var属性⼀样,varStatus⽤于创建限定了作⽤域的变量(改变量只在当前标签体内起作⽤)。

不过,由varStatus属性命名的变量并不存储当前索引值或当前元素,⽽是赋予javax.servlet.jsp.jstl.core.LoopTagStatus类的实例。

foreach continue用法

foreach continue用法

foreach continue用法
"foreach"循环是一种迭代集合中元素的语法结构,其中"continue"关键字用于跳过当前迭代并继续下一个迭代。

使用"foreach continue"可以在循环体内根据满足特定条件时跳过当前元素的处理,直接进入下一个元素的处理。

以下是一个使用"foreach continue"的示例:
```csharp
List<int> numbers = new List<int>{ 1, 2, 3, 4, 5 };
foreach (int number in numbers)
{
if (number % 2 == 0)
{
continue; // 如果数字是偶数,则跳过当前迭代
}
Console.WriteLine(number);
}
```
在上面的示例中,我们遍历一个数字列表,并查找奇数值。

当遇到偶数时,使用"continue"关键字跳过当前迭代,直接进入下一个迭代。

只有奇数才会被打印输出。

输出结果:
```
1
3
5
```
使用"foreach continue"可以灵活地控制在循环中跳过特定的元素迭代,以满足特定条件下的需求。

在C#中子线程如何操作主线程中窗体上控件

在C#中子线程如何操作主线程中窗体上控件

在C#中⼦线程如何操作主线程中窗体上控件在C#中,直接在⼦线程中对窗体上的控件操作是会出现异常,这是由于⼦线程和运⾏窗体的线程是不同的空间,因此想要在⼦线程来操作窗体上的控件,是不可能简单的通过控件对象名来操作,但不是说不能进⾏操作,微软提供了Invoke的⽅法,其作⽤就是让⼦线程告诉窗体线程来完成相应的控件操作。

要实现该功能,基本思路如下:把想对另⼀线程中的控件实施的操作放到⼀个函数中,然后使⽤delegate代理那个函数,并且在那个函数中加⼊⼀个判断,⽤InvokeRequired 来判断调⽤这个函数的线程是否和控件线程处于同⼀线程中,如果是则直接执⾏对控件的操作,否则利⽤该控件的Invoke或BeginInvoke⽅法来执⾏这个代理。

⽰例代码如下:1 using System;2 using System.Collections.Generic;3 using System.Windows.Forms;45 using System.Threading;67 namespace ⼦线程操作主线程窗体上的控件8 {9 public partial class frmMain : Form10 {11 /********************** 定义该类的私有成员 **************************/1213 /// <summary>14 /// 定义⼀个队列,⽤于记录⽤户创建的线程15 /// 以便在窗体关闭的时候关闭所有⽤于创建的线程16 /// </summary>17 private List<Thread> ChaosThreadList;1819 /********************** 该类的初始化相关函数 ************************/2021 /// <summary>22 /// 窗体的初始化函数,初始化线程队列ChaosThreadList23 /// </summary>24 public frmMain()25 {26 InitializeComponent();27 ChaosThreadList = new List<Thread>();28 }2930 /// <summary>31 /// 窗体的关闭事件处理函数,在该事件中将之前创建的线程全部终⽌32 /// </summary>33 /// <param name="sender"></param>34 /// <param name="e"></param>35 private void frmMain_FormClosed(object sender, FormClosedEventArgs e)36 {37 if (ChaosThreadList.Count > 0)38 {39 //编列⾃定义队列,将所有线程终⽌40 foreach (Thread tWorkingThread in ChaosThreadList)41 {42 tWorkingThread.Abort();43 }44 }45 }4647 /**************************** 定义该类的⾃定义函数 ***********************/4849 /// <summary>50 /// 定义⼀个代理51 /// </summary>52 /// <param name="index"></param>53 /// <param name="MSG"></param>54 private delegate void DispMSGDelegate(int index,string MSG);5556 /// <summary>57 /// 定义⼀个函数,⽤于向窗体上的ListView控件添加内容58 /// </summary>59 /// <param name="iIndex"></param>60 /// <param name="strMsg"></param>61 private void DispMsg(int iIndex,string strMsg)62 {63 if (this.lstMain.InvokeRequired==false) //如果调⽤该函数的线程和控件lstMain位于同⼀个线程内64 {65 //直接将内容添加到窗体的控件上66 ListViewItem lvi = new ListViewItem();67 lvi.SubItems[0].Text = iIndex.ToString();68 lvi.SubItems.Add(strMsg);69 this.lstMain.Items.Insert(0, lvi);70 }71 else //如果调⽤该函数的线程和控件lstMain不在同⼀个线程72 {73 //通过使⽤Invoke的⽅法,让⼦线程告诉窗体线程来完成相应的控件操作74 DispMSGDelegate DMSGD = new DispMSGDelegate(DispMsg);7576 //使⽤控件lstMain的Invoke⽅法执⾏DMSGD代理(其类型是DispMSGDelegate)77 this.lstMain.Invoke(DMSGD, iIndex, strMsg);7879 }80 }8182 /// <summary>83 /// 定义⼀个线程函数,⽤于循环向列表中添加数据84 /// </summary>85 private void Thread_DisplayMSG()86 {87 for (int i = 0; i < 10000; i++)88 {89 DispMsg(i + 1, "Welcome you : " + (i + 1).ToString());90 Thread.Sleep(10);91 }92 }9394 /******************************* 定义该类的事件处理函数 ********************************/9596 /// <summary>97 /// 【开始】按钮的单击事件处理函数,新建⼀个线程向窗体上的ListView控件填写内容98 /// </summary>99 /// <param name="sender"></param>100 /// <param name="e"></param>101 private void btnBegin_Click(object sender, EventArgs e)102 {103 //创建⼀个新的线程104 Thread tWorkingThread = new Thread(Thread_DisplayMSG);105106 //将新建的线程加⼊到⾃定义线程队列中,以便在窗体结束时关闭所有的线程107 ChaosThreadList.Add(tWorkingThread);108109 //开启线程110 tWorkingThread.Start();111 }112113 }114 }这样⼦就可以实现⽤⼦线程去操作主线程窗体上的控件的内容,同时,⼜不影响主线程对窗体上其他控件的响应。

foreach insert用法

foreach insert用法

foreach insert用法
Foreach Insert用法是指在编程中使用循环遍历和插入数据的一种常见方法。

该方法常用于数据处理和数据插入操作,可以提高代码的效率和可读性。

在编程中,Foreach Insert用法通常用于处理集合或数组中的数据,并将其逐个插入到数据库或其他数据存储中。

以下是几种常见的Foreach Insert用法的描述:
1. 对于数组的Foreach Insert用法:
当需要将数组中的每个元素插入到数据库中时,可以使用foreach循环遍历数组,并在每次迭代中插入当前元素的值。

这样可以避免使用传统的for循环和索引变量来追踪当前元素的位置,使代码更加简洁和易于理解。

2. 对于集合的Foreach Insert用法:
对于集合类对象,如List、ArrayList等,也可以使用foreach循环来遍历集合中的每个元素,并将其插入到数据库中。

这种方法同样可以简化代码,并提高可读性。

3. 对于数据表的Foreach Insert用法:
在数据库操作中,有时需要将一个数据表中的数据插入到另一个数据表中。

使用Foreach Insert可以循环遍历源数据表中的每一行,并逐个插入到目标数据表中,以实现数据的复制或迁移。

总结:
Foreach Insert用法是一种常见的数据处理和插入方法,适用于数组、集合和数据表等数据结构。

通过使用foreach循环遍历每个元素,并将其插入到目标数据存储中,可以提高代码效率和可读性。

在实际编程中,我们可以根据具体需求选择和灵活运用该方法,以实现数据的遍历和插入操作。

C#中foreach实现原理详解

C#中foreach实现原理详解

C#中foreach实现原理详解本⽂主要记录我在学习C#中foreach遍历原理的⼼得体会。

对集合中的要素进⾏遍历是所有编码中经常涉及到的操作,因此⼤部分编程语⾔都把此过程写进了语法中,⽐如C#中的foreach。

经常会看到下⾯的遍历代码:var lstStr = new List<string> { "a", "b" };foreach (var str in lstStr){Console.WriteLine(str);}实际此代码的执⾏过程:var lstStr = new List<string> {"a", "b"};IEnumerator<string> enumeratorLst = lstStr.GetEnumerator();while (enumeratorLst.MoveNext()){Console.WriteLine(enumeratorLst.Current);}会发现有GetEnumerator()⽅法和IEnumerator<string>类型,这就涉及到可枚举类型和枚举器的概念。

为了⽅便理解,以下为⾮泛型⽰例:// 摘要:// 公开枚举器,该枚举器⽀持在⾮泛型集合上进⾏简单迭代。

public interface IEnumerable{// 摘要:// 返回⼀个循环访问集合的枚举器。

//// 返回结果:// 可⽤于循环访问集合的 System.Collections.IEnumerator 对象。

IEnumerator GetEnumerator();}实现了此接⼝的类称为可枚举类型,是可以⽤foreach进⾏遍历的标志。

⽅法GetEnumerator()的返回值是枚举器,可以理解为游标。

// 摘要:// ⽀持对⾮泛型集合的简单迭代。

public interface IEnumerator{// 摘要:// 获取集合中的当前元素。

C#学习之自定义类实现foreach

C#学习之自定义类实现foreach

C#学习之⾃定义类实现foreach本⼈初学C#,本⽂仅供个⼈整理思路⽤,那⾥说得不对,请⼤家多多指教,万分感激!本⽂⽬的:通过实现 IEnumerable 接⼝,使得⾃定义类能使⽤foreach语句来遍历⾃⾝元素前提知识:数组可以被foreach语句遍历数组中的元素,原因是所有数组的基类都是System.Array ,⽽System.Array 类实现了IEnumerable 接⼝,可以通过GetEnumerator⽅法按需提供⼀个叫做枚举数(enumerator)的对象,枚举数可以依次返回请求的数组的元素。

(注:C#⾥⾯的枚举数,也就是枚举器,类似于C++中的迭代器,⽽C#中的迭代器是另外⼀个意思。

不知我这样理解对否?)第⼀部分:通过继承IEnumerable接⼝实现foreach语句第⼀步:创建Person类View Code1public class Person2 {3string Name;4int Age;56public Person(string name, int age)7 {8 Name = name;9 Age = age;10 }1112public override string ToString()13 {14return"Name: " + Name + "\tAge: " + Age;15 }16 }第⼆步:创建PeopleEnum类,该类继承IEnumerator接⼝,实现IEnumerator接⼝⾥的MoveNext、Reset⽅法和Current属性View Code1public class PeopleEnum : IEnumerator2 {3private Person[] _people;4int position = -1;56public PeopleEnum(Person[] list)7 {8 _people = list;9 }1011public bool MoveNext()12 {13 position++;14return (position < _people.Length);15 }1617public void Reset()18 {19 position = -1;20 }2122public object Current23 {24get25 {26return _people[position];27 }28 }2930 }第三步:创建People类,该类继承IEnumerable接⼝,实现了GetEnumerator⽅法,GetEnumerator⽅法的作⽤是获取枚举数(返回值是IEnumerator类型的,就是枚举数的类型),在这⾥是通过返回PeopleEnum类的⼀个实例来取得枚举数。

C#中FOREACH详细用法

C#中FOREACH详细用法
第三个要说的就是 foreach 完成类型转换操作,这种体现可能通过如上的例子看不出任何效 果,但是对于 ArrayList 之类的数据集来说,这种操作就显得比较突出,例如:
// Init an arraylist object int[] nArray = new int[100]; ArrayList arrInt = new ArrayList(); arrInt.AddRange( nArray );
第二个好处就是对于多维数组操作用 foreach 就非常简便了,例如: int[,] nVisited = new int[8,8]; // Use "for" to loop two-dimension array for( int i = 0; i < nVisited.GetLength(0); i++ ) for( int j = 0; j < nVisited.GetLength( 1 ); j++ ) Debug.WriteLine( nVisited[i,j].ToString() );
Debug.WriteLine( nArray[i].ToString() );
// Another way using "for" to loop array int nLength = nArray.Length; for( int i = 0; i < nLength; i++ )
Debug.WriteLine( nArray[i].ToString()之后对于 IEnumerator 的对象也进行 Dispose 处理。
对于 foreach 说了这么多好处,那么在使用它是否可以无懈可击呢。其实不是这样的,在 foreach 语句中有两个限制,第一不能修改枚举成员,其次不要对集合进行删除操作。也就 是如下两种方式都是错误的。

c#使用foreach遍历类中的对象

c#使用foreach遍历类中的对象

c#使用foreach遍历类中的对象foreach可以对字符串数组,list集合等进行遍历,但是它如何对普通类进行遍历呢,使得我们可以对类中的对象属性进行操作呢。

在这里我简单总结了三种方法,使得foreach可以对普通类进行遍历。

关于IEnumerable与IEnumeratorIEnumerable是一个非常简单的接口,它仅仅包含了一个返回IEnumerator接口对象的抽象方法:GetEnumerator()。

而IEnumerator接口提供了一个属性和两个抽象方法分别是:object Current { get; }bool MoveNext();void Reset();Current表示遍历的集合的当前元素,MoveNext()实现移动Enumerator(枚举器)到下一个位置,Reset()顾名思义,即重置枚举器。

那么,这就说明实现该接口的集合都可以进行foreach遍历。

所以我们会发现list集合有继承IEnumerable接口并实现了GetEnumerator()方法,从而实现了枚举器的功能。

类似的Array等集合类都有实现该接口。

那么我们所写的普通类只要实现了该接口,就可以进行foreach遍历。

一. 使用yield return1. 实现定义一个person类,如下:class Person{public string name;public int age;public string sex;public Person(string name, int age, string sex){ = name;this.age = age;this.sex = sex;}}然后定义一个PeopleInfo类,这个类中记录了多个Person对象,放在一个对象数组中。

如果想遍历这个类获取这些对象信息,那就需要实现IEnumerable接口中的GetEnumerator()方法,如下:class PeopleInfo:IEnumerable{public Person[] person;public PeopleInfo(Person[] persons){this.person = new Person[persons.Length];for (int i = 0; i < persons.Length; i++){this.person[i] = persons[i];}}IEnumerator IEnumerable.GetEnumerator(){for (int i = 0; i < person.Length; i++){yield return person[i];}}}在GetEnumerator使用了yield return,它会在GetEnumerator中for每循环一次就会返回一个对象。

在C#中如何在窗体间访问其他窗体中的成员呢

在C#中如何在窗体间访问其他窗体中的成员呢

在C#中如何在窗体间访问其他窗体中的成员呢经常在百度知道里面看到有朋友问这个问题.也经常打字回答.现在懒了.写这篇文章希望能一劳永逸.环境:VS2005(.NET2.0)+WindowsXp WinForm开发在C#中如何在窗体间访问其他窗体中的成员呢?红色字体为需要注意的地方方法一:重载构造函数新建2个窗体.分别为Form2和Form3Form2中有一个TextBox,名字为textBox1.如图所示:现在我想通过Form3里面的代码.来修改Fomr2中的textBox1的内容该怎么办呢??我们来重载Form3的构造函数.Form3代码如下:public partial class Form3 : Form{private Form target = null;public Form3(){InitializeComponent();}public Form3(Form form){InitializeComponent();target = form;}private void button1_Click(object sender, EventArgs e){target.Controls["textBox1"].Text = "你是猪";}}这样通过button1的点击可以修改Form2的textBox1的值.当然这种情况下Form3必须是由Form2打开的.Form2打开Form3的代码如下:Form3 form = new Form3(this);form.Show();点击Form3的button1结果如下:方法二:使用静态成员Form2代码如下:public partial class Form2 : Form{public Form2(){InitializeComponent();}public static string MySqlString = "";}在Form3中可以直接通过类访问该变量.代码如下private void button1_Click(object sender, EventArgs e) {//target.Controls["textBox1"].Text = "你是猪";Form2.MySqlString = "select * from UserInfo";}控件同样也可以声明为static的.但是你要确保你的窗体只有一个实例.否则会出错..(十分不推崇把控件声明为static的.成员变量还可以)方法三:设置Owner属性(基本等同与重载构造)同样Form3必须是由Form2打开的.Form2打开Fomr3的代码:Form3 form = new Form3();form.Owner = this;form.ShowDialog();Form3操作Form2控件的代码如下:private void button1_Click(object sender, EventArgs e){this.Owner.Controls["textBox1"].Text = "你是猪";}。

C#的foreach语句

C#的foreach语句

C#的foreach语句foreach语句是在C#中新引入的,C和C++中没有这个语句,而Visual Basic的程序员应该对它不会陌生。

它表示收集一个集合中的各个元素,并针对各个元素执行内嵌语句。

语句的格式为:foreach(type identifier in expression)embedded-statement其中类型(type)和标识符(identifier)用来声明循环变量,表达式(expression)对应集合。

每执行一次内嵌语句,循环变量就依次取集合中的一个元素代入其中。

在这里,循环变量是一个只读型局部变量,如果试图改变它的值或将它作为一个ref或out类型的参数传递,都将引发编译时的错误。

foreach语句中的expresssion必须是集合类型,如果该集合的元素类型与循环变量类型不一致,则必须有一个显示定义的从集合中的元素类型到循环变量元素类型的显式转换。

集合的概念相信大家都不陌生,它表示一组相同或相似的数据项总的描述。

那么在C#中,究竟什么样的类型算是集合类型呢?我们从语法上给出集合类型的定义:●该类型必须支持一个形为Getenumerator()的公有的非静态方法,该方法的返回类型为结构、类或接口。

●形为GetEumerator()的方法返回的结构、类或接口应当包含一个公有的非静态的方法MoveNext(),该方法的返回类型为布尔型。

●形为GetEumerator()的方法返回的结构、类或接口应当包含一个公有的非静态的属性Current,该属性可以读出。

如果一个类型同时满足以上三个条件,该类型称为集合类型。

Current属性的类型叫作该集合类型的元素类型。

我们姑且不论集合类型的具体形式,只从foreach语句的使用角度举一个例子。

假设Prime是一个满足条件的集合类型,它的元素类型为0到1000以内的质数。

MyInt是我们自定义的一个类型,其范围为200到300之间的整数。

C#中用foreach语句遍历数组及将数组作为参数的用法

C#中用foreach语句遍历数组及将数组作为参数的用法

C#中⽤foreach语句遍历数组及将数组作为参数的⽤法对数组使⽤ foreachC#提供 foreach 语句。

该语句提供⼀种简单、明了的⽅法来循环访问数组或任何可枚举集合的元素。

foreach 语句按数组或集合类型的枚举器返回的顺序处理元素,该顺序通常是从第 0 个元素到最后⼀个元素。

例如,以下代码创建⼀个名为numbers 的数组,并使⽤ foreach 语句循环访问该数组:int[] numbers = { 4, 5, 6, 1, 2, 3, -2, -1, 0 };foreach (int i in numbers){System.Console.Write("{0} ", i);}// Output: 4 5 6 1 2 3 -2 -1 0借助多维数组,你可以使⽤相同的⽅法来循环访问元素,例如:int[,] numbers2D = new int[3, 2] { { 9, 99 }, { 3, 33 }, { 5, 55 } };// Or use the short form:// int[,] numbers2D = { { 9, 99 }, { 3, 33 }, { 5, 55 } };foreach (int i in numbers2D){System.Console.Write("{0} ", i);}输出:9 99 3 33 5 55但对于多维数组,使⽤嵌套的 for 循环可以更好地控制数组元素。

将数组作为参数传递数组可作为实参传递给⽅法形参。

由于数组是引⽤类型,因此⽅法可以更改元素的值。

将⼀维数组作为参数传递可以将初始化的⼀维数组传递给⽅法。

例如,下⾯的语句将数组发送到 print ⽅法。

int[] theArray = { 1, 3, 5, 7, 9 };PrintArray(theArray);下⾯的代码显⽰ print ⽅法的部分实现。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

开发研究与设计技术
本栏目责任编辑:谢媛媛
为了适应Internet的快速发展,微软自2000年推出了.NET战略,反映了微软这位软件巨人对未来软件的思考,囊括了微软所有的最新技术成果,从而掀起了计算机领域的一场革命;特别是目前最新的MicrosoftVisualStudio2005集成开发环境中,微软提供了VisualBasic、VisualC#、VisualJ#和VisualC++四种编程语言实现.NET技术,毫无疑问,VisualC#语言是.NET技术的核心开发语言,是.NET新技术最忠实的实践者和实现者。

由于.NET技术采用结构化程序设计思想,所有控件都封装在各自的窗体中,为了尽量最小占用系统资源,在C#项目中的一个窗体不能调用其它窗体的控件;而我们在实际开发中又经常会遇到调用其它窗体的控件的情形,特别是在项目中采用一个父窗体多个子窗体架构时,这种调用不可避免的。

要进行这种调用,稍有编程经验的人首先想到将需要被调用的控件所在的窗体作为当前窗体的函数参数传递过来,然后调用。

如下程序实现在当前窗体Form1调用中窗体Form2。

首先在Form1的构造函数中把Form2加进去,如:
classform1:Form
{form2myForm;
publicform1(form2f){this.myForm=f;}}
然后在Form1中通过this.myForm就可以调用Form2了,这时如果你有this.myForm.Text=”aaaaa”
这样的语句确实能够实现,但是this.myForm在Form1中只是表示一个窗体容器,这也就意味着你只能调用窗体的共有属性如Visible、Width等属性,如果你
仅想对一个窗体的共有属性或某个特定控件进行操作,如对活动控件进行操作,可以在Form2中用“this.ActiveControl=this.But-
ton1;”
把按钮Button1指定为活动控件,然后在Form1中“Buttonm=(Button)this.myForm.ActiveControl;m.PerformClick();”
从而执行对Form2中Button的Click事件。

但是窗体Form2一般情况下也是要接受用户操作的,你不能保证该Button一直是活动控件,并且,假如需要对Form2中多个控件进行操作呢?而该思路无法对目标窗体上的普通控件进行操作,并且这种企图把整个窗体(仅传递窗体名代表的地址不能解决问题)作为参数来传递是任何一个优秀程序员所不能容许的。

推荐采用foreach语句,在下面的程序中利用foreach语句“
遍历”的功能,实现在“遍历”父窗体中当前活动子窗体的所有控件,
找到并调用其Name中包含“打印”的按钮,执行该按钮的Click事件,类似如Word中主菜单的“打印”选项。

foreach(Formmychildinthis.MdiChildren)
{if(this.ActiveMdiChild==mychild)//查找父窗体中当前活动
子窗体
{foreach(ControltempCtrlinmychild.Controls){stringstr=tempCtrl.Name;
intanimalIndex=str.IndexOf("打印");
if(animalIndex!=-1)//查找该控件的Name中是否有"打印"{try{Buttonm=(Button)mybutton;m.PerformClick();}
catch{MessageBox.Show("该页不存在打印按钮!");}}}}}其实利用foreach语句“遍历”控件的功能不仅单个控件进行
操作,还可以用于对某个容器内的所有控件进行批量操作,如下面的程序将当前窗体中选项卡容器tabControl1中的每个选项卡中所有控件的Text包含的字符"温度"都改为“流速”。

foreach(TabPagetabinthis.tabControl1.TabPages)
{foreach(ControltempCtrlintab.Controls){stringstr=tempCtrl.Text;
char[]chars=str.ToCharArray();
intanimalIndex=str.IndexOf("温度");
if(animalIndex!=-1)//在找子控件查它的Name中是否有字符"温度"
{chars[animalIndex++]='流';chars[animalIndex++]='速';}tempCtrl.Text=newstring(chars);}}
在C#语言规范中foreach语句主要用于循环访问数组和访问集合类。

这里通过利用foreach语句“遍历”控件实现调用其它窗体上的控件这个例子,想说明一点,C#是微软给的,它功能再强
大也是有限的,而程序员的智慧是无限的,二战时英国人能用高射炮打坦克,我们为什么不能?
参考文献:
[1]罗斌,罗顺文.等.VisualC#2005编程技巧大全[M].中国水利水电出版社,2007.1.1.
[2]罗斌,越飞.等.VisualC#2005编程实例精粹[M].中国水利水电出版社,2006.7.
[3]章立民研究室.著.VisualC#2005程序开发与界面设计秘诀[M].机械工业出版社,2006.11.
收稿日期:2007-05-19
作者简介:冯根生(1962-),计算机应用专业硕士,副教授,蚌埠坦克学院电子室主任;李学武(1973-),计算机应用专业硕士,讲师,蚌埠坦克学院电子室。

在C#中使用foreach语句实现调用其它窗体上的控件
冯根生,李学武
(蚌埠坦克学院电子室,安徽蚌埠233000)
择要:当微软推出VisualStudio.NET后,C#作为一种编程语言越来越为人们所熟知,本文通过利用C#语言规范中foreach语句循环访问的功能来“遍历”某(每)控件容器的所有控件,实现调用对其它窗体上某个控件调用的实例,从而启发读者举一反三,充分利用开发软件的潜在功能而心想事成,达到抛砖引玉的效果。

关键词:C#;窗体;控件;语句
中图分类号:TP312
文献标识码:A文章编号:1009-3044(2007)13-30129-01Applicationof"Foreach"SentenceinC#toTransferWidgetsonOtherWinform
FENGGeng-sheng,LIXue-wu
(BengbuTankInstituteElectronicsSection,Bengbu233000,China)
Abstract:AftertheMicrosofthasintroduced"VisualStudio.NET",peoplebecomemoreandmorefamiliarwithC#.Thisthesis,bysheddingsomelightonutilizingthecircularvisitingfunctionof"Foreach"SentenceinC#incoveringallthewidgetstotransfercertainwidgetsonotherwinform,isaimedtoinspiremorefreshideasinthisregard.
Keywords:C#;winform;Widget;Sentence
129。

相关文档
最新文档