1

일부 컨트롤을 객체에 바인딩하려고합니다. 일반적으로 매우 간단한 프로세스입니다. 내가 CollectionBase에서 상속하는 바인딩을 클래스 필드에 바인딩하고있어 개체가 오류가 발생하는 경우 불행하게도, : CollectionBase에의 inheiritance이 문제가 멀리 이동하게 제거CollectionBase에서 파생 된 클래스의 속성에 바인딩

Cannot bind to the property or column Caption on the DataSource. Parameter name: dataMember

을, 그러나 나는 집합 일이 개체가 필요합니다 . CollectionBase가 상위 수준 속성을 "바인딩 해제 가능"하게 만듭니다. 이 문제를 해결하기 위해 재정의 할 수있는 속성이 있습니까? 다른 아이디어?

온라인으로이 예제를 쉽게 요약 한 것으로 나타났습니다. 불행히도이 예제가 게시 된 모든 곳에서 아직 답을 찾을 수 없습니다.

코드 : 개별 데이터 바인딩의 목록 내에서 찾기 위해 데이터 소스로 바인딩 시도를 사용할 때

[STAThread] 
static void Main() 
{ 
    TestCollection obj = new TestCollection(); 
    using (Form f = new Form()) 
    using (BindingSource bs = new BindingSource()) 
    { 
     bs.DataSource = typeof(Test); 
     f.DataBindings.Add("Text", bs, "Caption"); 
     bs.DataSource = obj; // breaks 

     //List<TestallData = new List<Test>(); 
     //allData.Add(obj); 
     //bs.DataSource = allData; 
     f.ShowDialog(); 
    } 
} 

class TestCollection : CollectionBase 
{ 
    public string Caption { get { return "Working"; } } 
} 
+0

으로 변경하십시오. 왜 DataSource를 두 번 설정합니까? 먼저 유형을 입력 한 다음 인스턴스로 입력하십시오. – abatishchev

답변

0

CollectionBase이 같은 개체의 목록에 대한 인터페이스를 제공합니다. 목록이 없으면 문제가 있습니다.

캡션을 사용하려는 경우 CollectionBase을 사용하려면 하나가 아니라 2 개의 클래스가 있어야합니다.

public class TestObj 
{ 
    public string caption { get { return "yay"; } } 
} 

public class TestCol : CollectionBase 
{ 
    //methods that implement CollectionBase for the TestObj type 
} 

두 가지 중에서 하나를 두 가지 방법으로 바인딩 할 수 있습니다.

TestObj obj = new TestObj(); 
TestCol col = new TestCol(); 
col.Add(obj); 

//bind to obj, OR bind to col. Both would work with this setup. 

http://msdn.microsoft.com/en-us/library/system.collections.collectionbase%28v=vs.90%29.aspx

CollectionBase의 샘플 구현이 있습니다.

UPDATE : COMMENT

에서 편집 내가 개인적으로 당신이 컬렉션의 외부 속성에 바인딩 할 수있는 알 수있는 방법이 없습니다. 이 문제를 해결하려면 3 클래스 시스템을 사용할 수 있습니다 (예, 알다시피, 점점 더 복잡해 짐).

public class TestHeader 
{ 
    public string Data {get;set;} 
} 

public class TestCol : CollectionBase 
{ 
    //... 
} 

public class TestObj 
{ 
    public TestHeader header {get;set;} 
    public TestCol col {get;set;} 
} 
TestObj.header의 외측 필드 바인드

TestObj.col에 수집 필드를 결합한다. 이것은 해결 방법이지만, 명시된 바와 같이 실제로 원하는 것을 직접 구현하는 방법을 알지 못합니다. 나는 내가 그랬 으면 좋겠다. 거기에서 이익을 얻을 수있는 내 자신의 코드가있다.

또 다른 예

은 또한 두 개의 클래스와 함께 할 수 있지만, 당신은 여전히,이 경우 중첩 콜렉션 자체

public class TestObj 
{ 
    public string data {get;set;} 
    public TestCol col {get;set;} 
} 

필요 TestObj에 하나의 데이터 필드를 결합, 그리고 것 수집 필드를 TestObj.col

+0

안녕하세요 Nevyn, 응답 해 주셔서 감사합니다.하지만 제 질문이 확실하지 않은 것으로 확신합니다. 예제에서 "Caption"은 컬렉션 자체에 대한 속성이며 컬렉션의 항목은 아닙니다. "백작님"과 같은 재산을 상상해보십시오. 이것이 제가 찾고있는 것입니다. 또 다른 예 : 클래스는 학생 객체의 컬렉션 일 수 있지만 클래스에는 Name 및 Time 속성도 있습니다. –