2009-03-05 15 views
11

ListViewでコントロールを検索EmptyDataTemplate

私はこのような ListViewを持っています
<asp:ListView ID="ListView1" runat="server"> 
    <EmptyDataTemplate> 
     <asp:Literal ID="Literal1" runat="server" text="some text"/> 
    </EmptyDataTemplate> 
    ... 
</asp:ListView> 

私は以下のようになります:

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

しかしxnullを返します。私はLiteralコントロールのテキストを変更したいのですが、どうやってそれを行うのか分かりません。

答えて

19

ListViewというコードの後ろにあるDataBindメソッドを呼び出さない限り、ListViewは決してデータバインドを試みません。それで何も表示されず、Literalコントロールでさえも’が作成されます。それはあなたが尋ね特にありませんが、そういったことを行うための別の方法は、このようなものです

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 - これはまさに私が必要としていたものです。ありがとう! – jonsidnell

+4

データバインドメソッドでこれを行う方法はありますか?私はむしろ "controls [0]"をハードコードしていません。 – Broam

+0

'.Controls [0]'を取り出すとエラーが出ます。なぜあなたはそれが必要なのか理解できますか?私たちがコントロールと名前のインデックスを伝えているように思えますが、なぜ両方が必要であるかわかりません。 –

3

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

foobarのが定義されている場所あなたのPage_Loadイベントで

のような何かを試してみてくださいページのコードビハインドファイル

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

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

これは、EmptyItemTemplateを見つけます。これは表示されないEmptyDataTemplateもあります。 – 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

別のアプローチ...コードビハインドで

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

がBroamの質問に答えます」 databoundメソッドでこれを行う方法はありますか?私はむしろ、「コントロールが[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]。通常の項目イベントで

を(使用しないでする方法を発見していませんでしたハードコードしないでと思いますItemDataBoundまたはItemCreate)、ListViewItemEventArgsのe.Itemを使用してListViewItemを取得できます。DataBoundイベントには汎用EventArgsのみがあります。

さらに、((Control)送信者)そうです。 FindControl( "Literal1")も機能しません(ツリーの一番上にあるリストビューからコントロールを見つけます)。したがってControls [0] .FindControl(...)(listviewitemからコントロールを見つけてください)。

関連する問題