Найти элемент управления в ListView EmptyDataTemplate
У меня есть a 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
, но я не знаю, как это сделать.
Ответы
Ответ 1
Я считаю, что если вы не вызываете метод 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
}
}
}
Ответ 2
Вы можете использовать следующее:
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
}
}
}
Ответ 3
Это не то, что вы просили, но другой способ сделать это:
<EmptyDataTemplate>
<%= Foobar() %>
</EmptyDataTemplate>
где Foobar определен в вашем коде страницы за файлом
public partial class MyClass : System.Web.UI.Page
{
...
public string Foobar()
{
return "whatever";
}
}
Ответ 4
Альтернативный подход...
<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";
}
Ответ 5
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
...
Ответ 6
Отвечающий вопрос Брума "Есть ли способ сделать это в методе привязки данных? Я бы предпочел не жестко кодировать" элементы управления [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 существует только общий EventArg.
И кроме того, кажется, что ((Control) отправитель).FindControl( "Literal1" ) тоже не работает (найдите элемент управления из списка в верхней части дерева), следовательно, использование элементов управления [ 0].FindControl(...) (найдите элемент управления из listviewitem).