معالج الأحداث OnCheckedChanged لـ asp: لا يتم تشغيل مربع الاختيار عند إلغاء تحديد خانة الاختيار

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

  •  05-07-2019
  •  | 
  •  

سؤال

لدي مكرر، في كل ItemTemplate للمكرر يوجد asp: خانة اختيار مع مجموعة معالج الأحداث OnCheckedChanged.تحتوي مربعات الاختيار على خاصية AutoPostBack مضبوطة على true.عند تحديد أي من خانات الاختيار، يتم تشغيل معالج الحدث.عند إلغاء تحديد أي منها، لا يتم إطلاق معالج الحدث.

هل لديك أي فكرة لماذا لا يشتعل الحدث، وكيف يمكنني إشعاله؟شكرًا.

رمز مكرر مبسط:

<asp:Repeater ID="rptLinkedItems" runat="server">            
    <ItemTemplate>      
    <asp:CheckBox ID="chkLinked" runat="server" 
     Checked="false" OnCheckedChanged="chkLinked_CheckedChanged" />
    </ItemTemplate>    
</asp:Repeater>

ترتبط المجموعة بالمكرر على النحو التالي:

protected override void OnPreRenderComplete(EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                m_linkedItems = GetLinkedItems();
                rptLinkedItems.DataSource = GetLinkableItems();
                rptLinkedItems.ItemDataBound += new RepeaterItemEventHandler
                       (rptLinkedItems_ItemDataBound);
                rptLinkedItems.DataBind();
            }

            base.OnPreRenderComplete(e);
        }

معالج الأحداث OnItemDataBound كما يلي:

private void rptLinkedItems_ItemDataBound(Object sender, RepeaterItemEventArgs args)
        {
            if (args.Item.ItemType == ListItemType.Item || args.Item.ItemType == ListItemType.AlternatingItem)
            {
                CategoryItem item = args.Item.DataItem as CategoryItem;

                Literal litItemName = args.Item.FindControl("litItemName") as Literal;
                CheckBox chkLinked = args.Item.FindControl("chkLinked") as CheckBox;

                litItemName.Text = item.Text;

                chkLinked.Checked = IsItemLinked(item);
                chkLinked.AutoPostBack = true;
                chkLinked.InputAttributes.Add("Value", item.Id.ToString());
            }
        }

معالج الأحداث OnCheckedChanged هو كما يلي:

protected void chkLinked_CheckedChanged(Object sender, EventArgs args)
{
            CheckBox linkedItem = sender as CheckBox;
            Boolean itemState = linkedItem.Checked;
            Int32 itemId = Int32.Parse(linkedItem.InputAttributes["Value"].ToString());
            DataAccessLayer.UpdateLinkedItem(m_linkingItem, Utilities.GetCategoryItemFromId(itemId), itemState);
}

ملاحظة.إذا كان بإمكان أي شخص أن يخبرني أيضًا لماذا لا يعمل تخفيض السعر بشكل صحيح بالنسبة لي ...

هل كانت مفيدة؟

المحلول

وذلك لأن التسلسل الهرمي للتحكم (ومربعات الاختيار على وجه الخصوص) غير موجود عندما يقوم ASP.NET بتنفيذ الأمر Control events جزء من دورة حياة صفحة ASP.NET، كما قمت بإنشائها في وقت لاحق PreRender مراحل.لطفا أنظر نظرة عامة على دورة حياة صفحة ASP.NET للحصول على نظرة عامة أكثر تفصيلاً عن تسلسل الأحداث.

سأخطئ في توخي الحذر فيما يتعلق بنصيحة @bleeeah، لأنك تقوم بتعيين قيمة لـ CheckBox.Checked داخل rptLinkedItems_ItemDataBound, ، والذي قد يتسبب أيضًا في تنفيذ معالج الحدث:


chkLinked.Checked = IsItemLinked(item);

بدلاً من ذلك، تحرك:


if (!Page.IsPostBack)
   {
      m_linkedItems = GetLinkedItems();
      rptLinkedItems.DataSource = GetLinkableItems();
      rptLinkedItems.ItemDataBound += new RepeaterItemEventHandler
          (rptLinkedItems_ItemDataBound);
      rptLinkedItems.DataBind();
   }

داخل ال Page.Load معالج الحدث.

نصائح أخرى

وحاول usingAutoPostBack="true" مثل هذا:

<asp:CheckBox ID="chkLinked" runat="server" Checked="false"
    OnCheckedChanged="chkLinked_CheckedChanged" AutoPostBack="true"/>

وحاول إعادة الاشتراك لهذا الحدث CheckedChanged في الحدث ItemDataBound الخاص بك،

chkLinked.CheckedChanged += new EventHandler(chkLinked_CheckedChanged);

استخدم AutoPostBack="true" مثل هذا:

<asp:CheckBox ID="chkLinked" runat="server" AutoPostBack="true"
    Checked="false" OnCheckedChanged="chkLinked_CheckedChanged" />

واشترك في الحدث CheckChanged في Page_Init الخاص بك.

لديك لتحديد eventhandler عن المرجعية من قيادة البند مكرر، ثم داخل الأمر البند مكرر، انتقل من خلال البنود المرجعية والحصول على العناصر المحددة.

في صفحة .aspx يمكنك استخدام اياكس وupdatepanel لاطلاق النار eventhandler، ولكن نأخذ في الاعتبار لديك لتحديد scriptmanage خارج مكرر.

و// checklisk checkedchange eventhandler

protected void chkLinked_CheckedChanged(Object sender, EventArgs args)
        {
        }

والبند مكرر البند الأوامر: // البنود أعاد المرجعية وكشف فحص

    protected void Repeater1_ItemCommand(object sender, RepeaterCommandEventArgs e)
    {
        CheckBoxList cbl = (CheckBoxList)e.Item.FindControl("CheckBoxList1");
        cbl.SelectedIndexChanged += new EventHandler(chkLinked_CheckedChanged);

        string name = "";
        for (int i = 0; i < cbl.Items.Count; i++)
        {
            if (cbl.Items[i].Selected)
            {
                name += cbl.Items[i].Text.Split(',')[0] + ",";
            }
        }
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top