معالج الأحداث OnCheckedChanged لـ asp: لا يتم تشغيل مربع الاختيار عند إلغاء تحديد خانة الاختيار
سؤال
لدي مكرر، في كل 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] + ",";
}
}
}