8

C# 응용 프로그램에 여러 가지 양식이 있습니다. Visual Studio 2010 Beta가 있지만 .NET 3.5 및 C# 3을 사용합니다..NET 상속 된 (WinForms) 양식 - VS 디자이너 문제

Shd 네임 스페이스에 FilteredQueryViewForm이라는 기본 폼이 있으며 기본적으로 동일한 작업을 수행하기 때문에 다른 폼을 상속해야합니다. 그러나 약간 추가에).

FilteredQueryViewForm 클래스에서 private에서 protected로 변경되었으므로 파생 된 양식에서 액세스 할 수 있습니다. 이 후 파생 된 폼을 만들고 기본 클래스를 FilteredQueryViewForm으로 설정했습니다.

파생 클래스의 디자이너는 생성자가없는 Shd.FilteredQueryViewForm에 대해 3 개의 매개 변수가있는 사실에 관계없이 불만을 표시했습니다. 매개 변수가 문제가 될 수 있다고 생각했기 때문에 매개 변수없이 (public, 물론) 생성자를 만들었지 만 여전히 작동하지 않습니다. 오류 메시지는 다음과 같습니다.

"생성자 유형 'Shd.FilteredQueryViewForm'을 찾을 수 없습니다."

파생 클래스의 디자이너가로드되지 않습니다. vs2010beta를 다시 시작하여 파생 된 폼을 다시 만들려고했지만 아무 도움이되지 않습니다. Google은이 문제에 대해 나에게 유용한 결과를 산출하지 못했습니다. :(

이 비주얼 스튜디오 2010 베타의 문제인가? 아니면 내가 뭔가 잘못하고있는 중이 야?

답변

19

당신은 양식의 모든의를 InitializeComponent() 메서드를 호출 매개 변수가없는 생성자가 필요합니다. 다음 닫기 디자이너 창에서 솔루션을 다시 빌드하고 디자이너를 다시하려고합니다. 즉, 작동합니다. 솔루션을 재 구축하는 것이 필수적이다.

문제는 당신이 Shd.FilteredQueryViewForm에서 inheritates 양식을 작성하는 경우, 디자이너가 시도 할 것입니다 부모 폼의 생성자를 호출하지만이 폼을 코드가 아닌로드 된 어셈블리에서로드합니다.

+0

감사합니다. 솔루션을 다시 작성하는 것이 제가 놓친 단계였습니다. – ShdNx

0

기본 클래스를 추가 할 때 Form1.cs [디자인]이 업데이트되지 않았다는 것을 의미한다고 생각합니다. 나는 똑같은 문제가 있었다. 이상하게도 시작을 누르면 프로그램이 잘 실행되고 실행시 폼에 기본 클래스 구성 요소가 표시되지만 편집 모드에서는 기본 클래스 구성 요소가 표시되지 않습니다.

솔루션 탐색기에서 Form1.cs를 두 번 클릭하기 만하면됩니다. 그것은 나를 위해 일했습니다. Do this

1

나는 오래된 주제이지만, 이런 일은 다시 일어난다. 그래서 나는 내 기여가 미래에 유용 할 것이라고 생각한다.

Emiswelt는 "모든 양식에서 InitializeComponent() 메서드를 호출하는 매개 변수없이 생성자가 필요합니다." 정말 필요하지 않습니다. 파생 된 형식에서 사용자 지정 매개 변수가있는 생성자를 선언하고 일반적으로 "InitializeComponent"메서드를 호출 할 수 있습니다 (사용자 지정 생성자에 대한 호출도 있음). 중요한 것은 생성자가 새 컨트롤의 경우 "InitializeComponent"를 호출하고 기본 생성자는 상속 된 구성 요소의 경우 "InitializeComponent"를 호출한다는 것입니다. 이 상황은 런타임에는 작동하지만 Visual Studio 디자이너에서는 상속 된 컨트롤이 표시되지 않습니다. 디자인 타임에 모든 컨트롤을 표시하려면 기본 클래스에 매개 변수가없는 간단한 생성자 만 추가하면됩니다.예를 들어

, 당신의베이스는 버튼과 두 개의 라디오 버튼이있는 형태 인 경우 :

using System.Windows.Forms; 
namespace Test 
{ 
    public partial class Form1 : Form 
    { 
     public Form1(string foo) 
     { 
      //use "foo" here 
      InitializeComponent(); //here button and radios will be initialized 
     } 
    } 
} 

당신은 디자인 도구에서 볼 수 있습니다 (매개 변수없이) 빈 생성자를 피할 수 있습니다 문제없이 . Form2를 지금을 Form1에서 상속 :

namespace Test 
{ 
    public partial class Form2 : Form1 
    { 
     public Form2(string foo) : base(foo) 
     { 
      //you can use "foo" here even if it is passed to base class too 
      InitializeComponent(); 
     } 
    } 
} 

더 빈 생성자가 없습니다 그것은 컴파일하고 정상적으로 실행됩니다. rutime에서 Form2는 Form1과 동일한 컨트롤 세트를 보여줍니다. 하지만 Visual Studio에서는 "InitializeComponent"메서드의 위치를 ​​식별 할 수 없으므로 오류가 표시되므로 디자인 타임에 표시되지 않습니다. 왜? 호출 체인의 어딘가에 매개 변수가없는 생성자가 있어야하기 때문입니다. 전부

using System.Windows.Forms; 

namespace Test 
{ 
    public partial class Form1 : Form 
    { 
     public Form1(string foo):base() 
     { 
      //use foo here 
     } 

     public Form1()   //Visual studio designer likes this! 
     { 
      InitializeComponent(); 
     } 
    } 
} 

: 이 솔루션은 기본 클래스에 간단한 수정입니다.

관련 문제