oncheckedChanged 이벤트 핸들러 ASP : Checkbox가 확인되지 않은 경우 Checkbox가 발사되지 않습니다.

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

  •  05-07-2019
  •  | 
  •  

문제

리피터의 각 항목 판에는 리피터의 각 항목에 ASP가 있습니다. oncheckedChanged 이벤트 핸들러 세트가있는 Checkbox가 있습니다. 확인란에는 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);
}

추신 : 누군가가 왜 Markdown이 나를 올바르게 작동하지 않는지 말해 줄 수 있다면 ...

도움이 되었습니까?

해결책

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 이벤트 핸들러.

다른 팁

사용해보십시오AutoPostBack="true" 이와 같이:

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

OnitemDatabound 이벤트에서 Checkchanged 이벤트를 다시 구독 해보세요.

chkLinked.CheckedChanged += new EventHandler(chkLinked_CheckedChanged);

사용 AutoPostBack="true" 이와 같이:

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

page_init에서 checkchanged 이벤트를 구독하십시오.

리피터 항목 명령에서 점검 목록에 대해 이벤트 핸들러를 정의 한 다음 리피터 항목 명령 내부에서 점검 목록 항목을 살펴보고 확인 품목을 가져와야합니다.

.aspx 페이지에서 Ajax 및 UpdatePanel을 사용하여 Eventhandler를 발사 할 수 있지만 Repeater 외부에서 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