2010-06-08 5 views
0

내 DataGrid의 셀을 떠날 때 BindingSource.AddingNew가 호출되지 않습니다.C# BindingSource.AddingNew가 호출되지 않습니다?

DataGrid에는 다시 "Customer"의 "List"가있는 BindingSource가 있습니다.

BindingSource는 새 Customer 개체를 만들고 기본 ICustomerList에 추가해야하는 대상은 무엇입니까?

인터페이스는 생성자가 없습니다 물론

...

하지만 내 고객 객체는 기본 생성자가! 예외 한게

I 얻을 :

System.MissingMethodException: The constcructor for the type "SAT.EnCoDe.Administration.ICustomer" was not found. 

BEI System.RuntimeType.CreateInstanceImpl (BindingFlags의 bindingAttr는 바인더 바인더 [] activationAttributes 개체 [] args를 CultureInfo를 배양 개체) BEI의 System.SecurityUtils.SecureCreateInstance을 (Type 형식, Object [] args) bei System.ComponentModel.BindingList 1.AddNewCore() bei System.ComponentModel.BindingList 1.System.ComponentModel.IBindingList.AddNew() bei System.Windows.Forms.BindingSource.AddNew() bei System.Windows.Forms.CurrencyManager .AddNew() bei DevExpress.Data.CurrencyDataController. OnCurrencyManagerAddNew() BEI DevExpress.Data.CurrencyDataController.AddNewRow() BEI DevExpress.XtraGrid.Views.Grid.GridView.OnActiveEditor_ValueModified (개체 보낸 사람, EventArgs입니다 전자) BEI DevExpress.XtraEditors.Repository.RepositoryItem.RaiseModified (EventArgs입니다 전자) BEI DevExpress.XtraEditors.BaseEdit.OnEditValueChanging (ChangingEventArgs E) BEI DevExpress.XtraEditors.TextEdit.OnMaskBox_ValueChanged (객체 송신자있는 EventArgs E) BEI DevExpress.XtraEditors.Mask.MaskBox.RaiseEditTextChanged() BEI System.Windows.Forms.TextBoxBase .WmReflectCommand (메시지 &m) bei DevExpress.XtraEditors.Mask.MaskBox.BaseWndProc (메시지 &m) bei DevExpress.XtraEditors.Ma sk.MaskBox.WndProc (메시지 & m) BEI DevExpress.XtraEditors.TextBoxMaskBox.WndProc (메시지 & MSG) BEI System.Windows.Forms.Control.ControlNativeWindow.WndProc (메시지 & m) BEI System.Windows.Forms. NativeWindow.Callback (IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

답변

0

데이터 바인딩을위한 개체는 AddNew를 사용할 경우 매개 변수없는 생성자가 있어야합니다. 분명히 인터페이스에는 생성자가 없으므로 이것은 상당히 고통 스럽습니다. 인스턴스화 할 수 없으므로이를 위해 추상 클래스를 사용할 수도 없습니다. 유일한 방법은 구체적인 유형을 계층 구조의 루트로 사용하는 것입니다. 새 행이 활성화되면 사용자가 Esc 키를 누를 때 DataGridView에이 ICancelAddNew와 버그를 가지고 있기 때문에 그것을 포기하는 것 외에

참고로 당신은 IBindingList

을 볼 수 있고 단순히 공포가 시작 다음을 떠난다. 내 경험에 비추어 볼 때 더 나은 해결책은 "Add new .."버튼과 textboxes/comboboxes가있는 또 다른 윈도우를 만드는 것입니다. 물론 표준 DataGrid 컨트롤보다 다른 DataGrid 컨트롤을 사용하고 있다면 문제가되지 않습니다.

이러한 문제는 WPF 및 해당 DataGrid 구성 요소에서 완전히 해결됩니다. 새로운 프로젝트이고 WPF로 전환 할 수 있다면 강하게 제안 할 것입니다. 고통이 훨씬 적다는 것을 의미합니다.

+0

wpf ... 좋은 200000 LOC 응용 프로그램은 아름다운 wpf의 빛을 결코 보지 못할 것입니다 ... http://msdn.microsoft.com/en-us/library/system.windows.forms.bindingsource. allownew.aspx 그 링크에서 AllowNew가 false로 설정된 이유 3 가지를 보았습니다. 내 BindingSource 속성 AllowNew. 나는 그 이유 3 그래서 나는 그것이하여 매개 변수가의 ctor 추가 고정 생각하지만, 또 다른 ctor에이 고객 개체에 대한) 새 GUID (하나 개 매개 변수가 있기 때문에 아직도 내가 어쩌면 을 같은 오류가? – msfanboy

+0

매개 변수가있는 두 번째 Ctor를 제거했습니다./ – msfanboy

+0

ok 여기까지 이동 : 기본 Ctor가있는 경우에도 BindingSource의 속성 창에서 DataSource 유형을 할당 할 때 AddNew 속성을 FALSE로 설정합니다. ICustomerList. IBindingList를 구현하는 BindingList 또는 도 있습니다. 모든 요구 사항에도 불구하고 완벽하게 작동하지 않습니다. 그래서 BindingSource_AddNew 이벤트를 catch하고 을 통해 새 고객을 추가하십시오. e.NewObject = new Customer (Guid.NewGuid()); 지금까지 작동 ... – msfanboy

0

나는 당신의 질문을 이해했습니다. 왜 셀을 떠날 때 바인딩 소스가 새 항목을 추가할까요?

새 항목을 추가하는 경우 eventargs의 속성을 AddingNew로 설정하여 추가 할 새 개체를 사용할 수있는 '재정의'(일반적인 의미가 아닌이 특정 컨텍스트에서만 단어 사용)를 사용할 수 있습니다. 당신이 원하는 생성자. 간단히 e.NewObject = new YourObject를 설정하십시오.

관련 문제