2011-09-12 10 views
1

コントロールIDを必要とするプロパティのために他のテンプレートでコントロールを見つけるために、すべてが存在するコントロールのAssociatedControlIDまたはControlToValidateのようなもののためのIDを設定する以外、作品他のテンプレートではtemplate宣言ユーザーコントロールは、どのように私は2つのテンプレートとテンプレートユーザーコントロールを持っている

私は、彼らがこれだけコントロールIDを持つAssociatedControlID does't作業を設定する以下のコードでは、お互いを見つけることからそれらを防ぐ二つの異なる命名コンテナに存在することを理解しています。これを宣言的に設定するためのトリックがありますか、またはFindControlを使用してコードの背後に設定する必要がありますか?

<uc1:Field ID="paramName" runat="server"> 
    <LabelTemplate > 
     <asp:Label ID="lblName" AssociatedControlID="txtValue" runat="server" >Label Text:</asp:Label> 
    </LabelTemplate> 
    <InputTemplate> 
     <asp:TextBox ID="txtValue" runat="server" MaxLength="30"></asp:TextBox> 
    </InputTemplate> 
</uc1:Field> 

EDIT 1:私もそれは背後にあるコードでそれを設定し動作させることはできません

は、ここに私のコントロールレイアウトです。 AssociatedControlIDを.ID、.ClientID、.UniqueIDに設定しようとしましたが、私はいつも忘れています。私はFindControlからコントロールを見つけることも試みました。私はコントロールの親からは見つけることができますが、親の親ではありません。それは非常に奇妙です。

EDIT 2:私は部分的な解決策が出ています。これは、AssociatedControlIDでは機能しませんが、実際に私にとってもっと重要なControlToValidateで動作します。回避策は次のとおりです。コンテナクラスでは、FindControlをオーバーライドして、2つのレベルをポイントする必要があります。私はParent.Parent.FindControlを試してみましたが、それはまだ私は完全に理由を理解していない、コントロールを見つけることができませんでしたので、私はコントロールコレクション内のすべてのコントロールを列挙する拡張メソッドを持っているとして、あなたはその後、自分自身にFindControlを行う必要があります。また、なぜラベルがAssociatedControlIDで動作しないのかわかりません。たぶん内部的にFindControlを別の方法で呼び出します。

私は、単純な何かが欠けていますように、私はまだ感じます。ここで

/// <summary> 
/// This is a hack to get the validators in the label template to see the controls in the input template 
/// just don't name any controls in the two templates the same thing 
/// </summary> 
/// <param name="id"></param> 
/// <returns></returns> 
public override Control FindControl(string id) 
{ 
    if (Parent == null && Parent.Parent == null) 
    { 
     return base.FindControl(id); 
    } 

    return Parent.Parent.Controls.All().Where(x => x.ID == id).FirstOrDefault(); 
} 

は、すべての拡張メソッドは次のとおりです。この厄介な問題を持つ任意の助け

public static IEnumerable<Control> All(this ControlCollection controls) 
{ 
    foreach (Control control in controls) 
    { 
     foreach (Control grandChild in control.Controls.All()) 
      yield return grandChild; 

     yield return control; 
    } 
} 

感謝。

ControlToValidateのためにクリス

答えて

0

、あなたはInputTemplateコントロールのクラス定義にValidationPropertyAttributeを使用することができます。 例えば:あなたのコードビハインドで今

//"Text" is the name of the Property which returns the value to validate 
[ValidationProperty("Text")] 
public class InputTemplate 
{ 
    ... 
    public string Text { set { txtValue.Text = value; } get { return txtValue.Text } } 
} 

、あなたがユーザーコントロールのIDにあなたのRequiredFieldValidatorのControlToValidateプロパティを設定することができます。単にあなたのコードビハインド更新します。

RequiredFieldValidator1.ControlToValidate = InputTemplate1.ID;はラベルのためのAssociatedControlIDについては、私はまだこれを考え出したていません。

運、

ショーン

のベスト

関連する問題