- PR -

ユーザーコントロール外のコントロールを検証するには

1
投稿者投稿内容
Sampo
会議室デビュー日: 2008/07/03
投稿数: 18
投稿日時: 2008-12-01 17:39
ASP.NET 2.0 でWeb開発をしています。

あるテキストボックスに複数の検証コントロールを関連づけるフォームがあり、同じパターンの検証が多いので検証コントロールだけまとめてユーザーコントロールにすることを試みました。

ユーザーコントロールにControlToValidateでも名付けたプロパティを設定して、ここに設定したテキストボックスを内蔵した検証コントロールがみんなで見に行く、ような状況です。

しかし、ユーザーコントロール内に置いた検証コントロールは、ユーザーコントロール外のテキストボックスを参照することができません。

検証対象のテキストボックスもユーザーコントロールに含めてしまう、というのは一つのてなのですが、これだと入力欄とエラー表示を離して置くことができません。

ユーザーコントロール外のコントロールを検証する方法はないでしょうか?
Sampo
会議室デビュー日: 2008/07/03
投稿数: 18
投稿日時: 2008-12-02 10:07
自己解決しました。
テキストボックスのふりをしてユーザーコントロールの外側の同名のコントロールに直通するという、カスタムコントロールを作りました。

コード:
/// <summary>
/// ユーザーコントロールの外側にある同名のコントロールへのアクセスを提供するコントロールです
/// </summary>
	public class TunnelTextBox : TextBox
	{
		public override string Text
		{
			get
			{
				ITextControl itc = Target;
				if (itc == null) return "";
				return itc.Text;
			}
			set { }
		}

		protected override void Render(HtmlTextWriter writer) { }

		public override string ClientID
		{
			get
			{
				ITextControl itc = Target;
				if (itc == null) return base.ClientID;
				return ((Control)itc).ClientID; 
			}
		}

		private ITextControl Target
		{
			get
			{
				if (Parent == null) return null;
				if (Parent.Parent == null) return null;
				if (Parent.Parent.Parent == null) return null;
				ITextControl itc = Parent.Parent.Parent.FindControl(ID) as ITextControl;
				if (itc == null) return null;
				return itc;
			}
		}
	}

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-12-03 12:00
その方法だと、Parent.Parent.Parent にあるものしか、検索できないですよね?

ユーザー コントロールに、Control 型のプロパティを付けると、もしかしたら属性が必要かもしれませんが、デザイン時に張り付いているコントロールを選択できるようになりませんか?そうすると、サーバー側では検証したいコントロールを直に参照できるようになりますから、楽になると思いますけど。
Sampo
会議室デビュー日: 2008/07/03
投稿数: 18
投稿日時: 2008-12-04 15:15
> ユーザー コントロールに、Control 型のプロパティを付けると、もしかしたら属性が必要かもしれませんが、デザイン時に張り付いているコントロールを選択できるようになりませんか?

んー、そうもいかないですねー。
CustomValidatorのControlToValidateプロパティもstring型ですし。、
1

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