FindControl() null zurück
Ich versuche zu erstellen, die Anwendung whad add-Kontrollen dynamicaly. Ich habe masterpage, meine asp:Content ist hier:
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<asp:ScriptManager ID="scriptManager1" runat="server">
</asp:ScriptManager>
<div style="margin: 10px">
<asp:UpdatePanel ID="updatePanel1" runat="server">
<ContentTemplate>
<asp:PlaceHolder runat="server" ID="myPlaceHolder" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnAdd" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
</div>
<asp:Button ID="btnAdd" runat="server" Text="Add" />
Nach Klick in btnAdd ich möchten fügen Sie zwei Textfelder. Ich versuche es so machst wie in http://jagdeepmankotia.wordpress.com/2010/01/30/dynamically-add-controls-in-asp-net-c/
Dies ist mein code:
static int myCount = 1;
private TextBox[] color;
private TextBox[] text;
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
color = new TextBox[myCount];
text = new TextBox[myCount];
for (int i = 0; i < myCount; i++)
{
TextBox tbColor = new TextBox();
tbColor.ID = "colorTextBox" + i.ToString();
myPlaceHolder.Controls.Add(tbColor);
color[i] = tbColor;
TextBox tbText = new TextBox();
tbText.ID = "textTextBox" + i.ToString();
myPlaceHolder.Controls.Add(tbText);
text[i] = tbText;
LiteralControl literalBreak = new LiteralControl("<br />");
myPlaceHolder.Controls.Add(literalBreak);
}
}
public Control GetPostBackControl(Page page)
{
Control control = null;
string ctrlname = page.Request.Params.Get("__EVENTTARGET");
if (ctrlname != null && ctrlname != string.Empty)
{
control = page.FindControl(ctrlname);
}
else
{
foreach (string ctl in page.Request.Form)
{
Control mycontrol = page.FindControl(ctl);
if (mycontrol is System.Web.UI.WebControls.Button)
{
control = mycontrol;
//This gives you ID of which button caused postback
break;
}
}
}
return control;
}
protected void Page_PreInit(object sender, EventArgs e)
{
Control myControl = GetPostBackControl(this.Page);
if (myControl != null)
if (myControl.ClientID.ToString() == "btnAdd")
myCount = myCount + 1;
}
protected void btnAdd_Click(object sender, EventArgs e)
{
//handled in PreInit
}
Wenn in der Funktion GetPostBackControl() in loap foreach Suche für meine btnAdd, zum Beispiel in der ersten iteration für die WDR - "ctl00$MainContent$scriptManager1", myControl ist null... In der nächsten Iterationen auch... Also meine Funktion immer null zurück. Was kann der Grund dafür sein?
InformationsquelleAutor cadi2108 | 2011-12-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
FindControl
durchsucht nur die direkt untergeordneten Elemente des Containers an. Da Sie ab und an die Seite Ebene, werden Sie brauchen, um recurse durch das KindUpdatePanel
Kontrolle zu bekommen, um IhrebtnAdd
Kontrolle.Haben Sie einen Blick hier für ein Beispiel, wie Sie tun, tun Sie dies.
Edit:
Ich bin mir nicht sicher, ob ich verstehe, warum Sie 'suchen' für die Taste in dieser Art und Weise, da es nur einen statischen button auf dem Bildschirm - Sie würde nicht verwenden müssen
FindControl
in diesem Fall.(oder im code
btnAdd.OnClick += new EventHandler(btnAdd_Click);
)Selbst wenn Sie hatte mehrere Schaltflächen im Formular dynamisch Hinzugefügt, Sie könnte Draht ALLE auf den gleichen Button-Klick-handler, in dem Fall
sender
würde dann enthalten die Button-Steuerelements, die geklickt wurde. In der Regel verwenden Sie FindControl zu kratzen, die Daten aus dem dynamisch hinzugefügten Eingabe-Steuerelemente (Textfeld, etc), anstatt zu sehen, welche Steuerung verursacht den Postback (als "Absender" in einen entsprechenden Ereignis-handler wäre einfacher)Edit 2:
Sie können die Schaltflächen dynamisch, genau wie deine anderen Bedienelemente
Wenn Sie möchten, dass alle Steuerelemente, die Sie Hinzugefügt haben, bereits zu 'bleiben' zwischen postbacks dann aktivieren viewstate auf die Seite und auf den Steuerelementen, und dann stellen Sie sicher, dass Sie nur fügen Sie die Steuerelemente einmal ohne postback, in OnInit:
Können Sie den Zustand der "mycount" in ein verstecktes Feld (in der gleichen updatepanel, und mit viewstate aktiviert) - Sie brauchen werden, um zu analysieren, es in eine int-jedes mal. Oder Sie können SessionState es zu verfolgen.
InformationsquelleAutor StuartLC