チェックボックスがオフの場合、asp:checkboxのOnCheckedChangedイベントハンドラーは起動しません
質問
リピーターがあります。リピーターの各ItemTemplateには、OnCheckedChangedイベントハンドラーが設定されたasp: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);
}
PSマークダウンが正しく機能しない理由を誰かが教えてくれたら...
解決
これは、作成したようにASP.NETがASP.NETページライフサイクルの Control events
部分を実行するときに、コントロール階層(および特にチェックボックス)が存在しないためです。それらは後の PreRender
ステージで。の詳細な概要については、 ASP.NETページライフサイクルの概要をご覧ください。イベントシーケンス。
rptLinkedItems_ItemDataBound
内の CheckBox.Checked
に値を割り当てているため、@ bleeeahのアドバイスには注意が必要です。イベントハンドラーを実行させます:
chkLinked.Checked = IsItemLinked(item);
代わりに、移動:
if (!Page.IsPostBack)
{
m_linkedItems = GetLinkedItems();
rptLinkedItems.DataSource = GetLinkableItems();
rptLinkedItems.ItemDataBound += new RepeaterItemEventHandler
(rptLinkedItems_ItemDataBound);
rptLinkedItems.DataBind();
}
Page.Load
イベントハンドラへ。
他のヒント
次のように AutoPostBack =&quot; true&quot;
を使用してみてください:
<asp:CheckBox ID="chkLinked" runat="server" Checked="false"
OnCheckedChanged="chkLinked_CheckedChanged" AutoPostBack="true"/>
ItemDataBoundイベントでCheckedChangedイベントを再度サブスクライブしてみてください
chkLinked.CheckedChanged += new EventHandler(chkLinked_CheckedChanged);
次のように AutoPostBack =&quot; true&quot;
を使用します:
<asp:CheckBox ID="chkLinked" runat="server" AutoPostBack="true"
Checked="false" OnCheckedChanged="chkLinked_CheckedChanged" />
Page_InitでCheckChangedイベントをサブスクライブします。
リピーター項目コマンドからチェックリストのイベントハンドラーを定義し、リピーター項目コマンド内でチェックリスト項目を調べてチェック項目を取得する必要があります。
.aspxページでは、Ajaxとupdatepanelを使用してイベントハンドラーを起動できますが、リピーターの外部でscriptmanageを定義する必要があることに留意してください。
// checklisk checkedchangeイベントハンドラー
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] + ",";
}
}
}