2009-07-14 4 views
2

Ich habe hier ein seltsames Problem.Warum kann ich eine TextBox nicht nach ID referenzieren, wenn sie sich in einem CreateUserWizard-Steuerelement befindet?

Innerhalb eines Asp.net CreateUserWizard, ich habe einige Elemente, aber ich kann nicht scheinen, um sie von meinem Code-behind zugreifen.

Hier ist ein Code-Schnipsel:

Markup:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="CreateUserWizard.ascx.cs" Inherits="Web.UserControls.CreateUserWizard" %> 
<asp:CreateUserWizard ID="CreateUserWizard1" runat="server" OnCreatingUser="CreatingUser"> 
<WizardSteps> 
    <asp:CreateUserWizardStep ID="CreateUserWizardStep1" runat="server"> 
     <ContentTemplate> 
      <table border="0"> 
       <tr> 
        <td> 
         <span class="requiredField"/> 
         <asp:Label ID="NameLabel" runat="server" AssociatedControlID="NameRequiredFieldValidator">Navn:</asp:Label>      
         <asp:CheckBox ID="ShareInfoCheckBox" runat="server" Checked="True" Text="Share my information with partner sites." /> 
        </td> 
        <td> 
         <asp:TextBox ID="Name" runat="server"></asp:TextBox> 
         <asp:RequiredFieldValidator ID="NameRequiredFieldValidator" runat="server" 
          ControlToValidate="Name" ErrorMessage="Du skal indtaste dit navn" 
          ToolTip="Du skal indtaste dit navn" ValidationGroup="CreateUserWizard1">*</asp:RequiredFieldValidator> 
        </td> 
       </tr> 
      </ContentTemplate> 
    </asp:CreateUserWizardStep> 
</WizardSteps> 
</asp:CreateUserWizard> 

.. Und hier ist der Code-Behind:

public partial class CreateUserWizard : System.Web.UI.UserControl 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    protected void CreatingUser(object sender, EventArgs e) 
    { 
     Name. //no intellisense and compiler error when I try to access Name 
    } 
} 

Sollte das nicht? Es ist in einem UserControl, wenn dies einen Unterschied macht.

Vielen Dank im Voraus

Antwort

10
TextBox nameTextBox = 
    CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("Name") as TextBox; 

if (nameTextBox != null) { 
    /* Do your stuff */ 
} 

Weitere Beispiele here.

+1

Ich bevorzuge die "as TextBox" Notation es ist weniger wahrscheinlich, eine Ausnahme zu werfen –

0

Gibt es etwas anderes irgendwo ‚Namen‘ genannt, ein Mitglied Variable oder eine Eigenschaft? Versuchen Sie, dem Steuerelement einen weniger allgemeinen Namen wie "Navn" oder etwas weniger wahrscheinlich Konflikt zu geben.

3

Try this:

((TextBox)CreateUserWizardStep1.FindControl("Name")).Text = "Hello"; 

Der Grund dafür ist, dass Ihr Textfeld in ein anderes Objekt ist, so dass Sie kippe Zugang direkt.

0

Sean Bright hat die richtige Idee, wie man dazu kommt.

Soweit "Warum": Dies ist ein Vorlagen-Steuerelement, also das Element, auf das Sie zugreifen möchten, befindet sich in einem anderen Benennungscontainer. Sie können die Control.FindControl-Funktion verwenden, um Zugriff auf die Steuerelemente zu erhalten, die Sie benötigen.

This is a good article that explains templated controls.

Oder im Fall der anderen vordefinierten Feldern für diesen Assistenten Steuerung können Sie CreateUserWizard1.UserName/Email/Passwort usw. verwenden diese Werte zugreifen.