2017-05-22 7 views
0

현재로서는 업그레이드 할 수없는 .Net 1.1 앱을 변경해야합니다. 앱은 끔찍하게 디자인되었고, 반복적 인 기능, 주석 처리되지 않은 사용되지 않는 코드, 실제로 사용되는 코드와 동일한 표기법을 사용하지 않고 동일한 사용자 컨트롤을 여러 번 반복하여 작성되었습니다. 사용되는 사용자 정의 컨트롤은 사용자 정의 컨트롤이 아닌 컨트롤과 섞여 있지만 Form 중앙에 구현 될 때처럼 복잡합니다.부모 컨트롤을 모르는 상태에서 컨트롤을 찾는 방법 (.Net 1.1)

MainForm이라고하는 FormTabControl이며 각 페이지에는 WorkForm이 있습니다. 이들은 사용자 입력으로부터 동적으로 생성됩니다. WorkForm은 사용자 정의 컨트롤이며 이전에 언급 한 사용자 정의 컨트롤과 포함/포함되지 않은 컨트롤, 패널 등을 포함합니다. Parentage는로드되는 데이터에 전적으로 기초하여 폼과 컨트롤간에 동적 일 수 있으므로 문제가 복잡해집니다.

네 번째 탭의 WorkForm 사용자 정의 컨트롤의 일부인 사용자 정의 컨트롤의 인스턴스에는 DataGrid가 있으며, 그 컨트롤의 외부 컨트롤을 확인하기 위해 해당 DataGrid의 새 행을 추가하는 코드를 수정하면됩니다. 사용자 컨트롤의 동일한 WorkForm에 있고 SelectedValue을 가져옵니다. 본질적으로 필요한 곳은 "Where 's Waldo"가되어야하지만 Control 계층이 보장되지 않는다는 사실에 적응할 수있는 충분한 "Carmen Sandiego"가 있어야합니다. 또한 Demeter의 법칙은 Demeter의 법칙과 비슷합니다. 나는 그녀의 Dename을 알지 못합니다! " 그렇게해서는 안되는 정적 변수에 대한 실제적인 kludgy 호출은 앱 실행 방법과 거의 같습니다. 같은

뭔가 :

Dim row as DataRow = aDataTable.NewRow() 
    row[12] = Me.Parent.Cousin.TwiceRemoved.OnFathersSide.NotThatOne _ 
       .TheOtherOne.SelectedValue 

어떤 것이 관계가 보장되지 않기 때문에,이 컨트롤을 사냥에 대해 갈 수있는 가장 좋은 방법? 추신 나는 그 앱을 쓰지 않았다. 나는이 악몽에 변화를주기위한 지시에 막 붙어있다.

답변

0

이것은 전적으로 컨트롤에 대해 알고있는 내용에 따라 다릅니다.

는 이름을 가지고 (또는 독특한 기준을 다른 종류의)이 같은 모든 컨테이너에 걸쳐 반복 검색 할 수있는 경우 그렇지 않으면 당신의 가장 좋은 건 아마도 배치 논리를 찾을 것

public static Control WhereInTheFormIsWaldoSandiego(Container c, String name) 
{ 
    foreach (Control ctrl in c.Controls) 
    { 
    if (ctrl.Name.Equals(name)) return ctrl; 
    if (ctrl is Container) 
    { 
     Control inner = WhereInTheFormIsWaldoSandiego(ctrl as Container, name); 
     if (inner != null) return ctrl; 
    } 
    return null; 
    } 
} 

을 어딘가에 그것에 대한 참조를 저장하기 위해 그것을 제어하고 수정하십시오.

나중에 응용 프로그램에 대한 지식을 향상 시키지만 시간이 오래 걸릴 수 있으므로 나중에 사용하는 것이 좋습니다.

+0

이렇게 복잡한 상황에서이 문제를 해결하는 가장 좋은 방법입니다.하지만 마침내 다른 접근 방식을 취하도록 사다리를 설득 할 수있었습니다. – CDove