2011-09-17 5 views
4

우리가 가지고있는 것
우리는 복잡한 winforms 컨트롤을 가지고 있습니다. 상태를 저장하기 위해 우리는 커스텀 직렬화 클래스를 사용한다. xml에 직렬화했다고 가정 해 보겠습니다. 이제 우리는 사용자 디렉토리에있는 파일로이 XML을 절약 할 수 또는 사용자가 건너 몇 가지 같은 컨트롤을 만드는 경우 .... 어떤 다른 파일에
하지만 ... 문제는입니다고유 한 영구 제어 식별자

,
그것을 포함하는 자신의 winform 응용 프로그램 (디자인 타임)에서 어떤 고유 식별자를 사용하여 저장된 구성 중 어떤 컨트롤에 속하는지 파악하는 것이 좋습니다.

그래서이 식별자가 있어야합니다

  • 응용 프로그램에서 동일한 그대로가 실행
  • 자동 부여 (또는 우리가 Control.Name가 항상 있다는 것을 가정 할 수처럼 이미 주어진) 응용 프로그램
  • 에서
  • 고유

나는 그것을하는 여러 가지 방법을 상상할 수 있다고 생각합니다. 나는 그것을하는 기본 방법이있을 것이라고 생각합니다.

사용하는 것이 더 낫습니다. 왜?

답변

1

이 작은 확장 방법은 작업을 수행 .label1 '

사용법 :

Control aaa; 
Dictionary<string, ControlConfigs> configs; 
... 
configs[aaa.GetFullName()] = uniqueAaaConfig; 
1

저는 컨트롤 계층의 전체 트리로 구성된 복합 형 식별자를 사용하고 있습니다. 양식 이름이 Form1이고 Groupbox Group1 및 TextBox1이 있다고 가정하면 복합 식별자는 Form1/Groupbox1/TextBox1이됩니다. 당신이 따르세요

, 여기에 세부 사항은 다음과 같습니다

public static class FormGetUniqueNameExtention 
{ 
    public static string GetFullName(this Control control) 
    { 
     if(control.Parent == null) return control.Name; 
     return control.Parent.GetFullName() + "." + control.Name; 
    } 
} 

그것은 Form1._flowLayoutPanel '같은 것을 반환

http://netpl.blogspot.com/2007/07/context-help-made-easy-revisited.html

1

양식의 전체 이름 (네임 스페이스 포함)을 포함하는 고유 한 이름을 정의한 다음 해당 컨트롤 위에있는 각 상위 컨트롤을 포함하는 고유 한 이름을 만들기 위해 작성한 메서드입니다. 그래서 같은 것을 끝낼 수 있었다 :

MyCompany.Inventory.SomeForm1.SomeUserControl1.SomeGroupBox1.someTextBox1

static string GetUniqueName(Control c) 
    { 
     StringBuilder UniqueName = new StringBuilder(); 
     UniqueName.Append(c.Name); 
     Form OwnerForm = c.FindForm(); 

     //Start with the controls immediate parent; 
     Control Parent = c.Parent; 
     while (Parent != null) 
     { 
      if (Parent != OwnerForm) 
      { 
       //Insert the parent control name to the beginning of the unique name 
       UniqueName.Insert(0, Parent.Name + "."); 
      } 
      else 
      { 
       //Insert the form name along with it's namespace to the beginning of the unique name 
       UniqueName.Insert(0, OwnerForm.GetType() + "."); 
      } 

      //Advance to the next parent level. 
      Parent = Parent.Parent; 
     } 

     return UniqueName.ToString(); 
    }