> 백엔드 개발 > C#.Net 튜토리얼 > 컨테이너 트랩에서 참조하는 Microsoft 버그 .net 구성 요소의 코드 예

컨테이너 트랩에서 참조하는 Microsoft 버그 .net 구성 요소의 코드 예

黄舟
풀어 주다: 2017-03-04 11:11:34
원래의
1335명이 탐색했습니다.

 .net(C#) WinForm 개발은 시각적 디자인이기 때문에 디자인 인터페이스에 필요한 컴포넌트를 수동으로 직접 추가할 수 있고, .net에서는 속성 설정 등을 포함해 이 컴포넌트를 자동으로 초기화하고 추가를 해준다. InitilizeComponent()에 추가하면 이 구성 요소가 해당 상위 구성 요소에 추가됩니다. 이 모든 작업은 .net에 의해 자동으로 수행됩니다.

그러나 일부 시나리오에서는 구성 요소가 속한 상위 컨테이너를 변경하기 위해 코드를 수동으로 작성해야 합니다. 예를 들어 일부 구성 요소는 원래 상위 컨테이너 A에 속했지만 이러한 구성 요소를 상위 컨테이너 B로 조정하려고 합니다. 이때 흥미로운 문제가 발생합니다.

다음 3개의 구성 요소가 원래 여기에 있었습니다.

            this.Controls.Add(this.operRateUC);
            this.Controls.Add(this.personProductUg);
            this.Controls.Add(this.procedingPanel);
로그인 후 복사

는 이 3개의 구성 요소를 adjustPanel 구성 요소로 조정하려고 합니다. 다음 코드에 표시된 대로:

     private void moveToAdjustPanel()
     {          //AdjustablePanel是一个Control类
          AdjustablePanel adjustPanel = new AdjustablePanel();          
          foreach (Control ultraControl in this.Controls)
            {                    
            if (ultraControl.GetType() == typeof(UltraGrid) || 
                        ultraControl.GetType() == typeof(UltraChart) ||
                        ultraControl.GetType() == typeof(Panel))
                {
                    adjustPanel.Controls.Add(ultraControl);                    
                }  
            }
     }
로그인 후 복사

구성 요소를 다른 상위 구성 요소로 일괄 이동하는 이 방법은 실패합니다.
adjustPanel이 새 구성요소를 추가할 때마다 this.Controls의 구성요소가 변경되고 foreach 반복자가 수정되는 예외는 발생하지 않습니다. 이것이 Microsoft 버그인지는 모르겠습니다.

도움을 위해 bbs.csdn.net에 게시하고 응답했습니다. 대부분의 사람들은 foreach 순회가 오류를 보고할 것이라고 생각했지만 실제로 컴파일러는 어떤 예외도 발생시키지 않았습니다. 컴파일러를 다시 실행하고 간단한 테스트를 실행한 결과 foreach 순회에서는 오류가 보고되지 않았지만 원하는 결과를 얻을 수 없었습니다.


컨테이너 트랩에서 참조하는 Microsoft 버그 .net 구성 요소의 코드 예

테스트 코드는 다음과 같습니다. 여기서 2 Button 구성 요소를 groupBox1로 이동합니다. 하지만 결과적으로 여기에는 여전히 버튼1이 있고, 버튼2만 groupBox1로 이동되었습니다.


이상한 점:

foreach 반복자가 수정되었는데 왜 오류를 보고하지 않습니까? ? ?
왜 버튼2만 그룹박스1로 이동하나요? ? ?

        public Form1()
        {
            InitializeComponent();
            moveButtonsToGroupBox();            //controlNames的结果为{groupBox1,button1}
            var controlNames = showAllChildControls(this); 
            //controlNamesInGroup的结果为{button2}
            var controlNamesInGroup = showAllChildControls(this.groupBox1);             
        }        /// <summary>
        /// 移动位于Form上的按钮到GroupBox中
        /// </summary>
        private void moveButtonsToGroupBox()
        {            foreach(Control c in this.Controls)
            {                if (c.GetType() == typeof(Button))                    
            this.groupBox1.Controls.Add(c);
            }
        }        /// <summary>
        /// 展示c控件的所有子组件的Name
        /// </summary>
        /// <param name="c"></param>
        /// <returns></returns>
        private List<string> showAllChildControls(Control c)
        {            if (c == null) return null;
            List<string> controlNames = new List<string>();            foreach(Control chl in c.Controls)
            {
                controlNames.Add(chl.Name);
            }            return controlNames;
        }
로그인 후 복사

 .net(C#) WinForm 개발은 시각적 디자인이기 때문에 필요한 구성 요소를 디자인 인터페이스에 수동으로 직접 추가할 수 있으며, .net은 이 구성 요소를 자동으로 포함하여 속성을 초기화합니다. 설정 등을 InitilizeComponent()에 추가하면 해당 상위 컴포넌트에 이 컴포넌트가 추가됩니다. 이 모든 작업은 .net에 의해 자동으로 수행됩니다.

위 내용은 컨테이너에서 참조하고 있는 Microsoft bug .net 컴포넌트의 코드 예시 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!


원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