Вопрос

У меня есть а ListView вот так

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

В Page_Load() У меня есть следующее:

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

но x ВОЗВРАТ null.Я бы хотел изменить текст этого Literal контролирую, но я понятия не имею, как это сделать.

Это было полезно?

Решение

Я полагаю, что если вы не вызовете метод DataBind вашего ListView где-то внутри кода, ListView никогда не будет пытаться связать данные. Тогда ничто не будет отображаться, и даже элемент управления Literal не будет создан.

В вашем событии Page_Load попробуйте что-то вроде:

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

Другие советы

Вы можете использовать следующее:

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

Это не совсем то, что вы просили, но другой способ сделать что-то вроде этого:

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

где Foobar определяется в коде вашей страницы за файлом

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

Альтернативный подход ...

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

В коде позади ...

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

...

Отвечая на вопрос Броама " Есть ли способ сделать это в методе с привязкой к данным? Я бы предпочел не использовать жесткий код " controls [0] " как это неаккуратно "

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

К сожалению, я не нашел способ не использовать элементы управления [0].

В обычных событиях Item (ItemDataBound или ItemCreate) вы можете использовать e.Item объекта ListViewItemEventArgs для получения ListViewItem. В событии DataBound есть только общие EventArgs.

И, кроме того, кажется, что ((Control) sender) .FindControl (" Literal1 ") тоже не работает (найдите элемент управления из списка в верхней части дерева), поэтому используется Controls [0] .FindControl (...) (найти элемент управления из списка).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top