C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: AddNewItemの二重クリック禁止について


(過去ログ 120 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■70221 / inTopicNo.1)  AddNewItemの二重クリック禁止について
  
□投稿者/ おださと (1回)-(2014/03/03(Mon) 21:22:43)

分類:[.NET 全般] 

vb2010 10.0.40219.1 SP1Rel
Windows8

初心者で申し訳ないです。
分かりにくい表現があったらお詫びします。

現在、顧客管理のDBを作成しています。
顧客を登録する際、以下の手順にて行っています。
@プログラムを起動
A新規データを追加
Bデータ入力
Cデータの登録を実施する ←この時に顧客のIDをシーケンスから取得し、払い出されたIDを割り当てる

一見、何の問題もなかったのですが、
AでAddNewItemボタンを押したのちに、何も入力を行わずに
BindNavigatorのMoveFirstItemやMovePreviousItem、AddNewItemなどを押すと
必須項目となっている顧客IDがnullだということで、
エラーが発生してしまいます。

エラーを回避するために、AddNewItemのクリックイベントで
MoveFirstItemやMovePreviousItemボタンの
EnabledをFalseにして、クリックできないように試みましたが、
MoveFirstItemやMovePreviousItemボタンのEnabledが
その後のイベントにて勝手にまたTrueに戻ってしまい、クリックが可能になってしまいます。
(AddNewItemボタンはFalseのままでした。これは想定通りでOKです)

では、そもそも顧客IDが空白になっているからダメなわけで、
空白の時には、クリックイベント内で顧客IDのテキストボックスを確認し、
キャンセル処理を行うことができないかと思いましたが、
AddNewItem、MoveFirstItemやMovePreviousItemのクリックイベントには
e.cancelがありませんでした。


どういう方法でどうすればAddNewItemの二重のクリックを禁止できるのか。
思いつく方法があれば教えてください。
よろしくお願いします。
引用返信 編集キー/
■70224 / inTopicNo.2)  Re[1]: AddNewItemの二重クリック禁止について
□投稿者/ Azulean (276回)-(2014/03/03(Mon) 22:14:47)
No70221 (おださと さん) に返信
> キャンセル処理を行うことができないかと思いましたが、
> AddNewItem、MoveFirstItemやMovePreviousItemのクリックイベントには
> e.cancelがありませんでした。

単に今実行中のメソッド(この場合はイベントハンドラ)を抜けたいのであれば、Return ステートメントを使えばよいでしょう。
http://www.atmarkit.co.jp/fdotnet/vb6tonet/vb6tonet11/vb6tonet11_02.html

e.Cancel があるのは、そのイベントハンドラよりも後に、自分で制御できないコードが実行される可能性があるイベントの場合です。
たとえば、フォームの FormClosing は e.Cancel で設定しないとフォームが閉じられてしまうこと自体は防げないといったようにです。


> エラーを回避するために、AddNewItemのクリックイベントで
> MoveFirstItemやMovePreviousItemボタンの
> EnabledをFalseにして、クリックできないように試みましたが、
> MoveFirstItemやMovePreviousItemボタンのEnabledが
> その後のイベントにて勝手にまたTrueに戻ってしまい、クリックが可能になってしまいます。
> (AddNewItemボタンはFalseのままでした。これは想定通りでOKです)

これはそういう風に作っているからでは?
「勝手になってしまう」ではないと思うのですが、違うのでしょうか?
引用返信 編集キー/
■70227 / inTopicNo.3)  Re[2]: AddNewItemの二重クリック禁止について
□投稿者/ ???????? (1回)-(2014/03/03(Mon) 22:31:54)
Azuleanさん、早速返信ありがとうございます。

Return文では、AddNewItemのクリックイベントで記述しているプログラムを抜けるだけで、
BindNavigatorのAddNewItem自体の処理が止まるわけではないようなので、
同じNullのエラーが発生してしまいます。

ご指摘いただいた方法では解決できないようです。





