2014-04-30 106 views
2

我想自定義添加新項目的成BindingSource爲以下MSDN文章描述(所有強類型):在InvalidOperationException自定義StronglyTyped的BindingSource添加項目

How to: Customize Item Addition with the Windows Forms BindingSource

以下結果的代碼:添加到BindingSource列表的對象必須全部是相同的類型。而且,對象myTypesBindingSource.Current似乎是一個DataRowView與我相關行內。

我如何自定義添加強類型BindingSource的?

private void InitializeComponent() 
{ 
    this.components = new System.ComponentModel.Container(); 

    this.someDataSet = new myDB.SomeDataSet(); 
    this.myTypesBindingSource = new System.Windows.Forms.BindingSource(this.components); 
    this.myTypesTableAdapter = new myDB.SomeDataSetTableAdapters.myTypesTableAdapter(); 
    this.tableAdapterManager = new myDB.SomeDataSetTableAdapters.TableAdapterManager(); 
    this.myTypesBindingNavigator = new System.Windows.Forms.BindingNavigator(this.components); 

    this.someIntValueTextBox = new System.Windows.Forms.TextBox(); 

    // someDataSet 
    this.someDataSet.DataSetName = "SomeDataSet"; 
    this.someDataSet.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema; 

    // myTypesBindingSource 

    // As generated: 
    // this.myTypesBindingSource.DataMember = "myTypes"; 
    // this.myTypesBindingSource.DataSource = this.someDataSet; 
    this.myTypesBindingSource.DataSource = this.someDataSet; 
    this.myTypesBindingSource.AddingNew += new System.ComponentModel.AddingNewEventHandler(this.myTypesBindingSource_AddingNew); 

    // myTypesTableAdapter 
    this.myTypesTableAdapter.ClearBeforeFill = true; 

    // tableAdapterManager 
    this.tableAdapterManager.BackupDataSetBeforeUpdate = false; 
    this.tableAdapterManager.myTypesTableAdapter = this.myTypesTableAdapter; 
    this.tableAdapterManager.UpdateOrder = myDB.SomeDataSetTableAdapters.TableAdapterManager.UpdateOrderOption.InsertUpdateDelete; 

    // someIntValueTextBox 
    this.someIntValueTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.myTypesBindingSource, "someIntValue", true)); 
    this.someIntValueTextBox.Name = "someIntValueTextBox"; 
} 

private void myTypesBindingSource_AddingNew(object sender, AddingNewEventArgs e) 
{ 
    SomeDataSet.myTypesRow newRow = someDataSet.myTypes.NewmyTypesRow(); 
    newRow.someIntValue = 99; 
    e.NewObject = newRow; 
} 
+0

+1本作我調查了關於DataSets和DataBinding的進一步細節,這是我從未經歷過的。謝謝你讓我學習。 –

回答

2

在此示例中,它不是強類型BindingSource。事實上,AddingNewEventArgs.NewObject屬性是一個對象。所以,分配它的任何派生類型應該做到這一點。

另外,請注意,此示例使用一個類對象DemoCustomer,它是沒有DataSet.Tables[0].Row它返回一個DataRow。在我看來,使用DataSet這個遊戲有點不同。

當一個人使用DataSet,你必須只設置了DataTableBindingSource.DataSource,讓你寫的東西,如:

BindingSource.DataSource = DataSet.Tables[0]; 

這樣,當您添加使用BindingSource.AddNew()BindingSource.List項目,在BindingSource「知道」它有一個DataTableDataSource,所以它調用DataTable.NewRow()方法和新的DataRow被添加到您的DataTable!因此,有一個DataRow來處理,而不是一個簡單的對象。

DataRow

工作,如果你想要做的類似於MSDN上的例子說,你必須自己創建的行。

DataRow newRow = DataSet.Tables[0].NewRow(); 
newRow.Columns["intColumn"] = 99; 
e.NewObject = newRow; 

這樣,你應該能夠告訴你想要的默認值。

否則,如果沒有,你不妨試試這個:

var newRow = (DataRow)e.NewObject; 
newRow["intColumn"] = 99; 

這裏的缺點是,只要更改基礎數據庫表的列名,你就必須來到這裏,改變的你的名字intColumn,並重新編譯並重新部署。

此外,這並不經常發生,所以根據您的環境背景這可能是值得的。

編輯#1

已經更加重視後:

而且,對象myTypesBindingSource.Current似乎裏面

與我相關行一個DataRowView的

來自MSDN:DataRowView

無論何時顯示數據,例如在DataGrid控件中,每行只能顯示一個版本。顯示的行是一個DataRowView。

DataRowView可以具有四種不同版本狀態之一:默認,原始,當前和建議。

在DataRow上調用BeginEdit後,任何編輯的值都會變爲Proposed值。在調用CancelEdit或EndEdit之前,該行具有原始版本和建議版本。如果調用CancelEdit,則提議的版本將被丟棄,並且該值將恢復爲原始值。如果調用EndEdit,則DataRowView不再具有建議版本;相反,建議值變成當前值。缺省值僅在具有定義了默認值的列的行上可用。

這意味着添加新行時,實際上是添加了DataRowView。您可以通過訪問DataRowView.Row屬性來訪問當前行。

考慮到這一點,你可能也許在我最初的回答改變的建議解決方案是:

var newRow = ((DataRowView)e.NewObject).Row; 
newRow.Columns["intColumn"] = 99; 

編輯:(由史蒂芬)終極密碼

DataView dv = (DataView)myTypesBindingSource.List; 
DataRowView drv = dv.AddNew(); 
SomeDataSet.myTypesRow newMyTypesRow = (SomeDataSet.myTypesRow)drv.Row; 
newMyTypesRow.someIntValue = 53; 
e.NewObject = drv; 
myTypesBindingSource.MoveLast(); 
+0

屬性編輯器只允許我將BindingSource.DataSource設置爲DataSet。沒有按鈕可以進一步擴展。如果我更改Designer.cs文件中的值,它將反映在「屬性」窗口中,但我仍然收到相同的錯誤。 – Steven

+0

通過窗體設計器執行它可能會限制代碼實際可執行的某些行爲。我建議你提供一些進一步的代碼示例,顯示你的'BindingSource','DataGridView','BindingNavigator'和'DataSet'是如何被初始化並在以後使用的。這可能會爲我提供更多詳細信息,以便進一步提供幫助。 –

+0

我將myTypes DataTable從Data Sources窗口拖到添加以下所有內容的表單上:someDataSet,myTypesBindingSource,myTypesTableAdapter,tableAdapterManager,myTypesBindingNavigator。我將編輯我的原始文章以包含更多可能相關的代碼。 – Steven

相關問題