تفقد DropDownList التي تم إنشاؤها ديناميكيًا عناصر القائمة عند إعادة النشر

StackOverflow https://stackoverflow.com/questions/623611

سؤال

لدي صفحة تحتوي على بعض عناصر التحكم التي تم إنشاؤها ديناميكيًا (TextBox وDropDownList).عند حدوث إعادة النشر، تحتفظ مربعات النص بقيمها، لكن قوائم DropDownLists تفقد عناصر القائمة الخاصة بها.وهذا أمر مربك للغاية، نظرًا لأن DropDownList على مستوى الصفحة يحتفظ أيضًا بعناصر القائمة الخاصة به.هل يمكن لأي شخص أن يرى ما هو الخطأ في الكود أدناه؟

أي مساعدة في حل هذه المشكلة سيكون موضع تقدير كبير.

<%@ Page Language="VB"%>

<script runat="server">
  Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs)
    If Not Page.IsPostBack Then
      ddlFixed.Items.Add(New ListItem("12", "13"))
      ddlFixed.Items.Add(New ListItem("14", "15"))
    End If
    Dim i As Integer
    For i = 0 To 3
      Dim ddl As New DropDownList
      ddl.ID = "ddlPage" & i
      ddl.EnableViewState = True
      If Not Page.IsPostBack Then
        ddl.Items.Add(New ListItem("12", "13"))
        ddl.Items.Add(New ListItem("14", "15"))
      End If
      pnlDynamic.Controls.Add(ddl)
      Dim txtBx As New TextBox
      txtBx.ID = "txtPage" & i
      If Not Page.IsPostBack Then
        txtBx.Text = "Preset"
      End If
      pnlDynamic.Controls.Add(txtBx)
    Next
  End Sub
</script>


<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title></title>
</head>
<body>
  <form id="form1" runat="server" enableviewstate="true">
  <div>
    <br />
    <br />
    <a href="Default.aspx">Get-Request</a>
    <br />
    <br />
    <asp:Panel runat="server" ID="pnlDynamic" EnableViewState="true" />    
    <br />
    <br />
    <asp:DropDownList runat="server" ID="ddlFixed" />
    <asp:Button runat="server" ID="btn" Text="Postback"/>
  </div>
  </form>
</body>
</html>
هل كانت مفيدة؟

المحلول

لقد وجدت الحل الذي سيسمح لي بالحفاظ على حالة العرض عبر عمليات إعادة النشر.إنه استدعاء TrackViewState الخاص بـ ItemCollection.

CType(ddl.Items, IStateManager).TrackViewState()

شكرا للجميع على مساعدتكم.

هذا هو الحل العملي:

<%@ Page Language="VB"%>

<script runat="server">
  Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs)
    If Not Page.IsPostBack Then
      ddlFixed.Items.Add(New ListItem("12", "13"))
      ddlFixed.Items.Add(New ListItem("14", "15"))
    End If
    Dim i As Integer
    For i = 0 To 3
      Dim ddl As New DropDownList
      ddl.ID = "ddlPage" & i
      CType(ddl.Items, IStateManager).TrackViewState()
      If Not Page.IsPostBack Then
        ddl.Items.Add(New ListItem("12", "13"))
        ddl.Items.Add(New ListItem("14", "15"))
      End If
      pnlDynamic.Controls.Add(ddl)
      Dim txtBx As New TextBox
      txtBx.ID = "txtPage" & i
      If Not Page.IsPostBack Then
        txtBx.Text = "Preset"
      End If
      pnlDynamic.Controls.Add(txtBx)
    Next
  End Sub
</script>


<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
  <title></title>
</head>
<body>
  <form id="form1" runat="server" >
  <div>
    <br />
    <br />
    <a href="Default.aspx">Get-Request</a>
    <br />
    <br />
    <asp:Panel runat="server" ID="pnlDynamic" />    
    <br />
    <br />
    <asp:DropDownList runat="server" ID="ddlFixed" />
    <asp:Button runat="server" ID="btn" Text="Postback"/>
  </div>
  </form>
</body>
</html>

نصائح أخرى

سيحتفظ DDL بعناصره واختياره عند تمكين حالة العرض.سيحتفظ مربع النص بمحتوياته بغض النظر عن حالة العرض حيث تتم كتابة HTML الناتج مرة أخرى إلى الخادم عند إعادة النشر.

أجد أنه من الغريب أن يكون لديك كل عبارات حالة العرض هذه في التعليمات البرمجية والترميز الخاص بك.

يحدث أحد الأشياء العديدة:

  1. تم تعطيل ViewState في عنصر التحكم
  2. تم تعطيل ViewState أعلى التسلسل الهرمي للتحكم (الصفحة، النموذج، اللوحة)
  3. إنك تقوم بإضافة عنصر التحكم ديناميكيًا في وقت متأخر جدًا في دورة الصفحة بحيث لا يمكن تحميل التحديد من حالة العرض.يجب أن يكون التحميل في INIT جيدًا.

قد يكون ما تحتاجه لتنشيط صراحة حالة العرض لأولئك DropDownLists ...

