积极答复者
关于TabControl.tabPage的Parent属性的问题,具体见正文

问题
-
比如一个TabControl有6个tabPage,执行以下代码,可以实现6个tabPage的Text分别为1,2,3,4,5,6
int i = 0; foreach (var tp in tabControl1.Controls.OfType<System.Windows.Forms.TabPage>()) { i++; tp.Text = i.ToString(); }
但是,执行以下代码,为何只是将tabPage1,tabPage3,tabPage5的Parent属性设置为null,而tabPage2,tabPage6没有设置Parent属性,从中断来看foreach中跳过了tabPage2,tabPage6。
foreach (var tp in tabControl1.Controls.OfType<System.Windows.Forms.TabPage>()) { tp.Parent = null; } tabPage4.Parent = tabControl1;
请问这是为什么,求解答?如何不让跳过tabPage2,tabPage6?
努力~
- 已编辑 zjyh16 2013年6月3日 3:18
答案
-
你好,这个问题不是因为TabPage.Parent这个属性造成的,而是因为迭代器的原因,因为你在代码中使用了OfType这个扩展方法,该方法返回的是一个迭代器,而不是立即返回对象结合,而是在使用foreach的时候才去读取数据的,所以当你第一次调用这个方法返回的TabPage的数量却是是4,但是你执行了tp.Parent=null之后,此时TabContrl1.Controls的TabPage的集合数量已经是3个了,所以当你再执行foreach的时候,此时返回的数量却是3了,但是此时的索引已经是1,所以此时操作的对象就是tabPage3对象,所以才会导致只移除了1和3的结果,这个主要是因为迭代器不是立即获取数据的,而是每次foreach的时候才去读取数据,所以你用这个代码tabControl1.Controls.OfType<System.Windows.Forms.TabPage>获取的集合数量是变化的(这点你可以单步调试观察的),然而你第一个可以成功,是因为tabControl1.Controls.OfType<System.Windows.Forms.TabPage>这个代码获取的集合数量都是4,为了移除所有TabPage可以使用下面的方法:
foreach (TabPage tp in tabControl1.TabPages) { tabControl1.TabPages.Remove(tp); }
如果想更好理解迭代器,你可以看看这篇文章:http://www.cnblogs.com/zhili/archive/2012/12/02/Interator.html
If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. my sample
- 已建议为答案 Learning hard 2013年6月3日 4:56
- 已标记为答案 zjyh16 2013年6月3日 5:32
全部回复
-
你好,这个问题不是因为TabPage.Parent这个属性造成的,而是因为迭代器的原因,因为你在代码中使用了OfType这个扩展方法,该方法返回的是一个迭代器,而不是立即返回对象结合,而是在使用foreach的时候才去读取数据的,所以当你第一次调用这个方法返回的TabPage的数量却是是4,但是你执行了tp.Parent=null之后,此时TabContrl1.Controls的TabPage的集合数量已经是3个了,所以当你再执行foreach的时候,此时返回的数量却是3了,但是此时的索引已经是1,所以此时操作的对象就是tabPage3对象,所以才会导致只移除了1和3的结果,这个主要是因为迭代器不是立即获取数据的,而是每次foreach的时候才去读取数据,所以你用这个代码tabControl1.Controls.OfType<System.Windows.Forms.TabPage>获取的集合数量是变化的(这点你可以单步调试观察的),然而你第一个可以成功,是因为tabControl1.Controls.OfType<System.Windows.Forms.TabPage>这个代码获取的集合数量都是4,为了移除所有TabPage可以使用下面的方法:
foreach (TabPage tp in tabControl1.TabPages) { tabControl1.TabPages.Remove(tp); }
如果想更好理解迭代器,你可以看看这篇文章:http://www.cnblogs.com/zhili/archive/2012/12/02/Interator.html
If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. my sample
- 已建议为答案 Learning hard 2013年6月3日 4:56
- 已标记为答案 zjyh16 2013年6月3日 5:32