문제

나는 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 통제하지만 어떻게 해야할지 모르겠습니다.

도움이 되었습니까?

해결책

나는 당신이 전화하지 않는 한 믿습니다 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

...

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

불행히도, 나는 컨트롤을 사용하지 않는 방법을 찾지 못했습니다 [0].

일반적인 항목 이벤트 (ItemDatabound 또는 ItemCreate)에서 ListViewItemeventArgs의 e.iTem을 사용하여 ListViewItem을 얻을 수 있습니다. 데이터 바운드 이벤트에는 일반적인 이벤트가 있습니다.

또한 ((제어) 발신자) .FindControl ( "Literal1")이 작동하지 않으므로 (트리 상단의 ListView에서 제어를 찾으므로) 컨트롤 사용 [0]. findControl (...) (ListViewItem에서 컨트롤을 찾으십시오).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top