12

私は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どうすればよいかわかりません。

4

6 に答える 6

21

コードビハインドでどこかのDataBindメソッドを呼び出さない限り、データバインドを試みることは決してないと思います。その後、何もレンダリングされず、コントロールも作成されません。ListViewListViewLiteral

あなたの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
        }    
    }
}
于 2009-03-05T02:05:16.777 に答える
4

以下を使用できます。

 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
                }
            }
        }
于 2012-05-04T13:07:41.203 に答える
3

特にあなたが尋ねたものではありませんが、そのようなことを行う別の方法は次のとおりです。

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

Foobar は、ページのコード ビハインド ファイルで定義されています。

public partial class MyClass : System.Web.UI.Page
{
...
    public string Foobar()
    {
         return "whatever";
    }
}
于 2011-02-16T17:58:08.307 に答える
1

Broam の質問への回答「データバインド メソッドでこれを行う方法はありますか? "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";
}

残念ながら、Controls[0] を使用しない方法は見つかりませんでした。

通常の Item イベント (ItemDataBound または ItemCreate) では、ListViewItemEventArgs の e.Item を使用して ListViewItem を取得できます。DataBound イベントには、ジェネリック EventArgs のみがあります。

その上、 ((Control)sender).FindControl("Literal1") も機能しないようです(ツリーの上部にあるリストビューからコントロールを見つける)ため、 Controls[0] を使用します。 FindControl(...) (リストビュー項目からコントロールを見つけます)。

于 2014-02-18T18:12:10.970 に答える
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

...

于 2012-08-24T12:59:48.733 に答える