문제

데이터 바인딩 된 DataGridView에서 외래 키 조회를 표시 할 수있는 WinForms 응용 프로그램 (.Net 3.5, WPF 없음)을 개발 중입니다.

일종의 관계의 예는 OrderLine 테이블이 있다는 것입니다. 주문 라인에는 제품에 대한 외래 키 관계가 있고 제품에는 ProductTypes에 대한 외래 키 관계가 있습니다.

각 행이 주문 라인을 나타내는 데이터 바인딩 된 DataGridView를 갖고 라인의 제품과 제품 유형을 표시하고 싶습니다.

사용자는 그리드에 직접 주문 라인을 추가하거나 편집 할 수 있으며 comboBoxColumn에서 주문 라인에 대한 제품을 선택할 수 있습니다. 그러면 동일한 행에 선택한 제품에 대한 제품 유형이 표시되는 제품 유형 열이 업데이트됩니다.

지금까지 찾은 가장 잘 맞는 방법은 주문 선을 나타내는 도메인 개체를 도입 한 다음 DataGridView를 이러한 주문 선 컬렉션에 바인딩하는 것입니다. 그런 다음 제품 및 제품 유형을 노출하는 주문 행 개체에 속성을 추가하고 관련 notifypropertychanged 이벤트를 발생시켜 모든 것을 최신 상태로 유지합니다. 내 주문 행 저장소에서이 주문 행 객체와 데이터베이스의 세 테이블 사이의 매핑을 연결할 수 있습니다.

이것은 데이터 바인딩 측면에서 작동하지만 저장소에서 모든 OR 매핑을 코드화해야하는 것은 좋지 않은 것 같습니다. 나는 nHibernate가이 연결을 도울 수있을 것이라고 생각했지만 모든 외래 키를 통한 매핑에 어려움을 겪고 있습니다-그들은 잘 작동하는 것 같습니다 (주문 라인의 제품에 대한 외래 키 조회는 외래 키를 기반으로 올바른 제품 객체를 생성합니다) 데이터 바인딩을 시도하면 제품 또는 제품 유형 개체를 업데이트하기 위해 데이터 바인딩 된 ID 열을 가져올 수 없습니다.

올바른 야구장에서도 일반적인 접근 방식이 있습니까? 그렇다면 매핑 문제에 대한 좋은 해결책은 무엇입니까?

또는 내가 고려하지 않은 외래 키 조회를 포함한 데이터 바인딩 행에 대한 더 나은 솔루션이 있습니까?

도움이 되었습니까?

해결책

문제는 그리드에 바인딩 할 때 INotifyPropertyChanged를 지원하는 것으로는 충분하지 않지만 IBindingList 구현을 재정의하고 SupportsChangeNotification 속성. 이에 대해 true를 반환하지 않으면 그리드는 데이터가 변경되었는지 알기 위해 찾지 않습니다.

.NET 2.0 이상에서는 BindingList를 사용하여 일반 컬렉션을 만들 수 있습니다. 클래스를 사용하면 대부분의 성가신 문제를 처리합니다 (SupportsChangeNotification 속성에 대해 재정의하고 true를 반환하는 것을 잊지 마십시오).

데이터 바인딩에 사용하는 클래스에 컬렉션 인 속성 (예 : IBindingList 또는 BindingList)이있는 경우 외래 키 그리드를 해당 속성에 직접 바인딩 할 수 있습니다. 양식 디자이너에서 바인딩을 구성 할 때 그리드의 데이터 소스로 컬렉션 속성을 선택하기 만하면됩니다. "그냥 작동"해야합니다. 유일하게 교활한 부분은 비어 있거나 null 컬렉션을 올바른 방식으로 처리하는지 확인하는 것입니다.

다른 팁

StackOverflow에 오신 것을 환영합니다 :)

일반적으로 드롭 다운에있는 정보를 두 가지 값을 기반으로합니다. ValueMember 및 DisplayMember .

ValueMember는 실제 제어 값 (주문 라인의 키 값이 됨)의 소스이고, 디스플레이 멤버는 값 대신 사용자에게 표시되는 값 (FK 값이 됨)입니다..

필요한 모든 데이터를 반환하고 이러한 속성을 설정할 수없는 특별한 이유가 없습니까?

다음은 데이터 바인딩을 보여주는 좋은 "방법"동영상입니다.

http://windowsclient.net/learn/video.aspx?v=52579

글쎄요, DataGridView에서 지원하는지 여부는 모르겠지만 일반 WinForms 데이터 바인딩 (예 : 일반 TextBox)을 수행 할 때 속성 경로 를 사용하여 개체를 탐색 할 수 있습니다.관계.

예 : 라코 디스

당신의 상황에서도 이것이 효과가 있는지 볼 가치가있을 것입니다.

원래 질문은 분명하지 않았습니다. 죄송합니다.

문제는 일반적으로 DataGridView에 대한 데이터 바인딩이나 DataGridViewComboBoxColumn의 구현이 아니 었습니다. 이미 올바르게 대답 한 사람들은 웹에 잘 설명되어 있습니다.

해결하려는 문제는 관계를 드릴 다운하는 속성의 새로 고침입니다.

주문 예에서 "제품"열의 값을 변경할 때 "제품 유형"열이 업데이트되지 않습니다. 코드에서 속성을 설정하고 NotifyPropertyChanged 이벤트를 실행하더라도. (디버그에서 나는 모든 올바른 위치로 이동합니다)

많은 조사 끝에 데이터 소스의 "Product Type"속성을 "Product"setter에서 설정하는 것이 아니라 직접 설정해도 작동하지 않는다는 것을 깨달았습니다.

제가 올바른 길로 돌아 오게한다고 생각하는 또 다른 점은 기본 형식으로 생성 된 모의 데이터 액세스 레이어를 제공하면 모든 것이 잘 작동한다는 것입니다.

또한 nHibernate에서 만든 IList를 IBindingList에 복사하면 모든 것이 다시 정상적으로 나타납니다.

그래서 문제는 특정 데이터 소스를 사용할 때 스레딩과 NotifyPropertyChanged 이벤트가 특정 방식으로 손실되는 것 같습니다 (이보다 더 명확 할 수 있기를 바랍니다!)

IList를 IBindingList에 복사하는 것보다이 문제를 해결하는 더 나은 방법을 계속 연구 할 것입니다. 스레드 마샬링에 대해 배워야 할 수도 있습니다.

수정

이제 문제를 해결하고 혼란 스러웠던 것을 이해하는 솔루션을 개발했습니다. 기본적으로 BindingList에서 파생되지 않은 목록에 대해 기본 속성 데이터 바인딩 이외의 항목이 제대로 재생되지 않는 것 같습니다. 연결된 NotifyPropertyChanged 이벤트를 발생시킨 속성에 데이터 바인딩을 시도했지만 문제가 발생하여 이벤트가 손실되었습니다.

현재 사용중인 데이터 액세스 솔루션은 Rob Conery의 변형을 사용하고 있습니다. IRepository 패턴, 내가 만든 사용자 정의 클래스로 바인딩 할 컬렉션을 반환하고, BindingList에서 파생 된 SortableBindingLazyList는 Sort Core 메서드를 구현하고 내부 목록을 쿼리로 저장하여 목록 구체화를 지연시킵니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top