2017-07-25 4 views
0

私は多くを検索しましたが、適切な解決策が見つかりませんでした。どのボタンがクリックされたかに応じてバインディングを検証する

私はTextBox,DataGridView,sおよびBindingSourceを持っています。

私は私が働く、バインディングおよびデータはDataGridViewからTextBoxにロードされている設定私のButton「変更」をクリックしてください:私は今Buttonをクリックすると

textBox.DataBindings.Add("text", bindingSource, "Name", true, DataSourceUpdateMode.OnPropertyChanged); 

結合を「キャンセル」はクリアされます。

textBox.DataBindings.Clear(); 

でも、データはDataGridViewに転送されます。私はそれがOnPropertyChangedのためだと思う。 OnValidationに変更すると、検証時にのみ保存されることがわかります。

しかし、どのように検証したり、検証を拒否できますか?私は2 Buttonを持っていて、「保存」ボタンか「キャンセル」ボタンがクリックされたかどうかによって、それはDataGridViewに転送されるべきです。イベント

textBox.Validating += textBox_Validating; 

そしてまた、私はボタンをクリックする前にこの関数が呼び出されるので、私は、それが実行して取得できませんでした。

どうすればこの問題を解決できますか?

答えて

2

DataSourceUpdateMode.Neverでバインディングを作成し、フォームレベルの変数(フィールド)に格納することができます。次に、WriteValueメソッドを使用して変更を適用できます(変更を取り消すにはそれぞれReadValue)。このような

何か:

形式:

Binding nameBinding; 

変更]ボタンをクリック:

nameBinding = textBox.DataBindings.Add("Text", bindingSource, "Name", true, DataSourceUpdateMode.Never); 

キャンセル]ボタンをクリックします。

nameBinding.ReadValue(); 
textBox.DataBindings.Clear(); 
nameBinding = null; 

保存]ボタンをクリック:私はより多くのコントロールを持っているので、

nameBinding.WriteValue(); 
textBox.DataBindings.Clear(); 
nameBinding = null; 
+0

おかげで、素晴らしい作品:)私は、今リスト使用し、foreachので、私はすべての値を読み書き。 – Beetee

+0

こんにちはIvan:今度は 'BeginEdit'、' CancelEdit'と 'EndEdit'でインターフェース' IEditableObject'を見つけました。これは 'ReadValue'や' WriteValue'のようなものですか? – Beetee

+0

こんにちは@ビーティ、まあまあです。まず、オブジェクトにそのインタフェースを実装する必要があります。また、 'BeginEdit'の実装は、' CancelEdit'が呼び出された場合にそれらを復元できるように、何らかの形ですべてのプロパティ値をどこかに格納する必要があります。上記の手法では、コントロール内に新しい値を保持し、特に要求された場合にのみデータソースを更新するため、このような要件はありません。 –

関連する問題