2011-04-27 5 views
1

내 winforms 응용 프로그램에 ListBox가 있습니다. 나는 '. NET Dictionary Key as ListBox DataSource

Complex databinding accepts as a datasource either in Ilist or IListSource

  • :

    IDictionary<Entity1, Entity2> myEntities = new Dictionary<Entity1, Entity2>(); 
    myListBox.DataSource = myEntities.Keys; 
    

    그래서 내가 두 번째 줄에 다음과 같은 오류가있어 다음과 같이 나는 사전의 키 때문에 내가이 데이터 소스로 갖고 싶어 내가하지 않을 두 가지 일을 시도 :

    myListBox.DataSource = (IList < Entity1>) myEntities.Keys;

은 InvalidCastException이 예외가 발생합니다 :

Can't convert an object of type 'KeyCollection[Entity1,Entity2]' to type 'System.Collections.Generic.IList`1[Entity1]'.

  • 그리고를 그리고 나는 또한 시도했다 :

    myListBox.DataSource = myEntities.Keys.ToList < Entity1>();

하지만 난 myEntities을 수정할 때, 바인딩을 잃을 그런 식으로, myListBox.DataSource이 변경되지 않습니다

.

참고 : 예외 메시지는 나에 의해 번역되므로 정확하게 쓰지 않았을 수 있습니다.

어떻게해야합니까?

감사합니다.

답변

2
myListBox.DataSource = (from keys in myEntities.Keys 
         select keys) 
         .ToList(); 

세 번째 매력 ... 좋아

,

를 사용해보십시오 이벤트. 이벤트가 발생하면 사전 키를 다시 쿼리해야합니다. 내가 발견 한 자원 (예 : How to Bind...)에 따르면 사전은 컨텐츠가 변경되면 이벤트를 발생시키지 않습니다.

+0

또한 'Complex 데이터 바인딩은 Ilist 또는 IListSource에서 데이터 소스로 받아들입니다.' – Diego

+0

여전히 동일한 예외입니다. – Diego

+0

나는 VS를 해고하고 해결해야했다. .AsEnumerable 또는 .ToList가 필요하면 기억이 안 난다. – IAbstract

0

난 당신이 사전을 상속 트리거에 .Add 메서드를 재정의해야합니다 생각

myListBox.DataSource = myEntities 
+0

사전의 키만 바인딩해야합니다. – Diego

1

주요 문제는 결국 사전 키를 데이터 소스로 사용할 수 있지만 사전에서 요소를 추가하거나 제거했다는 것을 데이터 소스에 알릴 방법이 없다는 것입니다.

사전에 알림 이벤트가 없기 때문에 DataSource는 사전이 변경된 방법 및시기를 알지 못합니다. 이미 목록에있는 항목은 DataSource에 대한 참조가 포함되어있어 변경 사항을 반영하므로 변경된 참조는 참조가있는 곳이면 어디에서나 볼 수 있습니다.

내가 아는 한, 당신의 사전에서 변화를 유발 들어, 많은 선택을 가지고 있지 않습니다

  • 추가하거나 뭔가를 제거하여 데이터 소스에 때마다 목록을 다시 연결에 대한 몇 가지 코드를 작성 (선택한 항목을 유지하는 모든 문제와 함께)

  • IBindingList을 구현하거나 BindingList에서 직접 파생하여 사용자 고유의 데이터 구조를 만듭니다.

둘 다 쉽게 해결되지 않습니다, 그래서 당신의 실체가 비교적 간단 있다면 당신은 복잡한 키와 다른 구조화 된 데이터를 저장할 수있는 등 DataTables 같은 몇 가지 대안을 고려할 수 있습니다.

+0

대답 해 주셔서 감사합니다. 나는 무엇을해야하는지 생각해야 할 것입니다. – Diego