2009-03-11 14 views
2

Ich habe ein Datagrid in ASP.NET 2.0 mit der folgenden Spalte in ihm:Datagrid Control Disabled

<ASP:TEMPLATECOLUMN> 
    <ItemStyle HorizontalAlign="Right"></ItemStyle>   
    <ItemTemplate> 
     <asp:HyperLink id="HyperLink1" runat="server" 
      CssClass="DataGridCommand" Target="_blank" 
      NavigateUrl='<%# GetPreviewURL(DataBinder.Eval(Container, "DataItem.NodeID")) %>'> 
     Preview Graphic 
     </asp:HyperLink> 
    </ItemTemplate> 
</ASP:TEMPLATECOLUMN> 

So ist die Grundidee ist es, einen Link in jeder Zeile des Datagrid zu haben, die eine Pop- tritt zurück Bildvorschau (bezieht sich auf eine datengebundene Spalte für die NodeID). Das funktioniert gut.

Ich versuche, die Verknüpfungen für die Zeilen zu deaktivieren, für die kein zugeordnetes Bild vorhanden ist. Um dies zu tun Ich habe dies in der Code-behind, unter Page_Load:

foreach (DataGridItem dgi in this.dgNode.Items) 
{ 
    HyperLink myLink1 = (HyperLink)dgi.Cells[0].FindControl("HyperLink1"); 

    //myLink1.Visible = false; 
    //if (condition for hiding links goes here...) 
    myLink1.Enabled = false; 
    this.dgNode.DataBind(); 
} 

Wie Sie sehen können, habe ich versucht, die visible-Eigenschaft auf false gesetzt, aber das hat nicht funktioniert. Ich habe versucht, enable auf false zu setzen, es hat auch nicht funktioniert. Und dann habe ich versucht, das DataGrid erneut zu binden - funktioniert nicht. Die Links funktionieren weiterhin normal.

Weiß jemand, warum das nicht funktioniert, was kann getan werden, damit es funktioniert, und wenn es grundlegend fehlerhaft ist, eine alternative Lösung? Ich versuche, den Link für bestimmte Zeilen entweder auszublenden oder ihn auszublenden, damit er nicht angeklickt werden kann.

Antwort

2

Sie können damit umgehen auf dem OnRowDataBound Ereignis, etwa so:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    HyperLink hl = (HyperLink)e.Row.FindControl("HyperLink1"); 
    hl.Visible = false; 
} 
0

Ich bin mir nicht sicher, aber ich denke asp.net rushing, weil Sie mehr als eine Instanz des Objekts Hyperlink1 haben. Ist nicht die ID proprety wird als eindeutiger Bezeichner verwendet, wenn es mehr als eine Instanz gibt, lehnt sie es möglicherweise ab, sie zu manipulieren.

1

Anstatt die Elemente beim Laden der Seite zu durchlaufen, sollten Sie einen Ereignishandler hinzufügen, der das OnItemDataBound-Ereignis behandelt. Sie können dann den Hyperlink dort finden und deaktivieren, wenn jedes Element gebunden ist.

Ich glaube, dass die aktuelle Lösung nicht funktioniert, da es die DataBind() - Methode nach dem Festlegen der Verknüpfung auf unsichtbar oder deaktiviert aufruft. Dadurch wird das DataGrid neu erstellt und löscht die Arbeit, die Sie gerade ausgeführt haben. Ganz zu schweigen davon, dass Sie Ihr DataGrid für jedes Element neu binden, was ein Performance-Hit ist.

1

Ich würde wetten, dass, da Sie die Hyperlinks deaktivieren und dann das Datagrid nach der Tatsache binden, dass die erneute Bindung die Links im Wesentlichen wieder über seinen Datenbindungscode "reaktiviert".

Haben Sie als Alternative an das ItemDatabound-Ereignis des DataGrids gedacht und die Hyperlinks zu diesem Zeitpunkt aktiviert/deaktiviert? Sie haben alle Daten direkt zur Hand und der Code wird so aussehen wie Sie ihn jetzt haben.