2009-03-05 6 views
11

Ich habe die eine ListView wie dieseFinden Steuerung in Listview Emptydatatemplate

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

In Page_Load() Ich habe folgendes:

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

aber x kehrt null. Ich ’ d möchte den Text der Literal Kontrolle ändern, aber ich don ’ t habe keine Ahnung, wie es geht.

Antwort

19

Ich glaube, dass, wenn Sie die DataBind Methode Ihrer ListView irgendwo in Code hinter anrufen, wird die ListView nie versuchen, Daten zu binden. Dann wird nichts gerendert und selbst die Literal Kontrolle gewonnen ’ t erstellt werden.

In Ihrem Page_Load Fall versuchen so etwas wie:

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 - das ist genau das, was ich auch brauchte. Vielen Dank! – jonsidnell

+4

Gibt es eine Möglichkeit, dies in der datengebundenen Methode zu tun? Ich würde "Kontrollen [0]" lieber nicht "hartcodieren", da das schlampig ist. – Broam

+0

Wenn ich '.Controls [0]' nehme ich einen Fehler. Kannst du mir helfen zu verstehen, warum du es brauchst? Es scheint, als ob wir ihm den Index der Kontrolle und den Namen mitteilen, ich verstehe nicht, warum beides notwendig wäre. –

3

Es ist nicht gesagt, was Sie gefragt, aber eine andere Möglichkeit, diese Art der Sache zu tun ist, wie folgt aus:

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

wo Foobar definiert in Code Ihrer Seite hinter Datei

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

Sie können die Folge verwenden 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

Dies wird die EmptyItemTemplate erkennen. Es gibt auch eine EmptyDataTemplate, die nicht angezeigt wird. – 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

Ein alternativer Ansatz ...

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

In Code-behind ...

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

Broam der Frage zu beantworten " Gibt es eine Möglichkeit, dies in der datenbasierten Methode zu tun? Ich würde eher hard nicht „Kontrollen [0]“ wie schlampig ist“

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"; 
} 

Leider, ich habe einen Weg gefunden, um nicht Bedienelemente zu verwenden [0].

In den üblichen Artikeln Ereignisse ((ItemDataBound oder ItemCreate), Sie können e.Item des ListViewItemEventArgs verwenden, um das ListViewItem abzurufen.Im DataBound-Ereignis gibt es nur ein generisches EventArgs.

Und obendrein scheint es ((Kontroll-) Absender). FindControl ("Literal1") funktioniert auch nicht (finde die Kontrolle aus der Listenansicht am Anfang der Baumstruktur), daher die Verwendung von Controls [0] .FindControl (...) (finde das Control aus dem listviewitem)