2009-09-10 43 views
21

Tôi có một repeater, trong mỗi ItemTemplate của repeater là một asp: checkbox với bộ xử lý sự kiện OnCheckedChanged. Các hộp kiểm có thuộc tính AutoPostBack được đặt thành true. Khi bất kỳ hộp kiểm nào được chọn, trình xử lý sự kiện sẽ kích hoạt. Khi bất kỳ được bỏ chọn, trình xử lý sự kiện không kích hoạt.OnCheckedChanged xử lý sự kiện của asp: hộp kiểm không cháy khi hộp kiểm được bỏ chọn

Bất kỳ ý tưởng nào tại sao sự kiện không kích hoạt và cách tôi làm cho nó cháy? Cảm ơn.

Giản đang lặp lại:

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

Bộ sưu tập chắc chắn sẽ lặp lại như sau:

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

Các xử lý sự kiện OnItemDataBound được như sau:

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()); 
      } 
     } 

Sự kiện OnCheckedChanged xử lý như sau:

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

P.S. Nếu ai đó cũng có thể cho tôi biết tại sao markdown không hoạt động một cách chính xác đối với tôi ...

+0

@ Jibberish: RE: PS của bạn Bạn đã không làm điều đó đúng. ;) Thử mở câu hỏi này ở chế độ chỉnh sửa và xem tôi đã thực hiện những thay đổi nào. Điểm chính 4 dấu cách để mã tiền tố, trình soạn thảo chỉ thị cho bạn thực hiện trong bảng điều khiển bên phải. – AnthonyWJones

+0

Cảm ơn Anthony, và xin lỗi tôi đã bỏ lỡ điều đó trong biên tập viên. – Jason

Trả lời

16

Điều này là do hệ thống phân cấp kiểm soát (và các hộp kiểm tra cụ thể) không tồn tại khi ASP.NET thực thi phần Control events của vòng đời trang ASP.NET, như bạn đã tạo chúng trong các giai đoạn PreRender sau. Vui lòng xem ASP.NET Page Life Cycle Overview để biết tổng quan chi tiết hơn về chuỗi sự kiện.

tôi sẽ sai lầm về phía thận trọng để được tư vấn @ bleeeah của, cho bạn gán một giá trị để CheckBox.Checked bên rptLinkedItems_ItemDataBound, mà cũng có thể gây ra các xử lý sự kiện để thực hiện:


chkLinked.Checked = IsItemLinked(item); 

Thay vào đó, di chuyển:


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

Vào trình xử lý sự kiện Page.Load.

+0

Cảm ơn, Rabid. Đã làm điều đó ngoài việc đăng ký lại sự kiện này với tư cách là mentoined trước đó và mọi thứ hiện hoạt động chính xác như dự định. – Jason

+0

Không sao, bạn có thể bỏ phiếu cho câu hỏi của tôi http://stackoverflow.com/questions/1368403? Tôi đang tuyệt vọng cho một số lời khuyên :) – Rabid

5

Hãy thử lại thuê bao sự kiện CheckChanged trong sự kiện OnItemDataBound của bạn,

chkLinked.CheckedChanged += new EventHandler(chkLinked_CheckedChanged); 
+1

Điều đó dường như đã giải quyết được vấn đề, cảm ơn. Tôi không rõ ràng về lý do tại sao, bất cứ ai có thể khai sáng cho tôi? – Jason

+1

Nó hoạt động bởi vì các trình xử lý sự kiện của các điều khiển động phải được kết nối mỗi lần trang được xây dựng lại. – Carl

+0

Trừ khi bạn làm điều đó trong Init, theo cách đó, khung công tác sẽ giải quyết vấn đề này. –

2

Theo dõi sự kiện CheckChanged trong Page_Init của bạn .

33

Hãy thử sử dụng AutoPostBack="true" như thế này:

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

Cảm ơn bạn! Trong trường hợp của tôi nó chỉ hoạt động. – rukeba

+0

Giải pháp tốt đẹp, cảm ơn vì điều đó! +1 – Alex

+0

Rất đẹp, cảm ơn;) –

0

Bạn phải xác định eventhandler cho danh sách kiểm tra ra khỏi lệnh mục lặp lại, sau đó bên trong lệnh mục lặp lại, đi qua mục danh sách kiểm tra và có được các mục kiểm tra.

Trong trang .aspx, bạn có thể sử dụng Ajax và updatepanel để kích hoạt trình xử lý sự kiện, nhưng hãy nhớ rằng bạn phải xác định kịch bản lệnh bên ngoài bộ lặp.

// checklisk checkedchange eventhandler

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

và mục lệnh lặp lại mục: mục danh sách kiểm tra // lặp và phát hiện kiểm tra

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] + ","; 
      } 
     } 
    } 
3

Sử dụng AutoPostBack="true" như thế này:

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

Cảm ơn, điều này đã giúp tôi hiểu :) –

Các vấn đề liên quan