Question

J'ai le ListView comme ceci

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

Dans Page_Load () , j'ai les éléments suivants:

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

mais x renvoie null . Je souhaite modifier le texte du contrôle Literal , mais je ne sais pas comment le faire.

Était-ce utile?

La solution

Je crois que si vous n'appelez pas la méthode DataBind de votre ListView quelque part dans le code, le ListView n'essaiera jamais de lier les données. Dans ce cas, rien ne sera rendu et même le contrôle Littéral ne sera pas & # 8217; pas créé.

Dans votre événement Page_Load , essayez quelque chose comme:

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

Autres conseils

Vous pouvez utiliser les éléments suivants:

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

Ce n'est pas précisément ce que vous avez demandé, mais une autre façon de faire ce genre de chose est la suivante:

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

où Foobar est défini dans le code derrière le fichier de votre page

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

Une approche alternative ...

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

Dans 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

...

Répondre à la question de Broam "Y a-t-il un moyen de faire cela avec la méthode databound? Je préférerais ne pas coder en dur " contrôles [0] " comme c'est bâclé "

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

Malheureusement, je n'ai pas trouvé le moyen de ne pas utiliser les contrôles [0].

Dans les événements Item habituels (ItemDataBound ou ItemCreate), vous pouvez utiliser e.Item du ListViewItemEventArgs pour obtenir le ListViewItem. Dans l'événement DataBound, il n'y a qu'un EventArgs générique.

Et en plus de cela, il semble que (l'expéditeur (du contrôle)) .FindControl ("Literal1") ne fonctionne pas non plus (trouver le contrôle dans la liste en haut de l'arborescence), d'où l'utilisation de Controls [0] .FindControl (...) (recherchez le contrôle dans le listviewitem).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top