2012-09-27 17 views
6

私は作品注文のキャプチャフォームを持っていて、CustomerBindingSourceWorksOrderBindingSourceのコントロールを持っています。ほとんどの編集フィールドはWorksOrderBindingSourceにバインドされ、そのリストはCustomerBindingSourceにバインドされ、そのSelectedValueWorksOrderBindingSourceCustomerIdフィールドにバインドされています。これはすべて非常に日常的で標準的なものであり、ここでは面白さはありません。BindingSourceカレントレコードをnullに設定するにはどうすればよいですか?

次に、現在選択されている顧客のプロパティを表示するために、現在編集されているワークオーダーのテキストボックスフィールドがあります。これらのフィールドはCustomerBindingSourceにもバインドされています。顧客が選択されると、これらのフィールドにはその顧客のプロパティが期待通りに表示されます。

私の問題は、フォームを使用して新しい作品注文を取りたい場合です。新しいWorksOrderオブジェクトをCustomerId == nullでインスタンス化し、WorksOrderBindingSourceにバインドします。 にはId == nullというオブジェクトがありません。したがって、ドロップダウンコンボボックスは空白ですが、CustomerBindingSource.Currentプロパティはそのデータソース内の最初のCustomerオブジェクトを指しています。顧客リンクの表示フィールドにはその顧客の値が表示されますが、まだ選択されていない顧客はありません。

これは私には明らかな唯一の回避策は不器用なようです。その中には、2つのCustomer型付きバインディング・ソースがあります.1つは選択した顧客用で、もう1つはカスタマー・ディスプレイ・フィールドへの入力です。次に、選択イベントを処理しなければならず、顧客が選択されている場合にのみ、その顧客を表示ソースのバインディング・ソースで見つけ、選択されていない場合は、表示フィールドのデータソースをnullに設定します。これはひどく不器用だと感じます。私が欲しいものを達成する他の方法はありますか?

+0

なぜバインドソースに「please-select-a-customer」アイテムを追加しないのですか? – Bijan

+0

有効なCustomerIDがNewRowに割り当てられるように、現在の編集内容を保存することをユーザーに強制します。 –

答えて

1

私はこのトピックを見つけました正確に私の問題が、満足のいく答えはありません。私は古い話題ですが、alah ..

私は結末のソースに(あなたのCustomerBindingSourceになる)[PositionChanged]イベントを追加しました。

 private void CustomerBindingSource_PositionChanged(object sender, EventArgs e) 
    { 
     if(<yourCombobox>.SelectedIndex==-1) 
     { 
      CustomerBindingSource.SuspendBinding(); 
     } 
     else 
     { 
      CustomerBindingSource.ResumeBinding(); 
     } 
    } 
0

私が使用してどのような「クリア」のBindingSourceは、単に次のようにそのデータソースを設定することです:

CustomerBindingSource.DataSource = typeof演算(顧客)。

これが役に立ちます。

EDIT:明確にするために

、説明したように、あなたがBindingSource.DataSourceプロパティを設定すると、後の時点で元のデータソースを再割り当てすることができ妨げるものは何もありません:

//Retrieve customers from database 
List<Customer> Customers = WhatEverCallToDB(); 
CustomerBindingSource.DataSource = Customers; 

... 

//Later we need to blank the Customer fields on the Windows Form 
CustomerBindingSource.DataSource = typeof(Customer); 

... 

//Then again at a later point we can restore the BindingSource: 
CustomerBindingSource.DataSource = Customers; 

... 
+1

バインディングソースをクリアしません。私は、バインディング元のレコードが1つも選択されていないこと、つまり「アクティブ」であることがわかっています。 – ProfK

+0

私は、新しいWorkOrderを作成するときに、Customerに関連するフィールドを「空白」にしたいと思っていました。もしそうなら、私の方法はうまくいくが、私があなたのユースケースを誤解すれば、あなたは明確にできるか? –

+1

私は顧客に関連するフィールドを空白にしたいのですが、私は 'CustomerBindingSource.DataSource'で顧客レコードのセットを失いたくはありません。私はそのようなレコードを選択したくないだけです。 – ProfK

関連する問題