سؤال

ولدي على 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 ل"هل هناك أي طريقة للقيام بذلك في طريقة ربط بيانات؟ I تفضل عدم ترميز ثابت" الضوابط [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)، يمكنك استخدام e.Item من ListViewItemEventArgs للحصول على ListViewItem. في حالة ربط بيانات، لا يوجد سوى EventArgs العامة.

وعلى رأس ذلك، يبدو أن ((التحكم) مرسل) .FindControl ( "Literal1") لا يعمل إما (عثور على التحكم من يكون ListView في أعلى الشجرة)، وبالتالي استخدام الضوابط [ 0] .FindControl (...) (إيجاد التحكم من listviewitem).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top