2013-07-04 5 views
6

からコマンドを呼び出すときに、リピータの項目のチェックボックスの値を取得するチェックボックスのリストをRepeaterコントロールを次があります:はフッター

<asp:Repeater ID="rptItemList" runat="server"> 
<HeaderTemplate> 
</HeaderTemplate> 
<ItemTemplate> 
    <div> 
     <asp:CheckBox ID="chkItem" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "ItemName").ToString() %>' /> 
     <asp:HiddenField ID="hdItem" runat="server" Value='<%# DataBinder.Eval(Container.DataItem, "ItemId").ToString() %>' /> 
    </div> 
</ItemTemplate> 
<FooterTemplate> 
    <asp:LinkButton ID="lbtnDel" runat="server" Text="Delete" OnClick="lbtnDel_Click" OnClientClick="return confirm('Are you sure you want to delete selected items from this list?')"></asp:LinkButton> 
</FooterTemplate> 
</asp:Repeater> 

とlbtnDel_Clickイベントを処理するコードを次のバックを:

protected void lbtnDel_Click(object sender, EventArgs e) 
    { 
     foreach (RepeaterItem ri in rptItemList.Items) 
     { 
      CheckBox chk = (CheckBox)ri.FindControl("chkItem"); 
      HiddenField hd = (HiddenField)ri.FindControl("hdItem"); 

      if (chk.Checked) 
      { 
       var tc = new ItemController(); 
       tc.DeleteItem(Convert.ToInt32(hd.Value)); 
      } 
     } 
     Response.Redirect(DotNetNuke.Common.Globals.NavigateURL()); 
    } 

私が選択した場合チェックボックスをオンにして[削除]をクリックすると、コードはチェックボックスを見つけますが、チェックボックスをオフにしてアイテムを削除しません。

アイデア?

+0

1を参照してください。私は値を格納するためにリピータの隠しフィールドを使用することは考えていませんでした。もし私がもっと高く投票することができれば、私はそうするでしょう。 –

答えて

10

100%ではありませんが、すべてのページの読み込みでデータバインディングを行っていますか? !IsPostBack このような問題が発生するたびに、ページロードによってリピーターが現在の状態を再バインドしてすべての状態を終了させたためです。

+0

Lol、スクールボーイエラー。うん、データバインドはページのロード時に実行され、状態を強制終了していた。ありがとうございました – HuwD

+0

** + 1 **良いキャッチ –

0

更新パネル内にリピーターがありました。だから、RepeaterItemでのみ制御が

DataBoundLiteralControl

だったこれが私の仕事:

foreach (RepeaterItem item in rpLists.Items) 
       { 

        if (item.Controls.Count > 0) 
        { 
         DataBoundLiteralControl dbLt = item.Controls[0] as DataBoundLiteralControl; 
         if (dbLt != null) 
         { 
          var controlCollection = this.ParseControl(dbLt.Text); 
          HtmlInputCheckBox cbInclude = (HtmlInputCheckBox) FindControl(controlCollection, "cbIncludeList"); 
          if (cbInclude != null) 
          { 
           if (cbInclude.Checked) 
           { 
            //your code here 
           } 
          } 
         } 
        } 
       } 

を、私は、にFindControlのためにページのその一部ではない場合、それは動作しないについて何かを再帰的なメソッドを作成する必要がありました。 シュラグ はここ素晴らしさのためASP.Net FindControl is not working - How come?

private Control FindControl(Control parent, string id) 
     { 
      if (parent.ID == id) 
       return parent; 

      if (parent.HasControls()) 
      { 
       foreach (Control childControl in parent.Controls) 
       { 

        if (childControl.ID == id) 
         return childControl; 

        if (childControl.HasControls()) 
         return FindControl(childControl, id); 
       } 

      } 

      return null; 
     } 
関連する問題