- - PR -
動的コントロールに検証コントロールの割り当て方法について
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-02-02 18:34
初めて投稿させて頂きます。
早速ですが、聞きたい事があります。 WebコントロールのTable内の各セルに 動的に作成したコントロール(テキストやコンボボックス)を 検証コントロール(カスタム)で割り当ててチェックをしたいのですが、 可能なのでしょうか? [HOWTO] Visual C# .NET を使用して ASP.NET で動的にコントロールを作成する方法 http://support.microsoft.com/kb/317794/ja 参考にさせて頂きました。 実際にできるのかが、解りません。 (*ロジックにID(オブジェクト名)を書いても実体が無い為 起動時にエラーになります。) またもし実現できるなら、 どのような手法で行えばよろしいのでしょうか? <開発環境> OS :WindowsXP PRO 言語:C#.NET2005(ASP.NET) DB : SQLServer2000 未熟者ですが、何卒ご教授のほど、 よろしくお願い致します。 | ||||||||||||
|
投稿日時: 2007-02-02 22:47
HTML のテーブルコントロールにこだわる必要がないなら、GridView を使うのが良いかと思います。
それはそれとして。 > 可能なのでしょうか? 可能ですよ。 > (*ロジックにID(オブジェクト名)を書いても実体が無い為 > 起動時にエラーになります。) 意味がわかりません。実体は、動的に作っているんでしょ? _________________ | ||||||||||||
|
投稿日時: 2007-02-03 15:08
ご返信、大変ありがとうございます。
>HTML のテーブルコントロールにこだわる必要がないなら、 >GridView を使うのが良いかと思います。 GridViewに関しては、現状、採用候補には挙がっています。 >可能ですよ。 可能なのですか。 >意味がわかりません。実体は、動的に作っているんでしょ? はい、実体は動的に作成してます。 動的に作成したコントロールの値取得方法が解らなかったので、 ベタ書きでコントロール名を書いたらば、 エラーが出たという事です。 当たり前の事、また言葉足らずで申し訳ございません。 調査を進めてみます。 | ||||||||||||
|
投稿日時: 2007-02-04 19:26
わからないです。「コントロール名を書いたら」とは、どこに、どのように、書いたのでしょう?
もしかして、上のメソッドで外部から供給している、「コントロールID」のこと?これは、外部から供給するんですよ。 あと、「エラーが出た」というのは、どの段階(コンパイル時、実行時)に、どのようなメッセージのエラーが出たのでしょうか。これは、問題解決のための、一番重要な情報です。これを明らかにしていただけないと、答えは出てきませんよ。 _________________ はなおか じった@わんくま同盟 Microsoft MVP for Visual Developer ASP/ASP.NET 2006/10-2007/9 [ メッセージ編集済み 編集者: Jitta 編集日時 2007-02-05 07:35 ] | ||||||||||||
|
投稿日時: 2007-02-05 09:58
>わからないです。「コントロール名を書いたら」とは、どこに、どのように、書いたのでしょう?
書いた場所:検証コントロール内 どのように:動的なコントロール(「txtName.Text」)を直接書いてしまいました。 下記になります。 コード ----------------------------------------------------------------------- //検証コントロール protected void cuvName_ServerValidate(object source, ServerValidateEventArgs args) { if (txtName.Text == null) { args.IsValid = false; } else { args.IsValid = true; } } //登録ボタン押下 protected void btnInsert_Click(object sender, EventArgs e) { //入力チェックイベントを走らせる Page.Validate(); //入力チェックがNGなら処理終了 if (Page.IsValid == false) return; } ------------------------------------------------------------------------------ そのため、エラー内容に関しては、下記になりました。 「The name 'txtName' does not exist in the current context」 既に画面に作成したカスタム検証コントロールに 動的なWebコントロールを割り当てたいのですが、 どのように外部から供給するのかを調べていました。 protected void cuvName_ServerValidate(object source, ServerValidateEventArgs args) 「source」、「args」のどちらのプロパティやメソッドを見たのですが、 供給できるようなアイテムが見当たりませんので、 直接書いたという経緯です。 ですので、最初に書かせてもらいました 「検証コントロール(カスタム)で割り当ててチェックをしたいのですが、 可能なのでしょうか?」になりました。 説明、言葉不足になりまして、幾度ものご返信、 誠に恐縮です。すみません。 | ||||||||||||
|
投稿日時: 2007-02-05 21:33
なるほど。。。いや、これは、想像の範囲外でした。
ところで、txtName ですが、これって、複数作りますよね?(データの行数分、作りますよね?)複数のコントロールに同じ ID を割り当ててはいけませんよ? さて、まず、ServerValidation イベントのリファレンス<microsoft.com>を見てみましょう。ここに使用例があります。関係するところだけ抜き出します。
この中で、テムさんのコードの txtName にあたる、Text1 は出てきていますか?ありませんね。つまり、ここにコントロールの ID を書く必要はありません。サンプルは、偶数奇数を判定しているものですから、その判定をしているところを探します。 「args.IsValid = ((i%2) == 0);」ですね。では、i は、どこから来るのでしょうか。 「int i = int.Parse(args.Value);」です。 ということは、args.Value に、検査するべき対象が入っているようです。確認してみましょう。
ところで、「「source」、「args」のどちらのプロパティやメソッドを見たのですが、供給できるようなアイテムが見当たりませんので、」ということですが、なにを、どの様に調べたのでしょう? (今の問題解決には直接関係ありませんが、今後の問題解決のためには非常に重要だと思います。ここに書く必要はありませんが、見直しておくことをお勧めします。) イベントは、そのイベントを処理するために必要な情報を、すべてハンドラ メソッドに引き渡しています。もし、source について、object クラスのインスタンスとしてしか見ていなければ、それは誤りです。これは、CustomValidator クラスのオブジェクトが、object クラスにキャストされて渡されてきます。このため、CustomValidator クラスにキャストし直せば、元のクラスが取れます。元のクラスが取れれば、ControlToValidate プロパティから、検査対象のコントロールの ID を知ることができます。 その他: null と、空文字列("" や string.Empty)は、違うものです。このコードでは、意図した検査は出来ません。 Page.Validate は、わざわざ呼び出す必要はありません。入力系のイベントは、ボタンのイベントよりも早く実行されます。CustomValidation.ServerValidation はすでに発生しているので、Page.IsValid には検査後の値が入っています。 _________________ | ||||||||||||
|
投稿日時: 2007-02-06 01:18
度々のご返信、誠にありがとうございます。
解りやすく、丁寧に書いてくださって、 理解しやすかったです。 明日、実際に取り組んでみます。 また、Q&Aとは関係ありませんが、 自分の不味い部分を注意してくださったり、 探究心や調べ方など、今後の作業の進め方を考えさせられました。 大変勉強になりました。 本当にありがとうござました。 |
1