2017-03-24 2 views
2

Winform UserControls와 관련하여 이상한 바인딩 문제가 크게 필요합니다.디자인에서 바인딩 오류 및 사용자 정의 컨트롤에 대한 런타임

그 것처럼.

  • 은 UserControl을
  • UserControl을 가진 양식을 System.Windows.Forms.BindingSource 제어
  • BindingSource에 디자인 타임에 엔티티 마시고 유형으로 설정 데이터 소스를 갖고있다 되세요.
  • UserControl에는 POCO 클래스의 속성에 바인딩되는 컨트롤이 있습니다. 예 : CreateDate

UserControl 자체의 문제는 없습니다.

그러나 해당 UserControl 포함 된 양식 OG 디자이너를 입력라는 메시지와 디자이너 오류 창을 얻을 : ". 데이터 소스의 속성이나 열 CreateDate에 결합 할 수 없습니다 매개 변수 이름 : DataMember를"실행 I에서

동일한 오류가 발생하지만 먼저 Show가 폼에서 호출 될 때. 여기에 CheckBinding 호출 후에 throw 된 스택 추적을 볼 수 있습니다.

양식의 작성 (생성자) 또는로드 이벤트 중 bindingSource의 DataSource가 설정되었는지 여부에 관계없이 오류가 발생합니다.

디자이너가 내 데이터 소스를 디자이너 파일에 설정하는 것을 볼 수 있습니다. this.bindingSourceRecipe.DataSource = typeof (Data.Entities.Recipe);

이 문제를 해결하기 위해 많은 노력을 기울였습니다. 이것은 매우 이상한 것으로 보이는데 이는 죽은 간단한 폼/컨트롤 설정이며 Winforms usercontrols를 사소한 용도로 사용해야합니다.

런타임에 bindingSourceRecipe.DataSource를 temp로 설정하면 어떻게됩니까? 폼의 InitializeComponent() 바로 뒤에 인스턴스가 생기면 오류가 발생하지 않습니다.

폼/컨트롤의 초기화주기가 어떻게 든 데이터 원본 형식에 대한 바인딩 원본 정보를 지우는 것 같습니다.

물론 모든 사용자가 제어하는 ​​곳과 양식에 직접 BindingSource가있는 경우에는 이러한 일이 발생하지 않습니다. 그렇다면 모든 것이 작동하며 DataSource가 Data 엔티티의 인스턴스로 설정되는지 여부는 중요하지 않습니다.

나에게는 완전한 신비처럼 보입니다. 죽은 사람이 단순해야하며,해야 할 일이별로 없습니다.

도움이나 제안을 보내 주시면 대단히 감사하겠습니다. BR 피터 Meldgaard

+1

아, 마침내 찍었습니다. Winform 디자이너의 동작과 코드가 혼합되어 발생했습니다. 공용 속성 setter에서 바인딩 컨트롤 데이터 소스를 설정 했으므로 변경된 항목과 조직을 비교할 수 있도록 엔티티의 복사본을 저장할 수있었습니다. 중요한 점은 양식에 public 속성이있는 컨트롤을 배치하면 디자이너가 생성 한 코드에서 디자이너가이 속성을 null로 설정한다는 것입니다. 난 몰랐어. 따라서 사용자 정의 컨트롤이 인스턴스화 될 때마다 DataSource는 null로 설정되어 typeof (데이터 요소)를 지우고 바인딩 정보가 손실됩니다. –

답변

1

는 아, 그것은 마지막에 박혀 있어요. Winform 디자이너의 동작과 코드가 혼합되어 발생했습니다. 공용 속성 setter에서 바인딩 컨트롤 데이터 소스를 설정 했으므로 변경된 항목과 조직을 비교할 수 있도록 엔티티의 복사본을 저장할 수있었습니다. 문제는 폼에 공용 속성이있는 컨트롤을 배치하면 디자이너가 디자이너가 생성 한 코드에서이 속성을 null로 초기화한다는 것입니다. 난 몰랐어.따라서 사용자 정의 컨트롤이 인스턴스화 될 때마다 DataSource는 null로 설정되어 바인딩 정보가 손실되었지만 typeof (데이터 요소)를 지 웁니다.

setter에 null 체크를 추가하고 값이 null이 아닌 경우 datasource 만 업데이트하면 문제가 해결됩니다.

관련 문제