Frage

Ich habe das ein ListView wie diese

<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 gibt null. Ich mag den Text der Literal Steuerung ändern, aber ich weiß nicht keine Ahnung, wie es zu tun.

War es hilfreich?

Lösung

Ich glaube, dass, wenn Sie die DataBind Methode Ihrer ListView irgendwo im Code hinter rufen, wird die ListView nie Daten binden versuchen. Dann wird nichts machen und sogar die Literal Kontrolle wird nicht erstellt werden.

In Ihrer Page_Load Veranstaltung versucht 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
        }    
    }
}

Andere Tipps

Sie können das folgende:

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

Es ist nicht gesagt, was Sie gefragt, sondern eine andere Art und Weise, so etwas zu tun, ist wie folgt:

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

Dabei ist Foobar definiert in Ihrer Seite Code hinter Datei

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

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>

Code-behind ...

protected void Literal1_Init(object sender, EventArgs e)
{
    (sender as Literal).Text = "Some other text";
}
 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

...

Die Beantwortung Broam Frage: „Gibt es eine Möglichkeit, dies in der Databound-Methode zu tun? Ich mag lieber nicht hart codieren‚Kontrollen [0]‘, wie das ist schlampig“

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 habe ich keine Möglichkeit, nicht verwenden Kontrollen [0].

gefunden

Bei den üblichen Artikel Ereignisse (ItemDataBound oder ItemCreate) können Sie e.Item der ListViewItemEventArgs verwenden, um die ListViewItem zu bekommen. Im Databound-Ereignis gibt es nur eine generische EventArgs.

Und obendrein, so scheint es, dass ((Control) sender) .FindControl ( „Literal1“) entweder nicht funktioniert, daher die Verwendung von Controls (Steuerung aus der Listenansicht an der Spitze des Baumes finden) [ 0] .FindControl (...) (finden Sie die Steuerung von dem ListViewItem).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top