2009-03-05 12 views
11

ho l'una ListView come questoTrova controllo ListView EmptyDataTemplate

<asp:ListView ID="ListView1" runat="server"> 
    <EmptyDataTemplate> 
     <asp:Literal ID="Literal1" runat="server" text="some text"/> 
    </EmptyDataTemplate> 
    ... 
</asp:ListView> 

In Page_Load() ho il seguente:

Literal x = (Literal)ListView1.FindControl("Literal1"); 
x.Text = "other text"; 

ma x rendimenti null. I ’ mi piacerebbe cambiare il testo del controllo Literal ma non lo so ’ t non ho idea di come farlo.

risposta

19

Credo che a meno che non chiami il metodo DataBind del tuo ListView da qualche parte nel codice, il ListView non tenterà mai di eseguire il binding dei dati. Quindi niente renderà e anche il controllo Literal ha vinto ’ t essere creato.

Nel vostro evento Page_Load provare qualcosa di simile:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     //ListView1.DataSource = ... 
     ListView1.DataBind(); 

     //if you know its empty empty data template is the first parent control 
     // aka Controls[0] 
     Control c = ListView1.Controls[0].FindControl("Literal1"); 
     if (c != null) 
     { 
      //this will atleast tell you if the control exists or not 
     }  
    } 
} 
+0

+1: questo è esattamente ciò di cui avevo bisogno. Grazie! – jonsidnell

+4

C'è un modo per farlo nel metodo del databound? Preferisco * not * hardcode "controls [0]" dato che è sciatto. – Broam

+0

se tolgo '.Controls [0]' Ricevo un errore. Puoi aiutarmi a capire perché ne hai bisogno? Sembra che gli stiamo dicendo l'indice del controllo e il nome, non riesco a capire perché entrambi sarebbero necessari. –

3

Non è specificamente quello che hai chiesto, ma un altro modo di fare questo genere di cose è come questo:

<EmptyDataTemplate> 
    <%= Foobar() %> 
</EmptyDataTemplate> 

in cui è definito Foobar nel codice della tua pagina dietro il file

public partial class MyClass : System.Web.UI.Page 
{ 
... 
    public string Foobar() 
    { 
     return "whatever"; 
    } 
} 
4

È possibile utilizzare il seguente ing:

protected void ListView1_ItemDataBound(object sender, ListViewItemEventArgs e) 
     { 
      if (e.Item.ItemType == ListViewItemType.EmptyItem) 
      { 
       Control c = e.Item.FindControl("Literal1"); 
       if (c != null) 
       { 
        //this will atleast tell you if the control exists or not 
       } 
      } 
     } 
+0

Individuerà EmptyItemTemplate. C'è anche un EmptyDataTemplate che questo non vedrà. – JonathanWolfson

1
Protected Sub ListView1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.ListViewItemEventArgs) Handles ListView1.ItemDataBound 
    Dim searchValue As String = Replace(Request.QueryString("s"), "", "'") 
    Dim searchLiteral2 As Literal = CType(ListView1.FindControl("Literal2"), Literal) 
    searchLiteral2.Text = "''" & searchValue & "''" 
End Sub 

...

2

Un approccio alternativo ...

<asp:ListView ID="ListView1" runat="server"> 
    <EmptyDataTemplate> 
     <asp:Literal ID="Literal1" runat="server" text="some text" OnInit="Literal1_Init" /> 
    </EmptyDataTemplate> 
    ... 
</asp:ListView> 

Nel code-behind ...

protected void Literal1_Init(object sender, EventArgs e) 
{ 
    (sender as Literal).Text = "Some other text"; 
} 
0

rispondere alla domanda di Broam " C'è un modo per farlo nel metodo del databound? Preferirei non hardcode "controlli [0]" in quanto questo è sciatta"

protected void ListView1_DataBound(object sender, EventArgs e) 
{ 
    ListView mylist = ((ListView)sender); 
    ListViewItem lvi = null; 
    if (mylist.Controls.Count == 1) 
     lvi = mylist.Controls[0] as ListViewItem; 

    if (lvi == null || lvi.ItemType != ListViewItemType.EmptyItem) 
     return; 

    Literal literal1 = (Literal)lvi.FindControl("Literal1"); 
    if (literal1 != null) 
     literal1.Text = "No items to display"; 
} 

Purtroppo, non ho trovato un modo di non usare i controlli [0].

Nei consueti appuntamenti Item (ItemDataBound o ItemCreate), è possibile utilizzare e.Item di ListViewItemEventArgs per ottenere ListViewItem. Nell'evento DataBound, c'è solo un EventArgs generico.

E per di più, sembra che ((Control) mittente). FindControl ("Literal1") non funziona neanche (trova il controllo da listview in cima all'albero), da qui l'uso di Controls [0] .FindControl (...) (trova il controllo da listviewitem).

Problemi correlati