>>エラーを回避するために、AddNewItemのクリックイベントで
>>MoveFirstItemやMovePreviousItemボタンの
>>EnabledをFalseにして、クリックできないように試みましたが、
>>MoveFirstItemやMovePreviousItemボタンのEnabledが
>>その後のイベントにて勝手にまたTrueに戻ってしまい、クリックが可能になってしまいます。
>>(AddNewItemボタンはFalseのままでした。これは想定通りでOKです)
>
> これはそういう風に作っているからでは?
> 「勝手になってしまう」ではないと思うのですが、違うのでしょうか?

ああ、これは確かにおっしゃる通りかもしれません。
他の良い方法が思いつけば、そのようにするのですが、
足りない頭で考えた方法を記述しただけなので、申し訳ないです。
引用返信 編集キー/
■70231 / inTopicNo.4)  Re[3]: AddNewItemの二重クリック禁止について
□投稿者/ Azulean (278回)-(2014/03/04(Tue) 06:45:26)
すみません。前回の回答ではぼけていますね。

おそらくは Validaiting の仕組みを考えるところだと予想しています。
実際に組んだわけではないので、コツとかは書けなくて申し訳ありません。。。

http://social.msdn.microsoft.com/Forums/vstudio/en-US/3cdf118f-5d36-4ed9-9e1a-f705c7fdecdf/vb-bindingnavigator-validating-before-move-next?forum=netfxbcl
引用返信 編集キー/
■70232 / inTopicNo.5)  Re[1]: AddNewItemの二重クリック禁止について
□投稿者/ しま (67回)-(2014/03/04(Tue) 09:20:22)
No70221 (おださと さん) に返信
> vb2010 10.0.40219.1 SP1Rel
> Windows8
>
> 初心者で申し訳ないです。
> 分かりにくい表現があったらお詫びします。
>
> 現在、顧客管理のDBを作成しています。
> 顧客を登録する際、以下の手順にて行っています。
> @プログラムを起動
> A新規データを追加
> Bデータ入力
> Cデータの登録を実施する ←この時に顧客のIDをシーケンスから取得し、払い出されたIDを割り当てる
>
> 一見、何の問題もなかったのですが、
> AでAddNewItemボタンを押したのちに、何も入力を行わずに
> BindNavigatorのMoveFirstItemやMovePreviousItem、AddNewItemなどを押すと
> 必須項目となっている顧客IDがnullだということで、
> エラーが発生してしまいます。
>
> では、そもそも顧客IDが空白になっているからダメなわけで、
> 空白の時には、クリックイベント内で顧客IDのテキストボックスを確認し、
> キャンセル処理を行うことができないかと思いましたが、

> AddNewItem、MoveFirstItemやMovePreviousItemのクリックイベントには
> e.cancelがありませんでした。
とあるので、DataSet をお使いのようです。この DataSet の列に"顧客ID" がユニーク(他の列と必ず違う値)で not null という
ことになっている(恐らくDBの表では主キーかインデックスかになっている)のでしょうが、プログラム(メモリー)上で
新規に行を生成する場合、規定値が入ります。この規定値が null になっているからおこられているわけでしょう。
なので、新規行での規定値が適切に設定できれば null にならないのでクリックイベントに頼らなくて済むはずです。
顧客ID のプロパティーをよーく調べてみてください。値が自動増減する列のための設定欄が見つかるでしょう
ユニーク(重複を許さない)な場合、メモリー上でDBが割付ける値と重複しても不正な値になってしますので、
初期値を -1 にして、増減値は -1 にするのがいいでしょう。

AutoIncrement Ture
AutoIncrementSeed -1
AutoIncrementStep -1

普通ならこれで解決しそうに思います。
データーベースを使っているのなら、何を使っているのか位は書いてください。


引用返信 編集キー/
■70236 / inTopicNo.6)  Re[1]: AddNewItemの二重クリック禁止について
□投稿者/ WebSurfer (196回)-(2014/03/04(Tue) 10:04:43)
No70221 (おださと さん) に返信

ご自分の環境(OS, .NET のバージョンなど)、作っているアプリが何か、DB が何か
ぐらいの情報は最初に書きませんか?

どんなアプリを作っているのですか? こんな感じですか?

10 行でズバリ !! 非接続型のデータ アクセス (ADO.NET) (VB)
http://code.msdn.microsoft.com/10-ADONET-VB-1c64942f/

