|
画面項目(TextBox)の入力内容がDatasetへ反映されない。 投稿日時: 2006-2-17 午後 7:54 |
VS2005 pro OS Xp DB Ms SQL Sever 2005 Developer (SERVER は Windows 2003 Server)
現象: レコードの新規追加(BindingSource)のAddNew 後、画面入力を 行った後、 ナビゲーション(BindingNavigator)の戻るボタンを押すと カレントレコードに反映(EndEdit)を行うと なぜかデータベースの例外処理(必須項目がNULL)になっている
BindingSource のメンバーの詳細項目について
データ更新モードはデフォルトでは「OnValidaion」になっています。
つまり画面の項目(TextBox)にDataBindingで結び付けられた項目は データ更新モードが「OnValidaion」の場合は何らかのデータ入力後、 フォーカスが他のフィールドへ移った場合に項目(TextBox)の内容 がBindingSourceのDataSetへ反映されるはずです。 実験すると他の画面項目に移った場合は反映されています。
ところが次の場合は反映されないのです。
項目(TextBox)にデータ入力後ツールストリップバーのボタンを押した場合 たとえばBindingnaVigatorの戻るボタン押した場合など
画面の項目(TextBox)のValidaioイベントの処理をマークし、デバッグ 監視しましたがValidaioイベントの処理はされていないようです。
BindingnaVigatorのプロパティでアイテムについて この場合はVs2005のデフォルト設定ではアイテムがすべて設定されていますが 自分のプログラムで制御したいのでアイテムはすべてなしにしてあります。 「MovePreviusItem」をなしに設定、戻るボタンのClick時の処理を自分で コーディングしてあります。
このままだと、更新を確実にするにはいちいち画面の項目を BindingSourceのカレントフィールドへセットしなければなりません。
このあたりのことですがご存知の方はいらしたら、ご教授ねがいます。
|
|
|
|
Re: 画面項目(TextBox)の入力内容がDatasetへ反映されない。 投稿日時: 2006-2-17 午後 9:11 |
> 項目(TextBox)にデータ入力後ツールストリップバーのボタンを押した場合 > たとえばBindingnaVigatorの戻るボタン押した場合など
通常のオペレーションでは、「キャンセル」や「戻る」といった操作は、入力内容がエラーであっても実行できる必要があります。このため、CausesValidation プロパティでこの動作を制御できますが、BindingNavigator はデータセットの行操作を行うので、CausesValidation プロパティは常に true になります。
簡単に TextBox と BindingNavigator, BindingSource を用いてテストしてみましたが、常に Validating イベントが発生していることが確認できました。 簡単に再現できるような設定やコードはありませんでしょうか?
|
|
|
|
Re: 画面項目(TextBox)の入力内容がDatasetへ反映されない。 投稿日時: 2006-2-17 午後 10:57 |
以下にサンプルを掲載します。
※データベースに顧客マスターという名前のテーブルを用意します。
スキーマ 担当会社コード Varchar(1) ・・・ NULL 禁止 顧客コード varchar(7) ・・・ NULL 禁止 主キー項目
① VB.NET の新規プロジェクトを WINDOWS フォームとして作成。 (プロジェクト: 名前はTEST_A1) (フォーム名 : form1) ② データベースの接続を作成します。 メニュー → データ → 「新しいデータソースの追加」 ウイザードが開始されます。 データソースの選択:「データベース」を選択する。 接続 :新規作成にて (プロバイダ:Microsoft SQL SERVER (client) ) (接続先 : (サーバー名) DB名: 顧客DB) (テーブルは顧客マスターのみとします。) ③ データセットの生成 メニュー → 「データソースの表示」にて データソースを開きます。別ウインドウで表示されます。 データソースのエクスプローラ画面の項目 顧客マスター のプルダウンをクリックし、「詳細」を選択します。 次に顧客マスターの項目の中からどれでもかまいません 一つをフォーム( form1)にドラッグ&ドロップします。 顧客マスターの項目のテキストボックスが配置されます。 フォーム( form1)にアイコンが自動的に配置されます。 顧客DBdataset、顧客マスターBindingsource、 顧客マスターTableAdapter ④ ナビゲーション(BindingNavigator)のプロパティを変更します。 プロパティを開き 以下の「アイテム」の項目の設定をすべて「なし」にします。 この設定により「なし」に設定したボタンの元々の処理が行われなくなり それぞれのClick時の処理は自分で書いたコード以外は行われません。
「AddItem」・・・・・・BindingNavigatorAddNewItem →なし 「MoveNextItem」・・・・BindingNavigatorMoveNextItem →なし 「MovePreviusItem」・・BindingNavigatorMovePreviousItem →なし ↓ 他のボタンについてはサンプルのためそのまま 実際の処理ではすべて「なし」に設定、それぞれの処理は 自分で書いています。
⑤画面項目(TextBOX)の入力がDATASETへ反映する方法の確認 Validatingイベントでの更新がされるようにする。
a.画面の会社コード、顧客コードのプロパティをを開く b.(DataBinding)の詳細「...」を開く → 「フォーマットと詳細バインド」のウインドウになります。 c.「フォーマットと詳細バインド」の「データモード更新モード(D)」の設定(プルダウンリスト) がデフォルトの設定である「OnValidate」になっていることを確認します。 d.OKボタンを押して「フォーマットと詳細バインド」のウインドウを閉じます。 ⑥ フォーム(form1)にコーディングを行います。
Public Class Form1
Dim RR As DataRowView
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'TODO: このコード行はデータを '顧客DBdataset.顧客マスター' テーブルに読み込みます。必要に応じて移動、または削除をしてください。
Me.顧客マスターTableAdapter.Fill(Me.顧客DBdataset.顧客マスター)
RR = Me.顧客マスターBindingSource.Current
End Sub
Private Sub 顧客マスターBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 顧客マスターBindingNavigatorSaveItem.Click
RR = Me.顧客マスターBindingSource.Current
If RR.IsNew Then
If F編集CHK() = False Then
RR.CancelEdit()
GoTo SV01
End If
End If
If F編集CHK() Then
'ここにユーザー項目のエラーチェック処理を記述します。
RR.EndEdit() ' 最後にカレント行を更新します。
End If
SV01:
Me.Validate()
Me.顧客マスターBindingSource.EndEdit()
Me.顧客マスターTableAdapter.Update(Me.顧客DBdataset.顧客マスター)
End Sub
Private Sub BindingNavigatorAddNewItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BindingNavigatorAddNewItem.Click
RR = Me.顧客マスターBindingSource.Current
If RR.IsNew Then
Beep()
Return
End If
Me.顧客マスターBindingSource.AddNew()
End Sub
Private Sub BindingNavigatorMovePreviousItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BindingNavigatorMovePreviousItem.Click
If Not (Me.顧客マスターBindingSource.Position > 0) Then
Beep()
Return
End If
RR = Me.顧客マスターBindingSource.Current
If RR.IsNew Then
If F編集CHK() = False Then
RR.CancelEdit()
GoTo NEXT01
End If
End If
If F編集CHK() Then
'ここにユーザー項目のエラーチェック処理を記述します。
'
'---------------------------------------------------
'
'
RR.EndEdit() ' 最後にカレント行を更新します。
End If
NEXT01:
Me.顧客マスターBindingSource.Position -= 1
End Sub
Private Sub BindingNavigatorMoveNextItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BindingNavigatorMoveNextItem.Click
If Not (Me.顧客マスターBindingSource.Position < (Me.顧客マスターBindingSource.Count - 1)) Then
Beep()
Return
End If
RR = Me.顧客マスターBindingSource.Current
If RR.IsNew Then
If F編集CHK() = False Then
RR.CancelEdit()
GoTo NEXT01
End If
End If
If F編集CHK() Then
'ここにユーザー項目のエラーチェック処理を記述します。
RR.EndEdit() ' 最後にカレント行を更新します。
End If
NEXT01:
Me.顧客マスターBindingSource.Position += 1
End Sub
Private Function F編集CHK()
RR = Me.顧客マスターBindingSource.Current
F編集CHK = True
If RR.IsNew Then
Select Case False
Case Me.担当会社コードTextBox.Text = ""
Case Me.顧客コードTextBox.Text = ""
Case Else
F編集CHK = False
End Select
Else
Select Case True
Case Me.担当会社コードTextBox.Modified
Case Me.顧客コードTextBox.Modified
Case Else
F編集CHK = False
End Select
End If
End Function
Private Sub 顧客コードTextBox_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles 顧客コードTextBox.Validating
End Sub
Private Sub 担当会社コードTextBox_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles 担当会社コードTextBox.Validating
End Sub
End Class
==================================================== 結論を言いますと 原因はわかりました。
たぶん、おしゃっていることと同じだと思いますが・・・
このサンプルの RR.Endedit の前に Me.Validate を加えれば解決できました。
Me.Validate
RR.Endedit
BindingNavigator の保存ボタンのコードは自動生成されますがそのコード中に 同じ記述がありました。
実験してみたところうまく行きました。
Vs2005では カレントのレコードの更新時には 必ずこの記述が必要なようですね マニュアルやサンプルではわかりませんでした。 絶対に必需品のようなコードだと思いますが・・・
以上
|
|
|
|
Re: 画面項目(TextBox)の入力内容がDatasetへ反映されない。 投稿日時: 2006-2-22 午前 10:38 |
> 以下の「アイテム」の項目の設定をすべて「なし」にします。 > この設定により「なし」に設定したボタンの元々の処理が行われなくなり > それぞれのClick時の処理は自分で書いたコード以外は行われません。
このあたりが原因だった、ということですね。
メニューやツールバーといったオブジェクトは、入力フォーカスを奪わない UI 要素なので、標準では Validating は発生しないようになっています。これに対して、BindingNavigator では(前にも書きましたが)、データセットの状態を更新する必要があるため、すべてのボタンが Validating を行うようになっています。
BindingNavigator 自身は、「そういった動作をもったボタンを簡単に追加できる ToolStrip 」でしかありませんので、そこにご自身で追加されたボタンは、BindingNavigator の機能は全く関係なく、たんなる ToolStrip 上に配置したボタンでしかありません。 ですので、それらのボタンに関しては Validating が実施されないのが正常ですし、Validating が必要であれば、
> このサンプルの RR.Endedit の前に Me.Validate を加えれば解決できました。
という点が必要になります。
どうでもいい程度ですが、標準の機能を使わずに、すべてコーディングで済ませるのであれば、自動配置される BindingNavigator を削除して通常の ToolStrip を配置されるほうがスマートなコードになるかもしれません。 # BindingNavigator はコードレスで動くという点だけが強みだと思われるので
|
|
|
|
Re: 画面項目(TextBox)の入力内容がDatasetへ反映されない。 投稿日時: 2006-2-22 午後 12:11 |
Lady.BUG さまへ
ご返答ありがとうございます。
>>どうでもいい程度ですが、標準の機能を使わずに、すべてコーディングで済ませるのであれば、自動配 >>置される BindingNavigator を削除して通常の ToolStrip を配置されるほうがスマートなコードに >>なるかもしれません。 >># BindingNavigator はコードレスで動くという点だけが強みだと思われるので
これに関しては私は、Access VBA と比較するとどうもなじめないのです。 場違いな質問と言われればそれまでですが・・・
本来はコードレスで動く、でも 自動実行される処理はイベントの中断ができないため 画面項目(textBox) などのエラーがあった場合などに大変困ります。 したがって自分でコーディングしています。
また、標準で組み込まれるボタンでありデザインなども統一できます。
BindingNavigator 自身を単なるToolStripと考えて使っています。場合によっては一部のボタンについては そのまま処理を生かす場合もあります。 スマートかどうかは わかりませんが・・・
|
|
|
|
Re: 画面項目(TextBox)の入力内容がDatasetへ反映されない。 投稿日時: 2006-2-22 午後 12:38 |
> 本来はコードレスで動く、でも 自動実行される処理はイベントの中断ができないため 画面項目(textBox) > などのエラーがあった場合などに大変困ります。 したがって自分でコーディングしています。
ここのところを、もうすこし具体的に書くと、解決の視点があるかもしれません。 すくなくとも、データの検証が Toolstrip のボタンで発生するのはオカシイかんじがしますです。
|
|
|
|
Re: 画面項目(TextBox)の入力内容がDatasetへ反映されない。 投稿日時: 2006-2-23 午前 12:14 |
Lady.BUG さまへ
● BindingNavigator のコードレスで動く自動処理について BindingNavigator のコードレス処理をそのままの形でユーザー側に画面入力項目にエラーが あった場合のハンドリングがうまくできればいいのですけれど 先に述べたとおり途中でキャンセルは不可能です。
それで 「AddItem」・・・・・・BindingNavigatorAddNewItem →なし 「MoveNextItem」・・・・BindingNavigatorMoveNextItem →なし 「MovePreviusItem」・・BindingNavigatorMovePreviousItem →なし ↓ 他のボタンについてはサンプルのためそのまま 実際の処理ではすべて「なし」に設定、それぞれの処理は 自分で書いています。
という形にしています。 エラー通知はしたのはいいけれど処理を止めさせることは不可能です。
一例を挙げると たとえば 新規レコードに対して画面入力中でかつ編集されている状態 で画面の項目、サンプルで言えば 顧客コードが間違っているなどの状態で 戻るボタンを押したらどうなるでしょうか? 戻るボタンのClick 処理でエラー通知(顧客コードが間違っているなど)することはできます。 しかしレコードポジションは一つ前に移ってしまっています。 エラー通知した画面 が偏移しています。 これでは困ります。
●Validate イベントについて >>すくなくとも、データの検証が Toolstrip のボタンで発生するのはオカシイかんじがしますです Lady.BUG さまも2回目のご返答にておっしゃっている通り BindingNavigator のコードレス処理 には Validate イベントが組み込まれています。 実験するとわかります。 画面の項目、サンプルで言えば 顧客コードなどを入力後、にTOPへ戻るボタンなどを押してみてください。 顧客コードTextBox_Validatingがトレースできるはずです。 もし、自分で書いたコードで Me.validate() を発生させなければ入力内容をカレントレコードのDatset へ反映できません。
別な意味で「データの検証が Toolstrip のボタンで発生するのはオカシイかんじがしますです 」 ということで画面入力項目のエラー処理を行うのがおかしいという意味??? 私の方法がスマートでない、もっときれいで簡単にできるのであればご教授ください。
|
|
|
|
Re: 画面項目(TextBox)の入力内容がDatasetへ反映されない。 投稿日時: 2006-2-23 午前 11:03 |
> 別な意味で「データの検証が Toolstrip のボタンで発生するのはオカシイかんじがしますです 」 > ということで画面入力項目のエラー処理を行うのがおかしいという意味???
すいません、書き方が悪かったかもしれません。 ボタンのクリックイベントに、データ検証の実装を行うことが実装ポイントとしておかしいと思います。
データ検証の実装は、データセットの各カラムや入力コントロールといったものに対して実装されるのが自然ではないかと思います。そうなっていれば、BindingNavigator の標準のボタンで、きちんとキャンセル処理が通るのではないかと思います。
たとえば、入力コントロールである TextBox においてデータの検証を行い、OnValidating イベントで Cancel = True とすれば、BindingNavigator の標準のボタンの動作はキャンセルされます。
> 戻るボタンのClick 処理でエラー通知(顧客コードが間違っているなど)することはできます。 > しかしレコードポジションは一つ前に移ってしまっています。
というようなことにはならないはずです。エラー時に Cancel プロパティを設定されていますでしょうか?
ただし、データ更新設定の DataSourceUpdateMode.OnValidation は、個々のコントロールが値の検証に成功した際に、データセットへ値を設定にいくというものですので、Cancel = True とするとデータセットへは値は設定されません。
|
|
|
|
Re: 画面項目(TextBox)の入力内容がDatasetへ反映されない。 投稿日時: 2006-2-23 午後 2:09 |
Lady.BUG さまへ
>>たとえば、入力コントロールである TextBox においてデータの検証を行い、 >>OnValidating イベントで Cancel = True とすれば、BindingNavigator の標準のボタンの動作は >>キャンセルされます。
● BindingNavigator の標準のボタンの動作 有効時における 「OnValidation」 画面項目(TextBOX)のValidatiing イベント 検出による データチェック
画面項目(TextBOX)のValidatiing イベント処理にてキャンセルできることは以前から知っては いましたがそれは 入力があった場合のみの項目しか検出されません。 つまり画面項目(TextBOX)の編集入力のあった項目に対してのみです。 また、実験するとわかったのですが 新規挿入(+)ボタンもしくは進めボタン(→)などを押すと 入力しているいないにかかわらず 画面入力項目の先頭の項目 サンプルでは 担当会社コード がなぜかValidatiing イベント が発生しています。
ユーザーに対する画面項目のエラーチェックをそれぞれの項目(TextBox)の「Onvalidation」 つまり 画面項目(TextBOX)のValidatiing イベント 処理で、すべてエラーチェック処理を するのは難しいと思います。
例 サンプルのスキーマを使用、BindingNavigator の標準のボタンで動作するようにします。 サンプルのForm1のLOAD イベント処理以外のコードはすべて削除します。
新規挿入(+)ボタンを押します。 画面入力にて 担当会社コードを「1」を入力します。 顧客コードは未入力のままです。 この状態で戻るボタン(←)を押します。
エラーが発生、例外処理となります。 顧客コードは未入力(NULL) だからです。
デバッグトレースすると。 担当会社コードのTextboxに対する Validatiing イベント が発生 顧客コードのTextboxに対する Validatiing イベント は発生しませんでした。
このように 画面項目(TextBOX)のValidatiing イベント 処理で すべてのエラーを見逃すことなくチェックするのは難しいです。
※ 結論 単純化するにはボタンが押されたときに必ず、画面入力、つまり編集の有無を検出して すべての項目に対する画面項目のエラーチェックを行うことがベストだと思っています。 ですから BindingNavigator の標準のボタンの動作は有効にせず自分でコーディング しています。 でも BindingNavigator の標準のボタンの動作は無条件に 画面項目の最初の項目のみ Validatingイベントを発生させるのでしょうか? 毎回、全部の項目ならコーディングの仕方もあると思いますが・・・ |
|
|
|
Re: 画面項目(TextBox)の入力内容がDatasetへ反映されない。 投稿日時: 2006-2-23 午後 3:54 |
> 画面項目(TextBOX)のValidatiing イベント処理にてキャンセルできることは > 以前から知ってはいましたがそれは 入力があった場合のみの項目しか検出されません。
大々前提として、データベースとか DataBinding とかを話す以前に、.NET の Validating に関するフレームワークモデルについてのご理解は大丈夫でしょうか? Validating イベントは検証対象となったコントロール(と、その親コンテナ)にのみ発生するのは正しい仕様です。 # .NET 2.0 から検証時に子を含めるかどうかなどを変更できるようにもなっています
逆に、この状態で顧客コードに対して Validating イベントが発生したら不具合だと思います。
また、Validating のモデルでは、すべての入力項目はエラーのない状態(未入力を含めてエラー検知しない)であることが前提になっています。ですので、DataSourceUpdateMode.OnValidation を設定している場合、その DataBinding は AddNew イベントが完了した時点で正当な状態になっているのはデータベースうんぬん以前の Validating モデルとして必須項目です。 これが満たせないならば、DataSourceUpdateMode として OnValidation を選択するべきではありませんし、選択したとしても期待する動作はしないことになります。
ですので、この場合、
> エラーが発生、例外処理となります。 > 顧客コードは未入力(NULL) だからです。
となるのは、「AddNew による新規レコード作成の実装ミス(必須項目に値を設定していない)」または「OnValidation を選択できるだけの前提が整っていない(Validation を要求している検証済みコントロールで Validation が成立しない状態)」のどちらかということになります。
> すべての項目に対する画面項目のエラーチェックを行うことがベストだと思っています。
現在の .NET の Validating によるデータ検証は『現在が全体として検証済みならば、編集があったところだけ確認すれば全体のデータ検証が完了する』というモデルです。 # これは、検証のたびにすべての項目のチェックを行うことが高コストである可能性が高いからでしょう
そのような形式で検証を進めることができないのであれば、先に書いたように個々のコントロールでは DataSourceUpdateMode として OnValidation を選択するべきではありません。フォーム自身のみが OnValidation で検証に参加するのが手軽だと思われます。 ( BindingNavigator からの検証が Form に届いたかどうかは未確認です ) |
|
|
|
Re: 画面項目(TextBox)の入力内容がDatasetへ反映されない。 投稿日時: 2006-2-23 午後 6:16 |
Lady.BUG さまへ
貴重なお時間を割いてのご返答ありがとうございます。 大変、助かります。
>>大々前提として、データベースとか DataBinding とかを話す以前に、.NET の Validating に >>関するフレームワークモデルについてのご理解は大丈夫でしょうか? >>Validating イベントは検証対象となったコントロール(と、その親コンテナ)にのみ発生するのは正しい仕様です。 >># .NET 2.0 から検証時に子を含めるかどうかなどを変更できるようにもなっています
まず、VB.NET 2005 および .NET Framework について 全般については 初心者です。 まだ、まだ勉強が不足しています。理解不足かもしれません。 また、理解不足を充実させるようなビギナーむけの資料はあまり見当たりません。 MSDNライブラリと首ぴっきです。
◆目標 私としては、Validating がどうのということではなく 正常に動作するプログラムが作りたい。 できることならエレガントで 見通しの良いプログラムを目指しています。
◆画面項目(TextBox)の入力項目エラーチェックについて OnValidation は 別にこだわっているのではありません。 VB.NETの仕様で動作をコントロールするにはどうすべきかということが課題です。 現状、OnValidation によるエラーチェック(TextBoxのValidatingイベント)は行わず ナビゲーションボタン BindingNavigatoe の標準ボタンの動作を行わない。すべて 自分の書いた処理を行っているのはそのためです。
>>また、Validating のモデルでは、すべての入力項目はエラーのない状態(未入力を含めてエラー検知 >>しない)であることが前提になっています。ですので、DataSourceUpdateMode.OnValidation を設定 >>している場合、その DataBinding は AddNew イベントが完了した時点で正当な状態になっているの >>はデータベースうんぬん以前の Validating モデルとして必須項目です。 >>これが満たせないならば、DataSourceUpdateMode として OnValidation を選択するべきではありま >>せんし、選択したとしても期待する動作はしないことになります。
◆OnValidation について BindingNavigator の標準のボタンの動作の場合は 私の場合、どうもOnValidation を使ってのデータ検証は難しいと思います。 他の人は、どのようなプログラムを書いているのでしょうか? 日経BPのMSの本(データベース開発入門)や 技術評論社の「Visual Basic.NETによる実践データベースプログラミング」にはOnValidationを用いての データチェックは見当たりません。 VS2003 での記事だからでしょうか? 保存ボタンを押した場合にチェックするとか、ナビゲーションボタンを押した場合に行っているように 思えますが
>>そのような形式で検証を進めることができないのであれば、先に書いたように個々のコントロールでは >>DataSourceUpdateMode として OnValidation を選択するべきではありません。フォーム自身のみが >>OnValidation で検証に参加するのが手軽だと思われます。
◆他の方法 ユーザーのエラー処理について Lady.BUG さまがおしゃっている件で、 「フォーム自身のみが OnValidation で検証に参加するのが 手軽だと思われます。」 というのはどのようなモデルでしょうか? チュートリアルもしくはサンプルなどをご提示できれば参考にさせていただきます。
|
|
|
|
Re: 画面項目(TextBox)の入力内容がDatasetへ反映されない。 投稿日時: 2006-2-24 午後 4:06 |
> OnValidation は 別にこだわっているのではありません。
そうですね、ここにこだわるのは無駄だと思います。
> 技術評論社の「Visual Basic.NETによる実践データベースプログラミング」には > OnValidationを用いての データチェックは見当たりません。 VS2003 での記事だからでしょうか?
そうだと思います。 DataSourceUpdateMode は .NET 1.1 時代に作成された多数のデータベースアプリケーションが、典型的に実装している処理として Validated イベントや各プロパティの Changed イベントを使用していることを受けて、それを DataBinding の機能として取り込んだ形になっていると思います。 ですので .NET 1.1 の参考文献では、すべて DataSourceUpdateMode.Never である前提で記述されているはずです。
DataSourceUpdateMode.OnPropertyChange はバインド先プロパティが、対象コントロールで Validation 対象であれば OnValidating の互換機能となり、バインド先プロパティが Validation 対象外であれば、Validation を無視してレコードを更新するようになっています。 # ここだけ考えると OnValidation はコントロールの Validation 以外で検証できるのが強みになるはずなように思いますが、そのための検証の口がわかりませんでした。
>> DataSourceUpdateMode として OnValidation を選択するべきではありません。 >> フォーム自身のみが OnValidation で検証に参加するのが手軽だと思われます。 >> ( BindingNavigator からの検証が Form に届いたかどうかは未確認です ) > 「フォーム自身のみが OnValidation で検証に参加するのが > 手軽だと思われます。」 というのはどのようなモデルでしょうか?
確認してみたところ、Form は BindingNavigator からの検証要求を受け取れないようです。 ですので、Form で検証を実施することはできないようです。
|
|
|
|
Re: 画面項目(TextBox)の入力内容がDatasetへ反映されない。 投稿日時: 2006-2-26 午前 1:13 |
Lady.BUG さまへ
少し、ご返答にお時間をいただきました。
私なりに思うことを以下にまとめます。
VS2003 ではすべて 画面項目(TextBox)は Never 設定であり、 Dataset へ書き込むには DataRowView を用いてで一つ一つ設定していた。
Vs2005 からは 画面項目(TextBox)は OnValdation,OnpropertyChanged,Never の3種類の方法でDataset へいつ反映できるかを設定できる。
◆ BindingNavigator の標準のボタンの動作
・前後のレコードのポジションの移動を伴う。
・内部で Validationイベントを発生させている。
・画面項目については データ検証を行うに当たっては 画面項目の個々の項目 のValidationイベント処理(サンプルでいえば顧客コードのTextbox)など) で記述する。 もし、エラーがあればキャンセルする。
・「アイテム」にて ボタン動作を無効にすることができる
※ 必須項目が含まれる場合、新規レコードの処理を行うには要注意です。 もしくは新規レコードの追加処理をできないようにするのも一つの方法です。 新規レコードの追加処理は別画面の専用フォームで処理するなど工夫が必要。
◆ Onvaldation について ・Vs2005から画面項目(TextBox)はデフォルトで Onvaldationが設定されている。
・どこからでも Me.Validate() を行えば 画面項目(TextBox)のOnvaldation設定 が有効であれば Dataset へ反映できる。
・MaskedTextBOX などは書式(-,¥)も含まれるので Never にしておいて受け取る際には 再編集が必要な場合も・・ 桁オーバーで例外エラーになってしまうかも・・・
・画面項目(TextBox)の全体的なデータ検証をOnvaldationのイベントだけで頼らず。 入力直後にフォーカスが移る場合に利用する。 たとえば郵便番号や電子メールアドレスの 入力チェックで書式通りに入力されているかなど・・・
◆ 画面項目(TextBox)のDatasetへの更新タイミング やり方は幾つかの方法があると思いますが、画面項目(TextBox)の設定がOnvalidation である とBindingNavigater やDatagridView などの Validate に振り回されてコントロールが難しくなり ます。すべての画面項目(TextBox)の設定をNever にすれば 自分でセットしない限り Dataset へは反映されないのでNever のほうが扱いやすいかもしれません。 ほかには 画面変移できない画面、登録専用画面で制御するのも方法だと思います。
☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
Lady.BUG さまのご指摘、勉強になりました。
おかげさまで大体の感じがつかめそうです。
|
|
|