2009-06-25 7 views
9

서로 다른 종류의 입력을위한 것이기는하지만 모두 동일한 모양과 일반적인 동작을 공유해야하는 컨트롤을 만들고 있습니다. 그래서 UserControl에서 상속 한 BaseClass를 만들었고 모든 컨트롤은 BaseClass에서 상속받습니다.winforms 디자이너에서 상속 된 컨트롤에 액세스하는 방법

그러나 TableLayoutPanel과 같은 디자이너에서 BaseClass 컨트롤을 추가하면 상속 된 클래스를 디자인 할 때 해당 클래스에 액세스 할 수 없습니다. TableLayoutPanel을 볼 수 있지만, 비록 그가 "protected"라고하더라도 디자이너를 통해 컨트롤을 수정하거나 컨트롤을 넣을 수는 없습니다. 코드를 사용하여 액세스하는 데 문제가 없지만 디자이너를 사용하는 기능을 잃고 싶지는 않습니다.

지금은 단순히 BaseClass에서 모든 컨트롤을 제거하고 상속 된 클래스의 레이아웃과 모든 공통 컨트롤을 추가 한 다음 참조를 사용하여 BaseClass 내부에서 컨트롤을 조작합니다. 하지만 그건 전혀 만족스럽지 않습니다. 상속 된 보호 된 멤버 컨트롤로 디자이너를 작동시키는 방법이 있습니까?

환경 : C#을 .NET 3.5, 비주얼 스튜디오 2008

편집 SLaks의 제안에 대답합니다. 나는 재산을 세우려고 애썼지 만, 나는 그것들을 사용하는 데 익숙하지 않았지만 그것은 효과가없는 것처럼 보인다. 여기 내가 시도한 코드입니다 :

public partial class UserControl1 : UserControl 
    { 
      public UserControl1() 
      { 
        InitializeComponent(); 
      } 

      public TableLayoutPanel TableLayoutPanel1 
      { 
        get { return tableLayoutPanel1;} 
        set { tableLayoutPanel1 = value;} 
      } 
    } 

    public partial class UserControl2 : UserControl1 
    { 
      public UserControl2() 
      { 
        InitializeComponent(); 
      } 
    } 
+0

TableLayoutPanel 자체에서 상속받을 수 있습니까? – SLaks

+0

물론, winforms 컨트롤에서 상속받은 자신 만의 컨트롤을 만들 수 있습니다. 나는 몇 가지 컨트롤을 구현하기 위해 이것을했다. 그러나 그것은 제가 여기서 달성하고자하는 것이 아닙니다. 내부에 몇 가지 기본 컨트롤이있는 컨트롤을 사용하려고합니다. 레이블과 같은 일부 컨트롤이있는 tablelayoutpanel과 상속 된 클래스가 선택한 컨트롤로 채워야하는 여러 빈 공간이 있습니다. 최종 목표는 모든 theses 컨트롤을 도구 상자에 추가 한 다음 디자이너로 드래그 앤 드롭하여 많은 컨트롤이 있지만이 컨트롤 전체에서 일반적인 동작/레이아웃이있는 폼을 만드는 것입니다. – Ksempac

+0

그리고 btw, Winform 컨트롤을 상속하면 일반적으로 컨트롤 자체를 다시 디자인하지 않고 특정 동작을 구현하는 것이기 때문에 디자이너가 잘립니다. – Ksempac

답변

11

디자이너와 상속 된 컨트롤에서 기본 컨트롤에 선언 된 TableLayoutPanel에 액세스하려고하면 WinForms의 "Visual Inheritance"기능을 사용하고있는 것입니다.

불행하게도 TableLayoutPanel 시각적 상속을 지원하지 않습니다 TableLayoutPanel이 상속 된 컨트롤에서 차단 나타나는 이유 http://msdn.microsoft.com/en-us/library/ms171689%28VS.80%29.aspx

.

+0

나는이 문제에 곧바로 달렸다. FTA : "TableLayoutPanel 컨트롤을 조금씩 사용하십시오." –

+0

예, 이것은 막 다른 골목처럼 보입니다. tablelayout과 디자이너를위한 C# 소스를 대부분 찾을 수 있었지만이 컨트롤과 관련된 FlowPanelDesigner.uex 파일을 결코 찾지 못할 것 같습니다. – garaber

0

독자적으로 기본 컨트롤을 설계해야합니다. 컨트롤 프로젝트를 성공적으로 다시 작성하면 변경 내용이 디자이너에 반영됩니다. 멤버를 공개하면 편집 할 수 있지만 변경 사항은 유지되지 않습니다. (이 또는 도움이되지 않을 수도 있습니다) 패널의 정의에이 속성을 추가

+0

기본 클래스에서 TableLayoutPanel의 행, 열 및 크기를 설정하면됩니다.하지만 파생 클래스를 디자인 할 때 레이아웃에 컨트롤을 추가 할 수 없다면 무의미합니다. 예를 들어, 내 테이블 레이아웃에 빈 셀을 추가 한 다음이 셀의 파생 클래스 각각에 다른 컨트롤을 디자이너에 추가하십시오. – Ksempac

+0

파생 컨트롤을 디자인하는 동안 기본 컨트롤을 수정할 수 없습니다. 어쨌든 쉽게. '빈 공간'을 공개 (예 : EmptyPanel1, EmptyPanel2 ...) 한 다음 자신의 TypeEditor를 제공하면 최소한 컨트롤을 시각적으로 설정할 수 있습니다. 유형 편집기를 만드는 것은 약간의 작업이지만, –

1

시도 :

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
+0

아니, 작동하지 않습니다. – Ksempac

+0

필드를 비공개로 설정하고 해당 속성을 공개 속성에 추가하십시오. – SLaks

+0

SplitContainer가하는 일이 무엇입니까 – SLaks

0

, 컨트롤에 대한 ParentControlDesignerInternalControlDesigner을 무시하고 (designerHost.GetDesigner(tableLayoutPanel) as ControlDesigner)을 돌아보십시오. designerHost(IDesignerHost) component.Site.GetService(typeof(IDesignerHost))입니다.

0

나는 기본 DLL을 자체 DLL에두고이를 먼저 구축함으로써 유사한 문제를 해결하는 것을 막연하게 기억합니다. 나는 잘못을 범했지만 프로젝트를 찾을 수 없다. 죄송합니다.

관련 문제