上記は 2 つのテーブルを扱って、階層更新も可能にした例ですが、テーブルが 1 つ
の場合もほぼ同等な手順で、ウィザードベースで(一行もコードは書かずに)、以下
のページの図にある構成の Windows Forms アプリを作れるはずです。

Windows フォーム アプリケーションでのデータへの接続
http://msdn.microsoft.com/ja-jp/library/wxt2cwcc(v=vs.100).aspx

上記とは違う場合は、どのよう作っているのか書いてください。

DB のテーブルで NULL 不許可の列が空白(Windows Forms 画面で見て)のまま移動し
ようとするからエラーになると思いますが、それに対する対策はアプリの作り方によ
って当然異なります。

それから、表示されたエラーメッセージを書いてください。それは重要な情報です。

> Cデータの登録を実施する ←この時に顧客のIDをシーケンスから取得し、払い出
> されたIDを割り当てる

どういう意味でしょう? DB 側で自動採番される設定になっている(SQL Server な
ら Identity、Access ならオートナンバー)列を、INSERT 操作後に取得して、DataSet
に書き戻したいということですか?

それなら、DB が SQL Server なら、一番上に紹介した手順で自動的にそのためのコード
が生成されているはずです。

Access は DB エンジンの制約のためそのようなコードは自動生成されず、以下のページ
に書いてあるようなコードを自力で書いて追加する必要があります。

Access の更新
http://surferonwww.info/BlogEngine/post/2010/09/04/Updating-Access.aspx

引用返信 編集キー/
■70257 / inTopicNo.7)  Re[2]: AddNewItemの二重クリック禁止について
□投稿者/ おださと (3回)-(2014/03/04(Tue) 18:40:04)
みなさん、私の拙い文章にお付き合いいただいて感謝です。
いろいろ書いていただきました内容を読んで、いろいろ試してみます。

解決、未解決含めて、後程ご報告させていただきます。

いろいろやってみるお時間を下さい。
引用返信 編集キー/
■70299 / inTopicNo.8)  Re[3]: AddNewItemの二重クリック禁止について
□投稿者/ odasato (1回)-(2014/03/09(Sun) 16:18:46)
No70257 (おださと さん) に返信
> みなさん、私の拙い文章にお付き合いいただいて感謝です。
> いろいろ書いていただきました内容を読んで、いろいろ試してみます。
>
> 解決、未解決含めて、後程ご報告させていただきます。
>
> いろいろやってみるお時間を下さい。
引用返信 編集キー/
■70300 / inTopicNo.9)  Re[2]: AddNewItemの二重クリック禁止について
□投稿者/ odasato (2回)-(2014/03/09(Sun) 16:38:36)
時間が経って申し訳ありませんでした。



> ご自分の環境(OS, .NET のバージョンなど)、作っているアプリが何か、DB が何か
> ぐらいの情報は最初に書きませんか?

DBはSQLServerを使用して作成していました。



> どんなアプリを作っているのですか? こんな感じですか?
>
> 10 行でズバリ !! 非接続型のデータ アクセス (ADO.NET) (VB)
> http://code.msdn.microsoft.com/10-ADONET-VB-1c64942f/

アプリはスタンドアローン形式で、まさしくこのようなタイプのものです。



>>Cデータの登録を実施する ←この時に顧客のIDをシーケンスから取得し、払い出
>>されたIDを割り当てる
>
> どういう意味でしょう? DB 側で自動採番される設定になっている(SQL Server な
> ら Identity、Access ならオートナンバー)列を、INSERT 操作後に取得して、DataSet
> に書き戻したいということですか?

採番は自動的にする形ではなく、
デバッグやテストするときのやりやすさなどを考慮し、
現在のIDを見える形で操作できるよう、
シーケンス用のテーブルをわざわざ作成しました。



で、結局ですが、
フォームに自動的に作成されるBindingNavigaterの
MoveFirstItemやMovePreviousItemボタンのEnableプロパティは
こちらの思うように操作することが難しいため、
ソースは自分で組むようにしました。
そうすれば、こちらの思う通りに操作を禁止/許可できるようになりました。


Azuleanさんにご指摘いただいたアドバイスが解決の突破口になった形でした。
ありがとうございました。
また、WebSurfer、しまさん。ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -