2011-01-17 5 views
1

Zugabe habe ich im Grunde so etwas wie:Dynamisch einen Button auf einen Platzhalter in einem Datagrid

<asp:datagrid id="DGrid" runat="server" AutoGenerateColumns="false"> 
    <asp:TemplateColumn HeaderText="Stuff"> 
    <ItemTemplate> 
     <asp:PlaceHolder id="PH" runat="server" /> 
    </ItemTemplate> 
    </asp:TemplateColumn> 
</asp:datagrid> 

Ich muß in Abhängigkeit von den Werten der Daten einen Button auf den Platzhalter hinzufügen Ich bin verbindlich. Im Moment füge ich die Schaltfläche hinzu, nachdem die Daten in Page_Load gebunden wurden. Das Problem ist, dass die Datenbindungsmethoden nicht in Postbacks aufgerufen werden, so dass die Schaltfläche verschwindet, wenn ich darauf klicke.

Irgendwelche Vorschläge, wie man das macht? Problem ist, dass ich einige Attribute des Rasterelements kennen muss, um den Button zu erstellen, also kann ich es nicht erstellen, bevor die Daten gebunden wurden.

Antwort

1

Wie wäre es mit dem Abonnement ItemCreated event?

Markup:

<asp:datagrid id="DGrid" runat="server" OnItemCreated="DGrid_ItemCreated" AutoGenerateColumns="false">...</asp:DataGrid> 

-Code-behind:

protected void DGrid_ItemCreated(object sender, DataGridItemEventArgs e) 
{ 
    var ph e.Item.FindControl("PH") as PlaceHolder; 
    // ... 
} 

UPDATE

In Bezug auf die Situation, wenn die e.Item.DataItemnull auf einem Postbacks ist: nur die zuverlässigen Informationen (zB Databound Steuereigenschaften) wird über Postbacks beibehalten (wenn ViewState aktiviert ist), t Die gesamten Datenbestände überleben sie nicht. Daher müssen Sie den Staat selbst verwalten. Sie können nur die erforderlichen Daten in einem ViewState persistieren (und nicht die gesamten Datenelemente, da sie explodieren können).

+0

Ich muss immer noch irgendwie auf die gebundenen Daten im Postback zugreifen - e.Item.DataItem scheint bis dahin NULL zu sein. – hrnt

+0

Bitte sehen Sie mein Update. – volpav

+0

Normalerweise ist e.Item.DataItem NULL, nicht wegen eines ViewState-Problems, sondern weil Sie die Header- oder Fußzeilen rendern. Versuchen Sie es mit einem if (e.Item.DataItem ist nichts) {return;} und sehen Sie, was passiert. – Peter

Verwandte Themen