none
关于TabControl.tabPage的Parent属性的问题,具体见正文 RRS feed

  • 问题

  • 比如一个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
    2013年6月3日 3:17

答案

  • 你好,这个问题不是因为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
    2013年6月3日 4:56

全部回复

  • 你好,这个问题不是因为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
    2013年6月3日 4:56
  • 感谢你的回答和提供的Blog,答案很清楚,Blog也写很好,学到很多。

    努力~

    2013年6月3日 6:52