2009-06-24 4 views
3

Ich habe einige ähnliche Fragen ohne Glück durchgesehen. Was ich tun möchte, ist eine Gridview, die für bestimmte Elemente einen Linkbutton zeigt und für andere Elemente einen Hyperlink anzeigt. Dies ist der Code, den ich derzeit haben:Kann ich programmgesteuert eine Verknüpfungsschaltfläche zu Gridview hinzufügen?

public void gv_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     var data = (FileDirectoryInfo)e.Row.DataItem; 
     var img = new System.Web.UI.HtmlControls.HtmlImage(); 
     if (data.Length == null) 
     { 
      img.Src = "/images/folder.jpg"; 
      var lnk = new LinkButton(); 
      lnk.ID = "lnkFolder"; 
      lnk.Text = data.Name; 
      lnk.Command += new CommandEventHandler(changeFolder_OnCommand); 
      lnk.CommandArgument = data.Name; 
      e.Row.Cells[0].Controls.Add(lnk); 
     } 
     else 
     { 
      var lnk = new HyperLink(); 
      lnk.Text = data.Name; 
      lnk.Target = "_blank"; 
      lnk.NavigateUrl = getLink(data.Name); 
      e.Row.Cells[0].Controls.Add(lnk); 
      img.Src = "/images/file.jpg"; 
     } 
     e.Row.Cells[0].Controls.AddAt(0, img); 
    } 
} 

, wo die erste Zelle ist eine Template. Momentan wird alles korrekt angezeigt, aber die Linkschaltflächen rufen den Ereignishandler Command nicht auf und alle Steuerelemente verschwinden beim Postback.

Irgendwelche Ideen?

Antwort

3

Ich denke, Sie sollten versuchen, eine Rebind der GridView auf Postback erzwingen. Dadurch wird sichergestellt, dass alle dynamischen Steuerelemente neu erstellt und ihre Ereignishandler neu angehängt werden. Dies sollte auch ihr Verschwinden nach dem Postback verhindern.

IOW, rufen Sie DataBind() in der GridView beim Postback.

+0

Vielen Dank für diese Lösung !!! Ich habe gerade ungefähr eine Stunde damit verbracht, das gleiche Problem mit allen möglichen verrückten Lösungsvorschlägen zu erforschen ... und dieses Problem beinhaltete einfach das Entfernen des Post-Back-Checks beim Laden der Seite. –

0

Warum erstellen Sie die Schaltfläche nicht deklarativ und erstellen Sie die Deklaration deklarativ (mithilfe eines Literalsteuerelements) und verwenden Sie dann die Datenbindungssyntax und legen Sie die Visibility-Eigenschaft der Steuerelemente wie erforderlich auf true oder false fest:

Visible='<%#((FileDirectoryInfo)Container.DataItem).Length == null) %>' 

So ähnlich.

1

Sie können auch diese in der Row_Created Ereignis hinzufügen und dann müssen Sie nicht rückgängig gemacht werden! Postback Check