Wann wird hinzugefügt, um eine Kontrolle in einer programmatisch hat Template seine ID-Eigenschaft?

StackOverflow https://stackoverflow.com/questions/703987

Frage

Ich habe eine Template, die auf eine benutzerdefinierte Gridview dynamisch hinzugefügt wird.

void ITemplate.InstantiateIn(System.Web.UI.Control container)
    {
        switch (_templateType)
        {
            case ListItemType.Header:
                if (this.ParentGridView.ShowDeleteHeaderImage)
                {
                    Image hImg = new Image();
                    hImg.ImageUrl = this.ParentGridView.DeleteHeaderImageUrl;
                    hImg.AlternateText = "Mark for Deletion";
                    container.Controls.Add(hImg);
                }
                else
                {
                    Label l = new Label();
                    l.Text = "Del";
                    container.Controls.Add(l);
                }
                break;
            case ListItemType.Item:
                container.Controls.Add(new CheckBox());
                break;
            case ListItemType.EditItem:
                break;
            case ListItemType.Footer:
                QLImageButton deleteButton = new QLImageButton();
                deleteButton.Settings.ImageId = "cmdQLGVDelete";
                deleteButton.Settings.ImageUrl = this.ParentGridView.DeleteImageUrl;
                deleteButton.CommandName = "Delete";
                container.Controls.Add(deleteButton);
                break;
        }
    }

Als Reaktion auf einen Raster-Befehl (insert / update / delete), ein Verfahren GetRowControls genannt wird, die iteriert durch die Spalten in der jeweiligen GridRow genannt, und fügt jeden ihrer Kontrollen auf ein Dictionary.

Dictionary<string, WebControl> GetRowControls(GridViewRow row)
...

rowControls.Add(ctrl.ID, (WebControl)ctrl);

...

So das funktioniert gut für beide Vorlagenfeld und gebundenen Steuerelemente deklarativ hinzugefügt, sowie Dynamic nicht Vorlagenfelder programmatisch hinzugefügt.

Allerdings, wenn die Steuerung eine Templatesteuerung dynamisch hinzugefügt ctrl.ID ist immer null und deshalb wirft die Aussage über eine Ausnahme.

Ich habe in diese mit Reflektor sah, weil ich, dass gefunden, wenn ich die Variable in dem sofortigen Fenster in VS 2005 untersucht das heißt? Ctrl, ctrl.ID Wert Liste würde. Ich habe da festgestellt, dass dies liegt daran, dass bei der Auflistung? Ctrl in dem sofortigen Fenster wird die proprty ClientID genannt und ClientID nennt EnsureID (), die wiederum ID setzt.

public virtual string ClientID
{
    get
    {
        this.EnsureID();
        string uniqueID = this.UniqueID;
        if ((uniqueID != null) && (uniqueID.IndexOf(this.IdSeparator) >= 0))
        {
            return uniqueID.Replace(this.IdSeparator, '_');
        }
        return uniqueID;
    }
}

So ich das ClientID gehe davon aus, UniqueId und ID sind alle null - obwohl, wie oben gerade den ersten beiden Lese werden alle Trigger gesetzt werden. Beachten Sie auch, dass NamingContainer nicht null ist. Es wird festgelegt.

So ist die Arbeit um für diese ist ganz einfach das heißt für ctrl.ID überprüfen == null und wenn ja einfach ctrl.ClientID lesen. Und das ist, was ich getan habe, weil die Zeit weise habe ich wirklich habe auf einen zappeln zu bekommen. Aber ich bin immer noch Interesse an der Antwort, wenn jemand es von der Oberseite ihrer Köpfe kennt.

Warum ist der ID-Wert eines Kind Kontrolle eines dynamisch hinzugefügt Template, zu einem anderen Zeitpunkt von den anderen Kontrolle eingestellt?

War es hilfreich?

Lösung

Es ist nicht, dass sie sich anders verhalten, aber das fast immer, wenn Sie ein Steuerelement hinzufügen deklarativ legen Sie die ID sofort. Versuchen Sie, ein Etikett ohne ID auf eine Seite und durchsuchen Sie die Steuererhebung und überprüfen Sie die ID, wird es null sein (stellen Sie sicher nicht seine clientID zu zeigen, da es die ID gefüllt bekommen würde):

<asp:Label runat="server">something</asp:Label>

Beachten Sie auch, dass, wenn Sie es so, führen Sie eine Spanne ohne ID.

Andere Tipps

Freddy korrekt ist.

Sie sind verantwortlich für die IDs innerhalb des InstantiateIn Verfahren einstellen. Und es macht Sinn, dass clientId sie automatisch erzeugt, wenn nicht anders angegeben.

Die deklarativen Kontrollen erhalten ihre IDs von einer Seite Builder bei der Erstellung einer Seite zugewiesen. Wenn Sie in der „Ordner Temporary ASP.NET Files“ in einem der temporären Dateien erzeugt CS- sehen waren, würden Sie so etwas wie dieses (pragmas gestrippt) finden:

//creating a template field, where CopiledBindableTemplateBuilder is the ITemplate
//and its InstantiateIn = @__BuildControl__control9
@__ctrl.ItemTemplate = new System.Web.UI.CompiledBindableTemplateBuilder(
    new System.Web.UI.BuildTemplateMethod(this.@__BuildControl__control9),
    new System.Web.UI.ExtractTemplateValuesMethod(this.@__ExtractValues__control9));

//and @__BuildControl__control9 calling @__BuildControlButton1
private global::System.Web.UI.WebControls.Button @__BuildControlButton1()
{
    global::System.Web.UI.WebControls.Button @__ctrl;

    @__ctrl = new global::System.Web.UI.WebControls.Button();
    this.Button1 = @__ctrl;
    @__ctrl.ApplyStyleSheetSkin(this);
    @__ctrl.ID = "Button1"; //<-- here it gets an ID
    @__ctrl.Text = "Button";
    return @__ctrl;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top