문제

리팩토링 중에 일반 유형 매개 변수를 추가했습니다. MyControl, 파생 된 수업 Usercontrol. 그래서 내 수업은 지금입니다 MyControl<T>.

이제 런타임에 임베디드 리소스 파일이 있음을 알리는 오류가 발생합니다. MyControl`1. Resources 찾을 수 없다. 빠른 모습 .NET 리플렉터 리소스 파일이 실제로 호출되었음을 보여줍니다 myControl.Resources,없이 `1.

시작시 MyControl<T>.InitializeComponent 방법이 선은 아마도 문제를 일으키는 줄입니다.

 System.ComponentModel.ComponentResourceManager resources =
    new System.ComponentModel.ComponentResourceManager(
       typeof(MyControl<>));

어떻게 강요합니까? ComponentResourceManager 임베디드 리소스 파일을 사용합니다 MyControl.resources? 이 문제를 해결하는 다른 방법도 환영합니다.

도움이 되었습니까?

해결책

WIM의 기술 외에도 일반 클래스와 동일한 이름을 가진 비 게 릭 기본 제어를 선언하고 일반 제어/양식이 해당 비 게 릭 기본 클래스에서 파생되도록 할 수 있습니다.

이렇게하면 디자이너와 컴파일러가 일반 클래스의 리소스 파일을 사용하여 속임수를 틀고 재건 할 때마다 .designer 파일에서 바이올린없이 기본 클래스가 설정되면 영구 디자이너 지원을받을 수 있습니다.

// Empty stub class, must be in a different file (added as a new class, not UserControl 
// or Form template)
public class MyControl : UserControl
{
}

// Generic class
public class MyControl<T> : MyControl
{
     // ...
}

유일한 요구 사항은 바로 그거죠 일반 클래스와 기본 클래스의 이름과 기본 클래스는 다른 클래스 파일에 있어야하며, 그렇지 않으면 디자이너는 두 클래스 중 하나를 찾지 않는 것에 대해 불평합니다.

추신. 나는 이것을 양식으로 테스트했지만 컨트롤과 동일하게 작동해야합니다.

다른 팁

상속을 통해로드 할 리소스 파일 이름을 무시할 수 있습니다. ComponentResourceManager 이와 같이:

   using System;
   using System.ComponentModel;

   internal class CustomComponentResourceManager : ComponentResourceManager
   {
      public CustomComponentResourceManager(Type type, string resourceName)
         : base(type)
      {
         this.BaseNameField = resourceName;
      }
   }

이제 리소스 관리자가로드 할 수 있습니다. MyControl.resources 이와 같이:

 System.ComponentModel.ComponentResourceManager resources =
    new CustomComponentResourceManager(typeof(MyControl<>), "MyControl");

이것은 작동하는 것 같습니다.

편집하다: 디자이너를 사용하는 경우 위의 줄은 생성 된 코드 영역에 있기 때문에 덮어 씁니다. 디자이너를 피하고 버전 제어 도구를 사용하여 원치 않는 변경 사항을 되돌리지 만 솔루션은 이상적이지 않습니다.

Visual Studio 2008 이 오류가 있습니다.

system.componentmodel.componentresourcemanager resources = new System.componentmodel.componentresourcemanager (typeof (myControl));

일반 유형 'Wind

내 사례에서 코드는 괄호없이 생성되었음을 주목하십시오. <>, 클래스 이름 후.

흥미로워지고 있습니다 ImageList는 일반 사용자 컨트롤에서 비 컴파일 코드를 자율적으로 자극합니다.

그들이 말한 것 :

2005 년 7 월 6 일 오후 2시 49 분에 Microsoft에 의해 게시 됨

이것은 흥미로운 버그입니다. Windows Forms Designer에서 지원하지 않는 일반적인 scneario에 부딪칩니다. Whidbey (My Note : Visual Studio 2008?) 릴리스에서 이것에 대한 지원을 추가 할 수 없습니다. 우리는 이것을 향후 버전으로 고려할 것입니다. 해결 방법으로 디자이너를 사용하여 공공 유형 속성으로 일반적인 USERCONTROL을 작성한 다음 IT에서 상속하고 기본 클래스 유형 속성으로 전달하는 일반 클래스를 만들 수 있습니다.

이 컨트롤은 Visual Studio Forms Designer에서도 설계 할 수 없다고 생각합니다.

가장 간단하고 가장 쉬운 해결 방법은자가 생성물을위한 더미 클래스를 만드는 것입니다. typeof(). 당신은 그것에서 상속하거나 외부에 노출 될 필요가 없습니다.

// Non-generic name so that autogenerated resource loading code is happy
internal sealed class GridEditorForm
{
}

(내 경험상, 디자이너가 제네릭을 중심으로 일하는 데 필요한 시간은 제네릭이 제공 할 수있는 이상적인 냉각성의 가치가 없었습니다. 제네릭 윈도우 양식이나 컨트롤을 다시 사용하지 않습니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top