وتحرير: وهذا ما أعنيه تعليقي الأخير ...

    <script runat="server">
      Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs)
        If Not Page.IsPostBack Then
          ddlFixed.Items.Add(New ListItem("12", "13"))
          ddlFixed.Items.Add(New ListItem("14", "15"))

          Dim i As Integer
          For i = 0 To 3
            Dim ddl As New DropDownList
            ddl.ID = "ddlPage" & i
            ddl.EnableViewState = True
            ddl.Items.Add(New ListItem("12", "13"))
            ddl.Items.Add(New ListItem("14", "15"))

            pnlDynamic.Controls.Add(ddl)
            Dim txtBx As New TextBox
            txtBx.ID = "txtPage" & i
            txtBx.Text = "Preset"
            pnlDynamic.Controls.Add(txtBx)
          Next
        End If
      End Sub
   </script>

أنا دائما استخدم Page_Load ولن تواجه مشكلة كهذه أبدًا.ربما شيء يمكنك النظر إليه.

أقوم عمومًا بربط البيانات بعناصر التحكم في المرة الأولى التي يتم فيها تحميل الصفحة، وبعد ذلك أسمح لـ Viewstate بمعالجة عمليات إعادة النشر وما إلى ذلك.لاحظ أنهم يقترحون عليك ربط البيانات أثناء Page_Load ...

الدفع http://support.microsoft.com/kb/305141

أحداث الصفحة loadtocnode (2 ، 'moreinformation') ؛خلال دورة حياة صفحة ASP.NET ، بعض الأحداث القياسية التي تتعرض من صفحة يتم استخدام الكائن بشكل متكرر.يتصل إطار صفحة ASP.NET تلقائيًا بـ (أو الأسلاك) مثيلات مناسبة في وقت التشغيل لهذه الطرق.هذا يوفر لك من الاضطرار إلى كتابة "رمز الغراء" اللازم. تعرض القائمة التالية مثيلات مندوبة يتم توصيلها في وقت التشغيل بالترتيب الذي يتم إطلاقه به:
  • Page_Init:خلال هذا الحدث ، يمكنك تهيئة القيم أو توصيل أي معالجات أحداث قد تكون لديك.
  • تحميل الصفحة:خلال هذا الحدث ، يمكنك تنفيذ سلسلة من الإجراءات إما لإنشاء صفحة ASP.NET الخاصة بك لأول مرة أو الاستجابة للأحداث من جانب العميل التي تنتج عن منشور.تمت استعادة حالة عرض الصفحة وعرض التحكم قبل هذا الحدث.استخدم ال IsPostBack خاصية الصفحة للتحقق مما إذا كانت هذه هي المرة الأولى التي تتم فيها معالجة الصفحة.إذا كانت هذه هي المرة الأولى، فقم بإجراء ربط البيانات.أيضا ، قراءة وتحديث خصائص التحكم.
  • Page_DataBind:ال ربط البيانات يُرفع الحدث عندما ربط البيانات يتم استدعاء الطريقة على مستوى الصفحة.إذا اتصلت ربط البيانات على عناصر التحكم الفردية، فإنه يطلق فقط ربط البيانات حدث الضوابط تحته.
  • Page_PreRender:ال العرض المسبق يتم إطلاق الحدث قبل حفظ حالة العرض مباشرة ويتم تقديم عناصر التحكم.يمكنك استخدام هذا الحدث لأداء أي عمليات في اللحظة الأخيرة على عناصر التحكم الخاصة بك.
  • Page_Unload:بعد الانتهاء من عرض الصفحة، يتم Page_Unload حرائق الأحداث.هذا الحدث هو مكان جيد لأداء أعمال التنظيف النهائية.يتضمن ذلك عناصر مثل تنظيف اتصالات قاعدة البيانات المفتوحة ، أو التخلص من الكائنات ، أو إغلاق تلك الملفات المفتوحة.
تحدد القائمة التالية الأحداث غير المحددة:
  • خطأ في الصفحة:في حالة حدوث استثناء لم تتم معالجته أثناء معالجة الصفحة، سيتم حذف ملف خطأ حرائق الأحداث.ال خطأ يمنحك الحدث فرصة للتعامل مع الأخطاء بأمان.
  • Page_AbortTransaction: عملية الأحداث مفيدة إذا كنت تريد الإشارة إلى ما إذا كانت المعاملة تنجح أو تفشل.يستخدم هذا الحدث بشكل شائع لسيناريوهات عربة التسوق التي يمكن أن يشير فيها هذا الحدث إلى نجاح أو فشل الطلب.هذا الحدث يطلق النار عند إحباط معاملة.
  • Page_CommitTransaction:هذا الحدث يطلق النار عند ارتكاب معاملة بنجاح.

لا يتم تخزين عناصر القائمة في DropDownList في حالة العرض.سيكون عليك إضافتها في كل إعادة نشر.

ما يتم تخزينه في حالة العرض هو الفهرس المحدد - أي."قيمة" عنصر التحكم.

يحرر: حسنًا، يبدو أنني تعلمت شيئًا اليوم.أنا أقف بشكل صحيح :-)

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