2015-01-27 2 views
2

다음 클래스 (Windows Forms 컨트롤)는 목록 컨트롤의 한 유형으로 과 ListControlItem은 Windows를 상속하지 않습니다 제어 클래스.Visual Studio 디자이너는`Windows.Forms.Control`의`List <T>`멤버에 대한 코드를 생성하지 않습니다.

public class ListControl : Control 
{ 
    private List<ListControlItem> items; 

    public ListControl() 
    { 
     // 
     // Required for Windows Form Designer support 
     // 
     InitializeComponent(); 

    } 

    protected override void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
      if (components != null) 
      { 
       components.Dispose(); 
      } 
     } 
     base.Dispose(disposing); 
    } 

    void InitializeComponent() 
    { 
     this.components = new System.ComponentModel.Container(); 
     this.items = new List<ListControlItem>(); 
    } 

    public List<ListControlItem> Items 
    { 
     get { return items; } 
     set { items = value; } 
    } 
} 

문제는 디자인 타임에, Visual Studio를 대신 각 항목의 인스턴스에 대한 코드를 만든 다음 ListView과와 같은 컨트롤에 추가하는, 양식의 리소스 파일 목록의 내용을 직렬화하려고한다 ListViewItem. ListControl에 대한

비주얼 스튜디오 디자인 생성 된 코드 : ListView를 들어

 this.listControl1.Items = ((System.Collections.Generic.List<ListControlItem>)(resources.GetObject("listControl1.Items"))); 

:

 System.Windows.Forms.ListViewItem listViewItem1 = new System.Windows.Forms.ListViewItem(""); 
     System.Windows.Forms.ListViewItem listViewItem2 = new System.Windows.Forms.ListViewItem(""); 
     System.Windows.Forms.ListViewItem listViewItem3 = new System.Windows.Forms.ListViewItem(""); 
     System.Windows.Forms.ListViewItem listViewItem4 = new System.Windows.Forms.ListViewItem(""); 
     System.Windows.Forms.ListViewItem listViewItem5 = new System.Windows.Forms.ListViewItem(""); 
     System.Windows.Forms.ListViewItem listViewItem6 = new System.Windows.Forms.ListViewItem(""); 

     this.listView1.Items.AddRange(new System.Windows.Forms.ListViewItem[] { 
     listViewItem1, 
     listViewItem2, 
     listViewItem3, 
     listViewItem4, 
     listViewItem5, 
     listViewItem6}); 

나는 ListView는 "자신의 목록 클래스가이 문제를 해결하기 위해 ListViewListViewItem 검색을 시도 "ListViewItemCollection은 인터페이스 IList, ICollection, IEnumerable을 구현하지만 List<T>은 구현합니다. 같은 인터페이스.

사용자 지정 직렬화를 구현해야합니까? 아마 이것은 단지 자원 파일에 직렬화 될 것입니다. Windows Forms Control 기본 클래스를 상속받지 않으므로 많은 설명서를 찾을 수 없습니다. List<T> 속성의 속성 [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 퍼팅

UPDATE

List<T> 각 항목에 대한 하나 개의 자원을 제공한다.

 this.listControl1.Items.Add(((ListControlItem)(resources.GetObject("listControl1.Items")))); 
     this.listControl1.Items.Add(((ListControlItem)(resources.GetObject("listControl1.Items1")))); 
     this.listControl1.Items.Add(((ListControlItem)(resources.GetObject("listControl1.Items2")))); 
     this.listControl1.Items.Add(((ListControlItem)(resources.GetObject("listControl1.Items3")))); 
     this.listControl1.Items.Add(((ListControlItem)(resources.GetObject("listControl1.Items4")))); 
     this.listControl1.Items.Add(((ListControlItem)(resources.GetObject("listControl1.Items5")))); 

ListControlItem에 대한 사용자 지정 직렬화 구현이 도움이됩니다.

+0

달성하기를 원하십니까? 문제를 해결할 다른 방법이있을 수 있습니다. – Octopoid

+0

'ListView '와 같습니다. Visual Studio 디자이너가 리소스 파일을 저장하는 대신 각 ListControlItem에 대한 코드를 생성하게하십시오. –

+0

AFAIK이 작업을 수행하려면 [CodeDOM] (https://msdn.microsoft.com/en-us/library/y2k85ax6.aspx)을 사용해야합니다. 이렇게하면 코드가 부분 디자이너 클래스에 생성되는 방법을 정의 할 수 있습니다. – Octopoid

답변

1

클래스에 TypeConverter을 구현해야합니다. 이 무엇 TypeConverter 할 클래스의 생성자 설명자를 반환하는 것입니다.

또한 [TypeConverter(typeof(typeConverter))] 매개 변수를 사용하여 클래스의 TypeConverter을 지정하십시오.

이 경우 MSDN How to: Implement a Type Converter에 따르면 런타임에 속성 초기화를 위해 코드를 생성하는 코드를 생성하는 변환기에 더 자세히 설명되어 있습니다.

.NET Framework에서

런타임에 속성을 초기화합니다 디자인 타임에 동적 속성 초기화 코드를 생성 할 수있는 기능을 제공합니다.

개발자는 초기화 코드 인 생성자 기반 을 생성하는 형식 변환기를 만들 수 있습니다. 이러한 형식 변환기는 런타임에 형식의 속성을 구성하기 위해 디자인 타임에 설정된 값을 사용하여 생성자 코드를 동적으로 생성 할 수 있습니다. 형식 변환기는 속성에 대한 생성자의 형식과 값을 구성하기 위해 논리를 구현합니다.

은 Visual Studio 디자이너

 this.listControl1.Items.Add(new ListControlItem()); 
     this.listControl1.Items.Add(new ListControlItem()); 
     this.listControl1.Items.Add(new ListControlItem()); 
     this.listControl1.Items.Add(new ListControlItem()); 
     this.listControl1.Items.Add(new ListControlItem()); 
     this.listControl1.Items.Add(new ListControlItem()); 

단지 어떤 매개 변수 생성자 TypeConverter 반환의 결과 코드,하지만 그건 TypeConverter 코드에서 변경 될 수 있습니다. 약

CodeDomSerializer

당신이 속성을 초기화하는 생성자 이외의 코드를 생성해야하는 경우가 동적으로 CodeDomSerializer를 연결하는 DesignerSerializerAttribute 을 사용자 정의 CodeDomSerializer을 구현하고 적용하여 코드를 생성 할 수 있습니다 유형이있는 유형의 경우. 이 접근 방식은 일반적으로 구성 요소 초기화 이 제어되거나 사용자 정의 된 코드 생성을 동적으로 수행하는 시나리오 인 경우에만 사용됩니다 ( ). 이 방법에 대한 자세한 내용은 CodeDomSerializer에 대한 설명서를 참조하십시오.

즉, 응답 방법을 사용하면 속성 값을 생성자 매개 변수에 전달해야합니다. 충분하지 않으면 (생성자가 아닌 속성을 설정하는 것과 같이) @Octopoid와 마찬가지로 CodeDomSerializer을 사용해야 할 수도 있습니다.

관련 문제