-1

数値の配列をループして、それらが関連付けられているチェックボックスに一致させ、そのボックスにチェックマークを付けようとしています。

私のチェックボックスは次のように設定されています:

<input type="checkbox" runat="server" id="someID" name="somename" value="1234" />

ページが読み込まれるときの私のコードは現在次のようになっています。

foreach (string interest in interests_Var){
   foreach (var c in Page.Controls)
   {
   }
}

interests_Varは、異なる数値を含む私の配列です。それらの 1 つが であると仮定します1234。ページ コントロールをループしているときに、コントロールの値を自分の数値と比較したいと考えています。それが私の番号と等しい場合は、属性を適用したいと思いますchecked="checked"。使用しているコントロールの ID を見つけ、その ID を使用して新しい属性を追加する必要があると想定しています。cまたは、変数を使用して属性を追加する方法はありますか?

私はこの設定に固執しているわけではないので、より良い方法を知っていれば、私はすべて耳を傾けます. 助けと提案をありがとう。

ありがとう

良い提案がたくさん。これらを少し試してみます。別のプロジェクトで横道にそれました。

解決済み

わかりましたので、これが私の終了コードです。助けてくれてありがとうジェームズ。

foreach (string interest in interests_Var)
{
       foreach (var chkCtrl in Panel1.Controls.OfType<CheckBox>())
       {
           if (chkCtrl.Attributes["value"].ToString() == interest.ToString())
          {
               chkCtrl.Checked = true;
          }
     }
}
4

5 に答える 5

3

複数のチェックボックスを使用していて、複数の値が保存されていると思います。入力コントロールに単に runat="server" 属性を割り当てるのではなく、Asp:Checkbox を使用することをお勧めします。

次のようなデータソースがあるとします。

public class MyClass
{
   public String Name {get;set;}
   public int Number {get;set;}
}

このサーバー コントロールを使用します。

<asp:CheckBoxList ID="cblMyList" runat="server" DataTextField="Name" DataValueField="Number">

Nameプロパティは表示文字列として使用されます。ここで、はNumber実際には HTTP ポストの一部である値です。

OnInit-Eventhandler では、おそらく次のようにバインドします。

List<MyClass> values = //...
cblMyList.DataSource = values;
cblMyList.DataBind();
foreach (ListItem item in this.cblMyList.Items)
{
   if(interests.Contains(item.Value))
   {
    item.Selected = true;
   }
}

選択したすべての値を取得するには、次のコードを使用します。

List<int> selectedValues = cblMyList.Items.Cast<ListItem>().Where(x => x.Selected).Select(x => int.Parse(x.Value)).ToList();

DataValueField のデータ型として int を選択しました。もちろん、他の型を使用することもできintます。選択したデータ型に置き換えるだけです。

于 2012-04-05T16:11:01.243 に答える
2

CheckBox コントロールをPanelまたはに配置PlaceHolderすると、コントロール階層をトラバースするための再帰的ロジックについて心配する必要がなくなるため、最適です。

<asp:Panel ID="Panel1" runat="server">
    <asp:CheckBox ID="CheckBox1" runat="server" Text="Testing" value="1234" />
    ...
</asp:Panel>

コントロールをコンテナに入れることで、その要素の子コントロールをループすることができます:

foreach (string interest in interests_Var)
{
    foreach (var chkCtrl in Panel1.Controls.OfType<CheckBox>())
    {
        chkCtrl.Checked = chkCtrl.Attributes["value"].Contains(interest.ToString());
    }
}

が であると仮定するinterests_Varと、ListLINQ を使用してそれを行うより短い方法を次に示します。

interests_Var.ForEach(str => plcInvoiceDetail.Controls.OfType<CheckBox>()
    .Select(chk => chk.Checked = chk.Attributes["value"] == str));
于 2012-04-05T16:12:15.603 に答える
2

チェック ボックスに "interest" + のような ID を割り当てると、チェック ボックスを興味で検索するためにvalue使用できます。FindControl

foreach (string interest in interests_Var)
{
    HtmlInputCheckBox checkBox = (HtmlInputCheckBox)this.FindControl("interest" + interest);
    if (checkBox == null)
        throw new InvalidOperationException("Missing check box for " + interest);
    checkBox.Checked = true;
}
于 2012-04-05T16:09:02.657 に答える
1

これが Web フォーム アプリであり、説明した方法で完全に設定されていない場合は、代わりにマークアップを次のように変更できます。

<asp:CheckBox id="someID" runat="server" />

次に、.designer.cs ファイルで定義されます。そうすれば、次のようにコードで簡単に参照できます。

if ( someID.Checked )
{
    // do whatever
}

動的に追加されるコントロールである場合、FindControl()Visual Studio はそれを .designer.cs ファイルに追加しないため、他の人が言及した方法を使用する必要があることに注意してください。

于 2012-04-05T16:14:05.720 に答える
0

次の記事で説明されているように、コントロールの配列を使用でき
ます
。 com/Articles/21159/How-to-Create-a-Control-Array-in-C
コントロールから値をトラバースする場合は、以下を参考にしてください:-
コントロールの配列を aspx ページに追加する

ことをお勧めします。 HTML < input type="checkbox"> の代わりに ASP.NET チェックボックスを使用します。

于 2012-04-05T16:31:45.843 に答える