2011-08-08 5 views
3

나는 주기적으로 구분 된 속성 경로를 지정하면 항상 DataMember 같이 Winforms 데이터 바인딩 문제가 계속 발생합니다. 예를 들어 :Winforms 데이터 바인딩 : DataMember가 마침표로 구분 된 탐색 경로로 인해 예외가 발생합니다. 왜?

경우 ArgumentException :

public partial class SomeForm : System.Windows.Forms.Form 
{ 
    public SomeForm(Book bookToBeDisplayed) 
    { 
     InitializeComponent(); 

     authorLabel.DataBindings.Add("Text", bookToBeDisplayed, "Author.Name"); 
              // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
              // I cannot get this to work. 
    } 
} 


public class Book : INotifyPropertyChanged 
{ 
    public Person Author { … } 
    … 
} 

public class Person : INotifyPropertyChanged 
{ 
    public string Name { … } 
    … 
} 

나는이 authorLabel.TextbookToBeDisplayed.Author.Name 사이의 바인딩 추가 해요 선은 다음과 같은 예외가 발생 데이터 소스의 속성이나 열 이름에 결합 할 수 없습니다. 당신이 결합 할 때 마침표로 분리 된 탐색 경로를 사용할 수 있습니다

:

MSDN page about System.Windows.Forms.Binding의 "주의"섹션 DataMember 같은 기간 구분 탐색 경로를 사용할 수 있다고 설명 속성이 다른 객체에 대한 참조를 반환하는 객체 (예 : 다른 클래스 객체를 반환하는 속성이있는 클래스)

위 예제가 작동하도록하려면 어떻게해야합니까? 이미 SomeForm의 생성자에 전달 된 Book 인스턴스가 제대로 초기화되어 있는지 확인했고, 그 한

  • 는 더 null 참조가 없습니다.
  • 나는 또한 DataSets에 의지하고 싶지 않다.

답변

1

해결책을 찾았습니다. 분명히, DataSource은 하나의 객체가 아니어야하지만, 모음 : "간단한"와 "복잡한"사람 : the MSDN page "Data Binding and Windows Forms"는 데이터 바인딩의 두 가지 유형이 있다는 것을 언급의

authorLabel.DataBindings.Add("Text", 
          new Book[] { bookToBeDisplayed }, // <-- 
          "Author.Name"); 

는 '데이터 바인딩의 유형 " . 후자 바인딩 유형은 "목록 기반 바인딩"이라고도합니다. 탐색 경로는 후자 바인딩 유형에서만 지원되는 것 같습니다.

피씨 : MSDN에서는 BindingList<T>도 사용하는 것이 좋습니다.

+0

아니 그들도 다른 곳에서 지원됩니다 시도 할 수 없다, "Author.Name"'및 모든 것이 제대로 작동하지만 문자가 변경되지 않은 동일한 코드가 다른 컴퓨터에서 실행될 때 'Name'속성을 찾을 수 없다는 ArgumentException이 발생합니다. 그건 단지 미친 짓이야 .. – quetzalcoatl

+0

그런 데이터 바인딩의 경우 목록 기반/복잡한 데이터 바인딩을 사용해야하지만 어쨌든 간단한 데이터 바인딩을 사용한다고해서 반드시 "버그"가되는 것은 아닙니다. 공식 추천 및 문서화 된 방법이 올바르게 작동하지 않거나 신뢰할 수없는 경우 버그가 될 수 있습니다. – stakx

+1

감사합니다. 나는 그것을 완전히 이해합니다. 내가 더 정확하게 말하면, 당신에게 지시 된 질문으로 생각하지 마십시오. 나는 당신이이 희소 한 문제점을 보았 기 때문에 이것을 쓰고 나는 오히려 호기심으로 당신에 관하여 알리고 싶었다.나는 WForms 프레임 워크가 다소 비 일관적인 것처럼 보이기 때문에 버그가 있다고 주장했다. 나는 3 개의 다른 기계를 가지고있다. 그들 모두는 완전한 패키지를 가지고있다 .Net2.0, .Net3.0 그리고 .Net4.0이 설치되어있다. SVN에서 동일한 리비전의 새로운 체크 아웃, 각 머신에서 처음부터 다시 작성, 소스 변경 없음. 코드는 간단합니다 : INotifyPropChg를 구현하는 작은 POCO – quetzalcoatl

-1

당신은 거기에 몇 가지 매우 무시 무시한 버그, 아니면 자유롭게 aBook`에 바인딩 할 수 있습니다 내 개인 컴퓨터의 경우 .. 일부 underdocumented 세트가있다 ..이

authorLabel.DataBindings.Add("Text",bookToBeDisplayed.Author,"Name"); 
+3

'bookToBeDisplayed'의'Author' 속성이 새로운'Author' 객체로 변경 될 때 , 레이블은 이전 작성자에게 표시 한 방식대로 바인딩하면 여전히 바인딩됩니다. – hvd