2012-02-13 5 views
1

最近「DataList」コントロールをUserControlに移動し、ASPXページで参照しました。 DataListには、最初にデータソースによって割り当てられたチェックされたプロパティのチェックボックスが含まれています。ASPチェックボックスの 'checked'プロパティは常にfalseを返します

<asp:DataList ID="dlspec" CssClass="specs" runat="server" GridLines="Vertical" OnItemDataBound="dlspec_ItemDataBound"> 
    <FooterStyle BackColor="#CCCCCC" /> 
    <AlternatingItemStyle CssClass="alt-grey" /> 
    <SelectedItemStyle BackColor="#000099" Font-Bold="True" ForeColor="White" /> 
    <HeaderStyle BackColor="Black" Font-Bold="True" ForeColor="White" /> 
     <ItemTemplate> 
      <table> 
      <tr> 
       <td class="leftcol"> 
       <asp:Label ID="lblDimension" runat="server" Text='<%# Eval("Dimension") %>'></asp:Label>: 
       </td> 
       <td class="ProductDetailData"> 
        <asp:Label ID="lblName" runat="server" Text='<%# Eval("Attribute") %>'></asp:Label> 
       </td> 
       <td class="find-similar"> 
       <asp:CheckBox ID="FindSimilarCheckbox" runat="server" Checked='<%# Eval("CheckBox")=="true"? true:false %>' Text='<%# Eval("AttributeID") %>' Visible='<%# Eval("CheckBoxState")=="0"? true:false %>' /> 
       </td> 
       </tr> 
      </table> 
     </ItemTemplate> 
     </asp:DataList> 

は今、ユーザーコントロールがバインドされているために、「ASPX」のボタンクリックイベントに、私はいくつかのロジックを通過するのチェックボックスの「確認」のプロパティを取得しよう。 私は基本的にusercontrolを見つけて、その中のコントロールをループします。

Control SpecsPanel = FindSimilarPnl.FindControl("Specifications").FindControl("dlspec"); 
foreach (Control ct in SpecsPanel.Controls) 
     GetCheckedAttributes(ct, ref qry); 

私は、ユーザーコントロールにデータリストを移動した後、 『偽「のチェックボックスにチェック」プロパティが常にあることを出てくる』しかし

。任意のアイデアなぜですか?私は愚かな何かが足りないのですか?大幅に任意の考えのアイデアに感謝。。私はあなたがよりよく理解してより多くのコードを追加する必要がある場合、私に教えてください おかげ

+0

私は簡単な方法でコントロールを見つける方法について何かを提案することができます..? – MethodMan

+0

IsPostBackをテストせずに、ロードイベントで値をfalseに初期化していますか? –

+0

@DJKRAZE私が持っているものよりも優れたものは大歓迎です。ありがとうございます – karry

答えて

2

あなたのユースケースに合わせて変更が必要行いなぜこれが起こっている私は答えるために行く...見つけました私自身の質問。 テンプレートのCheckBox IDは "FindSimilarCheckBox"で、データバインド時に名前が変更されます。したがって、ポストバックが発生すると、サーバーはすべてのチェックボックスのIDを「FindSimilarCheckBox」として返し、すべてのチェックされたプロパティがfalseになります。私はユーザーコントロールを再度データバインドしなければならなかったし、今回はポストバック操作であるかどうか、チェックボックスの一意のIDがRequest.Formコレクションに存在するかどうかをチェックして、ChkboxのCheckedプロパティを設定する条件を入れなければならなかった。このようなもの:

protected void dlspec_ItemDataBound(object sender, DataListItemEventArgs e) 
{ 
    var ck = e.Item.FindControl("FindSimilarCheckbox") as CheckBox; 
      if (ck != null) 
      { 
       ck.ID = ck.Text; 
       ck.Text = ""; 
       //EDIT: Karthik - Since we moved the Specifications in to user control, check if this a postback , then check to see the CheckBox state on the form while posting back 
       if(IsPostBack && Request.Form[ck.UniqueID] != null) 
       { 
        ck.Checked = true; 
       } 
} 

私の問題は今解決されました。この回答が、私の問題の原因を理解するのに役立ちます。私は詳細を与える必要がある場合は私に教えてください。

2

ここであなたが...

public void FindAllCheckedBoxes(Control ctrl) 
{ 
    if (ctrl != null) 
    { 
     foreach (Control c in ctrl.Controls) 
     { 
      if (c is CheckBox) 
      { 
       ((CheckBox)c).Checked = false; 
       //or mess around with the code to do what ever it is you want.. 
      } 
      //uncomment if you need to add recurisve call FindAllCheckedBoxes(c); 
     } 
    } 
} 

用法作成することができます方法です:FindAllCheckedBoxes(FindSimilarCheckboxを);

Webページ上でこれを実行する必要がある場合は、同様に次のコードを使用することができ

Protected void SetCheckBoxState(ControlCollection controls) 
{ 
    Foreach (Control c in controls) 
    { 
     If (c is System.Web.UI.WebControls.CheckBox)//change to make it CheckBox 
     { 
      CheckBox cb = c as CheckBox; 
      cb.Checked = false; // or true what ever you need to do 
     } 
     Else if (c.controls.Count > 0) 
     { 
      SetCheckBoxState(c.Controls) 
     } 
    } 
} 
+0

時間をとってくれてありがとう...実際には、私は "GetCheckedAttributes"メソッドで本来的に何をしていたのでしょうか? – karry

+0

問題はありません。私はこれを何度もやりました。一度十分にしたら、ほとんど自然になります。この解決策が役立つなら、投票してください。 – MethodMan

関連する問題