2012-04-16 9 views
2

に動的に生成されたチェックボックスの一覧からチェックボックスの値を取得する方法:一度、ユーザーが作成した私は動的にASPに追加されchekboxesのシリーズを作成していたWebフォーム内でasp.net

//Generates the List of Entities that may be shared 
     protected void GenerateEntityList(string agencyId, string agencyName) 
     { 
      var selectedAgency = UserFactory.GetAgencyAndSharedDataById(Convert.ToInt64(agencyId)); 

      entityContainer.Controls.Clear(); 

      //builds the entity list based upon entities in DB 
      var currentEntities = UserFactory.GetEntityList(); 
      //add checkboxes 
      entityContainer.Controls.Add(new LiteralControl("<input type='checkbox' id='selectAllCB' value='All'>Select All<br/><br/>")); 
      foreach (var item in currentEntities) 
      { 
       CheckBox entityCheckBox = new CheckBox(); 
       int currentItem = item.EntityTypeId.GetValueOrDefault(0); 
       entityCheckBox.Text = item.EntityName.ToString(); 

       entityCheckBox.CssClass = "am_Checkbox"; 
       entityContainer.Controls.Add(entityCheckBox); 
       entityContainer.Controls.Add(new LiteralControl("<br/><br/>")); 

       //mark checkboxes as checked if currently stored in the database 
       if (selectedAgency.FirstOrDefault().SecurityDataShares != null && selectedAgency.FirstOrDefault().SecurityDataShares.Count > 0) 
       { 
        foreach (var ce in selectedAgency.FirstOrDefault().SecurityDataShares) 
        { 
         if (ce.EntityId == item.EntityId) 
         { 
          entityCheckBox.Checked = true; 
         } 
        } 
       } 
      } 

プレースホルダ選択肢を作成または削除する機能があります。私はデータベースに戻ってそれらを挿入することができますので、私は戻って/チェックボックスから値を収集したいと思います更新をクリックします。

//get the text value of every checkbox 
protected void updateEnties() 
{ 
    string receivingAgency = ReceivingAgencyID; 
    long contributingAgency = QueryID; 

    List<string> cbValues = new List<string>(); 
    foreach (CheckBox currentItem in entityContainer.Controls) 
    { 
     cbValues.Add(currentItem.Text); 
    } 
} 

は、しかし、私は私はどちらか私は間違ってコントロールを呼び出していますか、それはポストバックのために破壊されていると信じてしまう私は戻って何かを得ていないのですコレクションを反復処理しようとすると。 これらの要素をプレースホルダに書き込む代わりに、リストボックスコントロールのような別のコントロールを使用する必要がありますか?

誰かがチェックボックスの値を取得する方法に関するガイダンスを私に提供できますか?

答えて

4

考え方は2つあります。 1つは、初期ビュー用に作成されたコントロール階層を再作成して、ページがビューステートとフォーム値をコントロールツリーに復元できるようにする必要があること、または2つ、ローテクソリューションで行え、値をフォームコレクションから取得します。

私は個人的には、オプション2のように、扱いが比較的簡単で、すでにLiteralControlで手動でHTMLを作成しているようです。単にあなたの手で作成した入力タグの間で共有されてname属性(簡略化のためにここに示す例では、これはあなたが何をするか、おそらくではありません)を提供:

entityContainer.Controls.Add(new LiteralControl("<input type='checkbox' name='mySharedName' />"); 

その後、それはこのような単純なある値を取得します:

var selectedValues = Request.Form["mySharedName"]; 
// This is now a comma separated list of values that was checked 

次に、コントロールツリーの状態について心配する必要はありません。

+0

これは問題なく動作するようですが、リクエストしてください。フォームは選択されたフォーム要素の "on"の値だけを返す方法を提案していますか?例Checkbox fooがチェックされています。配列にfooが表示されるように 'var selectedValues'を取得するにはどうすればいいですか? – rlcrews

+0

削除のプロセス。 Z項目のうち、Xがチェックされていることがわかっている場合、(Z - X)はチェックされません。しかし、このプロセスは、どのアイテムがチェックされたかを知りたいときには効果的です。 – Tejs

+0

ああ、私の問題です。私のリストは、linqで動的に生成され、アルファベット順にソートされています。必ずしもDBや固定値に格納されているわけではありません。実際に両方を派生させる必要があるので、正しいチェック要素をキャプチャするように参照を戻すことができます。 – rlcrews

-1

これは、OOの原則を使用して実装する必要がある種類のものです。この場合、独自のCheckBoxCollection(適切なインタフェース/クラスから継承したもの)を構築するべきでしょう。コードを単純化し、コンパクト化と拡張性を向上させます。

実装の詳細の1つは、記述した状況を処理することです:viewstate/session/whateverに追加するクリックハンドラをスローし、テストハーネス/ユーザがチェック/チェックを外したものを見ることができるはずです一見。

もう1つのクイックポイント:特にCSSを既に使用している場合は、< br/>タグをレイアウト用に使用しないでください。 checkboxenは、必要な表示タイプ(この場合はブロック?)であることを確認してから、すでにコントロールを装飾しているCSSクラスで設定します。

tl; dr:コードで例を上げる時間がありませんが、基本的な考え方ではCheckBoxCollection()にCheckBox()を保存する必要があります。アクションからアクションへ状態をチェックしました。

+0

-1:犯行はありませんが、これは重大な過度の攻撃のようです。 –

+0


」タグのご提案ありがとうございました。私はそれらを削除し、レイアウトをサポートするようにCSSを更新しました。私がクリックハンドラを使って各クリックでビューステート/セッションを確認して更新したくないので、あなたの提案は私が必要以上に多かった。 – rlcrews

+0

@JamesJohnsonそれは本当にそうではありません - それを行うには「正しい」方法です。私のような苦労した人々を時々作り出す理由の一部は、そこではジャンクコードを投げ捨て、それを永遠にプロダクションに残す人が増えているということです。 適切に分解されたソリューションは、幸せな解決策です。特にカスタマイズされたものがあれば、物事が適切に抽象化されていれば、あらゆる方法で管理する方が簡単です。 あなたは実際には何とかそれを反駁せずに私の答えをdownvoteに合って見てうれしい;非常に成熟しています。 – Tonweight

2

代わりにCheckBoxListを使用して、結果セットをバインドするだけで、はるかに簡単に使えるように思えます。それは、実際には動的コンテンツの必要性を無駄にするでしょう。

<asp:CheckBoxList ID="CheckList1" runat="server" DataTextField="TextColumn" DataValueField="ValueColumn" ...> 

これがオプションでない場合は、各ポストバック後にコントロールを再作成する必要があります。これを行うにはいくつかの方法があります。

簡単な方法は、DynamicControlsPlaceHolderコントロールをチェックしてください。これは、舞台裏で永続的な動的コンテンツを処理する便利な小さなコントロールです。私はこのオプションを提案します。動的に作成されたコンテンツからすべての苦労を取り除くためです。

OnInit時の制御(複数可)を再作成手動方法。ポストバック後に制御を再作成した後

protected override void OnInit(EventArgs e) 
{ 
    var chk = new CheckBox { ID = "chkBox1" };     
    PlaceHolder1.Controls.Add(chk); 

    base.OnInit(e); 
}  

、あなたがこのような値にアクセスすることができるはずです:ちょうどあなたがViewStateが選択を再作成することができるようにコントロールに同じIDを割り当てる作る

foreach (CheckBox chk in PlaceHolder1.Controls.OfType<CheckBox>()) 
{ 
    if (chk.Checked) 
    { 

    }  
} 
+0

申し訳ありませんが、これは非常に直接見えるがここで何かが不足しているが、foreachはクリックイベントの正しい方法に行くだろうか?だから私はリストを反復することができますか?上記のforeachは、別のforeach文の中に入れ子になっているはずです。上記のコードは、選択されたプロパティを持つオブジェクトアイテムを参照していますか? – rlcrews

+0

申し訳ありません、この例の一部を更新していません。 chk.Checkedする必要があります。私の最初の例では、CheckBoxListを使用していました。私は自分のandswerを更新しましたので、今はもっと明確にすべきです:) –

0

お寄せいただきありがとうございます。これがどのように実装されていたかに基づいて、私はこのソリューションのための思考パスを私に送ってきたので、Tejsに答えを与えました。このプロジェクトでは、リストを作成し、チェックされた要素を検証していたため、チェックボックスとチェックボックスのリストコントロールを使用する必要がありました。課題は、asp.netがチェックボックスコントロールを生成する方法と、コントロールに属性(名前、値など)を挿入できるようにすることの制限にあります。

コード生成チェックボックスから値を取得するには、次:私は非表示の入力フィールドを追加したのaspxファイル内

とにrunat =サーバータグを割り当て

<input id="cbEntityList" type="hidden" runat="server" value="" /> 

Tejsソリューションは、これと同様であったが、私はのために隠しフィールドを追加する考えを好きではなかったですそれぞれのチェックボックスはページ内の多くの要素のように見えます。

次に、チェックボックスのコード生成ピースを変更して、IDとして自分のオブジェクトから一意の識別子を含めるようにしました。これは私がJavaScriptで取得することができる何か/ jQueryのを持っているかに私を可能にするので、IDは

は、だから私は、チェックボックスを建設するforeach文の中に、私は次の行を追加した名前の属性としてHTML内でレンダリングされる

entityCheckBox.ID = item.EntityId.ToString(); 

最後に、jQueryを使用してチェックボックスのページを反復し、チェックされた項目のみの文字列配列を返します。

これは、どのチェックボックスが選択されたかに基づいて(0,1,2,3,4)などの値を隠しフィールドに戻します。

$('#btnUpdateEntities').click(function (event) { 
     var fields; 
     $(':checkbox:checked').each(function() { 
      var txt = $("input[name='cbEntityList']"); 

      fields = ($(':checkbox:checked').map(function() { 
       return this.name; 
      }).get().join(",")); 

      $(txt).val(fields); 
     }); 
    }); 

私はその後のように後ろの私のコードの値の配列にアクセスできます。これは任意の興味を助け

string voo = cbEntityList.Value; 

希望。

関連する問題