- PR -

動的コントロールに検証コントロールの割り当て方法について

1
投稿者投稿内容
テム
会議室デビュー日: 2007/02/02
投稿数: 4
投稿日時: 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

未熟者ですが、何卒ご教授のほど、
よろしくお願い致します。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-02-02 22:47
 HTML のテーブルコントロールにこだわる必要がないなら、GridView を使うのが良いかと思います。


それはそれとして。

> 可能なのでしょうか?
可能ですよ。

> (*ロジックにID(オブジェクト名)を書いても実体が無い為
> 起動時にエラーになります。)
意味がわかりません。実体は、動的に作っているんでしょ?
_________________
テム
会議室デビュー日: 2007/02/02
投稿数: 4
投稿日時: 2007-02-03 15:08
ご返信、大変ありがとうございます。

>HTML のテーブルコントロールにこだわる必要がないなら、
>GridView を使うのが良いかと思います。
GridViewに関しては、現状、採用候補には挙がっています。

>可能ですよ。
可能なのですか。

>意味がわかりません。実体は、動的に作っているんでしょ?
はい、実体は動的に作成してます。

動的に作成したコントロールの値取得方法が解らなかったので、
ベタ書きでコントロール名を書いたらば、
エラーが出たという事です。
当たり前の事、また言葉足らずで申し訳ございません。

調査を進めてみます。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-02-04 19:26
引用:

テムさんの書き込み (2007-02-03 15:08) より:
>意味がわかりません。実体は、動的に作っているんでしょ?
はい、実体は動的に作成してます。

動的に作成したコントロールの値取得方法が解らなかったので、
ベタ書きでコントロール名を書いたらば、
エラーが出たという事です。
当たり前の事、また言葉足らずで申し訳ございません。

調査を進めてみます。


 わからないです。「コントロール名を書いたら」とは、どこに、どのように、書いたのでしょう?

コード:

private void コントロールを追加する処理(string コントロールID) {
TextBox tbx = new TextBox();
tbx.ID = コントロールID;
CustomValidator cv = new CustomValidator();
cv.ID = コントロールID + "Validator";
cv.ControlToValidate = cv.ID;//tbx.ID


もしかして、上のメソッドで外部から供給している、「コントロールID」のこと?これは、外部から供給するんですよ。

 あと、「エラーが出た」というのは、どの段階(コンパイル時、実行時)に、どのようなメッセージのエラーが出たのでしょうか。これは、問題解決のための、一番重要な情報です。これを明らかにしていただけないと、答えは出てきませんよ。

_________________
はなおか じった@わんくま同盟
Microsoft MVP for Visual Developer ASP/ASP.NET 2006/10-2007/9

[ メッセージ編集済み 編集者: Jitta 編集日時 2007-02-05 07:35 ]
テム
会議室デビュー日: 2007/02/02
投稿数: 4
投稿日時: 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」のどちらのプロパティやメソッドを見たのですが、
供給できるようなアイテムが見当たりませんので、
直接書いたという経緯です。


ですので、最初に書かせてもらいました
「検証コントロール(カスタム)で割り当ててチェックをしたいのですが、
可能なのでしょうか?」になりました。

説明、言葉不足になりまして、幾度ものご返信、
誠に恐縮です。すみません。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-02-05 21:33
 なるほど。。。いや、これは、想像の範囲外でした。
 ところで、txtName ですが、これって、複数作りますよね?(データの行数分、作りますよね?)複数のコントロールに同じ ID を割り当ててはいけませんよ?

 さて、まず、ServerValidation イベントのリファレンス<microsoft.com>を見てみましょう。ここに使用例があります。関係するところだけ抜き出します。
引用:
コード:
void ServerValidation(object source, ServerValidateEventArgs args)
{
    try
    {
        // Test whether the value entered into the text box is even.
        int i = int.Parse(args.Value);
        args.IsValid = ((i%2) == 0);
    }
    catch(Exception ex)
    {
        args.IsValid = false;
    }
}



この中で、テムさんのコードの txtName にあたる、Text1 は出てきていますか?ありませんね。つまり、ここにコントロールの ID を書く必要はありません。サンプルは、偶数奇数を判定しているものですから、その判定をしているところを探します。
「args.IsValid = ((i%2) == 0);」ですね。では、i は、どこから来るのでしょうか。
「int i = int.Parse(args.Value);」です。
ということは、args.Value に、検査するべき対象が入っているようです。確認してみましょう。
引用:

ServerValidateEventArgs.Value プロパティ<microsoft.com>より:
ServerValidate イベントのカスタム イベント ハンドラで検証する値を取得または設定します。




 ところで、「「source」、「args」のどちらのプロパティやメソッドを見たのですが、供給できるようなアイテムが見当たりませんので、」ということですが、なにを、どの様に調べたのでしょう?
(今の問題解決には直接関係ありませんが、今後の問題解決のためには非常に重要だと思います。ここに書く必要はありませんが、見直しておくことをお勧めします。)

 イベントは、そのイベントを処理するために必要な情報を、すべてハンドラ メソッドに引き渡しています。もし、source について、object クラスのインスタンスとしてしか見ていなければ、それは誤りです。これは、CustomValidator クラスのオブジェクトが、object クラスにキャストされて渡されてきます。このため、CustomValidator クラスにキャストし直せば、元のクラスが取れます。元のクラスが取れれば、ControlToValidate プロパティから、検査対象のコントロールの ID を知ることができます。


その他:
  null と、空文字列("" や string.Empty)は、違うものです。このコードでは、意図した検査は出来ません。
  Page.Validate は、わざわざ呼び出す必要はありません。入力系のイベントは、ボタンのイベントよりも早く実行されます。CustomValidation.ServerValidation はすでに発生しているので、Page.IsValid には検査後の値が入っています。
_________________
テム
会議室デビュー日: 2007/02/02
投稿数: 4
投稿日時: 2007-02-06 01:18
度々のご返信、誠にありがとうございます。
解りやすく、丁寧に書いてくださって、
理解しやすかったです。

明日、実際に取り組んでみます。


また、Q&Aとは関係ありませんが、
自分の不味い部分を注意してくださったり、
探究心や調べ方など、今後の作業の進め方を考えさせられました。

大変勉強になりました。
本当にありがとうござました。
1

スキルアップ/キャリアアップ(JOB@IT)