チェックボックスがオフの場合、asp:checkboxのOnCheckedChangedイベントハンドラーは起動しません

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

  •  05-07-2019
  •  | 
  •  

質問

リピーターがあります。リピーターの各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] + ",";
            }
        }
    }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top