2009-05-19 6 views
2

Ich habe eine DetailsView, die ich zurückschicke - und darin befindet sich ein UserControl. Ich habe einige Schwierigkeiten in den Postback-Daten gefunden.Suchen von Benutzersteuerelementen im TemplateField von DetailsView

Als Beispiel:

<asp:DetailsView ID="dvDetailsView" runat="Server" AutoGenerateRows="false"> 
<Fields> 
    <asp:TemplateField> 
    <ItemTemplate> 
     Some text here 
    </ItemTemplate> 
    <EditItemTemplate> 
     <uc:UserControl ID="ucUserControl" runat="server" /> 
    </EditItemTemplate> 
    <InsertItemTemplate> 
     <uc:UserControl ID="ucUserControl" runat="server" /> 
    </InsertItemTemplate> 
    </asp:TemplateField> 
</Fields> 
</asp:DetailsView> 

Als ich Postback, würde ich nehme an, ich so etwas tun würde:

MyUserControlType ucUserControl = dvDetailsView.FindControl("ucUserControl") as MyUserControlType; 

Aber das findet nichts. Tatsächlich kann ich dieses Baby nicht sogar finden, indem ich in QuickWatch herum laufe ...

Was muss ich tun, um dieses Ding zu finden ??

EDIT: Es stellt sich heraus, dass meine Benutzersteuer-ID geändert wurde - aber warum? Ich habe die gleiche ID sowohl auf der Einfüge- als auch der Bearbeitungsvorlage, aber das zu kommentieren machte keinen Unterschied.

Antwort

1

Wie sich herausstellte, wurde der Name des Benutzersteuerelements geändert - mein Benutzersteuerelement mit der Bezeichnung "ucUserControl" wurde in einen generischen Namen geändert - "ctl01".

Also, eine dvSituation.Rows[0].Cells[0].FindControl("ctl01") tun, fand die Kontrolle.

Um diese ID zu finden, habe ich mir nur das HTML-Element angesehen, das gerendert wird, und das Elternelement von der ID überprüft, z. 'ctl00_MainContent_dvDetailsView_ctl01_lblLabel', wobei lblLabel auf ucUserControl angezeigt wurde.

Die Spalte rows ist ein 0-basierter Index der Anzahl der Felder und der Zellenindex ist 1, wenn Sie ein headertemplate angegeben haben.

BEARBEITEN: OMG! Jemand (ich war wirklich nicht ich, ich schwöre) hatte die ID Eigenschaft auf der Kontrollklasse versteckt! Diese

public partial class UserControl : BaseControl 
{ 
    public int Id; 
} 

bedeutete, dass, wenn ASP.Net wurde die ID zu erzeugen, es konnte nicht, und nur eine generische Id (‚CTL01‘ in diesem Fall) an die Steuerung, anstatt den tatsächlichen Namen zugeordnet.

Wow.

2

NachDataBind die Steuerung ing, dann würden Sie verwenden:

dvDetailsView.Rows[0].Cells[0].FindControl("ucUserControl") 

Und stellen Sie sicher, dass Sie diese im Bearbeitungsmodus nur tun, als die Steuerung nur in EditItemTemplate existiert.

+0

Noch kann ich dieses Steuerelement nicht finden, obwohl ich ein anderes habe, das ich finden kann (es ist nur ein '' Steuerelement. – Khanzor

+0

Sind Sie sicher, dass Ihre Detailansicht im Bearbeitungsmodus ist und Sie nach DataBinding tun? Ich nur getestet und das hat funktioniert. Überprüfen Sie 'CurrentMode' Eigenschaft, um zu sehen, ob Sie wirklich im Bearbeitungsmodus sind. –

+0

Keine Zeile sollte vor der Datenbindung vorhanden sein. Ganz zu schweigen von untergeordneten Steuerelementen. –