oncheckedChanged 이벤트 핸들러 ASP : Checkbox가 확인되지 않은 경우 Checkbox가 발사되지 않습니다.
문제
리피터의 각 항목 판에는 리피터의 각 항목에 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] + ",";
}
}
}