2009-07-28 2 views
1

사용자 지정 컬렉션 편집기가 있고 프로그래밍 방식으로 목록 (컬렉션)에 항목을 추가하여 목록 상자에 표시되도록 할 수 있습니다. 내가 어떻게 할 수 있니? CollectionEditor의 AddItems 메서드에 대해 알고 있지만 컬렉션 개체를 매개 변수로 사용하지만 CollectionEditor의 내부 목록 개체를 가져 오는 방법을 찾을 수 없습니다./프로그래밍 방식으로 CollectionEditor의 list/listbox/collection에 항목을 추가하는 방법은 무엇입니까? [수정 된]

[업데이트] 적절한 메서드 이름은입니다. 'SetItems' [/ 업데이트]

[업데이트 2] 내가 할 노력하고있어의 소스 코드 ...

public class MyCollectionEditor : CollectionEditor 
{ 
     private Type m_itemType = null; 

     public MyCollectionEditor(Type type) 
      : base(type) 
     { 
      m_itemType = type; 
     } 

     protected override CollectionForm CreateCollectionForm() 
     { 
      Button buttonLoadItem = new Button(); 
      buttonLoadItem.Text = "Load from DB"; 
      buttonLoadItem.Click += new EventHandler(ButtonLoadItem_Click); 

      m_collectionForm = base.CreateCollectionForm(); 

      TableLayoutPanel panel1 = m_collectionForm.Controls[0] as TableLayoutPanel; 
      TableLayoutPanel panel2 = panel1.Controls[1] as TableLayoutPanel; 
      panel2.Controls.Add(buttonLoadItem); 

      return m_collectionForm; 
     } 

     private void ButtonLoadItem_Click(object sender, EventArgs e) 
     { 
      if (m_itemType.Equals(typeof(MyCustomCollection))) 
      {    
       MyCustomItem item = ...load from DB... 

       //definition: SetItems(object editValue, object[] value); 
       SetItems(-> what goes here?! <- , new object[] { item }); 
      } 
     } 
} 

[/ 업데이트 2] 내가

을 오해 할 수있다

+0

+1 자신의 솔루션을 완전히 설명하는 업데이트를 게시합니다. 이제는 저에게 효과가 있는지 알게 될 것입니다 ...;) – IAbstract

답변

0

에야디야 UR 질문하지만 당신은 자신의 컬렉션을 먼저 정의해야합니까? 그리고 내가 .NET에 솔루션 덕분에 발견했습니다

+0

네, 맞습니다. 나는 내 컬렉션을 가지고 있으며, 나는 CollectionEditor 클래스를 파생 시켰고 당신이 제안한대로 내 컬렉션을 장식했다. 내가 원하는 것은 CollectionEditor입니다. DB에서 아이템을로드하기위한 버튼을 추가했습니다 (추가하고 삭제할 원래 버튼 옆에 있음).로드를 처리 한 후이 아이템을리스트에 추가하고 싶습니다. CollectionEditor에서 항목을 '설정'하는 방법이 있지만 보호되어있어 액세스 할 수없는 실제 개체 목록을 전달해야합니다. – stavo

0

EditorAttribute

[EditorAttribute (대해서 typeof (System.ComponentModel.Design.CollectionEditor)의 typeof (먼저 System.Drawing.Design.UITypeEditor))]로 장식 리플렉터 및 반사 메커니즘입니다. 대신 SetItems 방법을 사용하는 나는 CollectionForm의 개인 메소드를 호출하고 있습니다 : private void AddItems(IList instances)을 다음과 같이 :

MethodInfo methodInfo = m_collectionForm.GetType().GetMethod("AddItems", BindingFlags.NonPublic | BindingFlags.Instance); 
methodInfo.Invoke(m_collectionForm, new object[] { /* my items here */ }); 

PS합니다. 위 코드의 나머지 부분을 참조하십시오 ...

관련 문제