10

私は、リピーターに一連のチェックボックスを生成させたいと思っています。

<tr><td><input type="checkbox" name="t" value="11cbf4deb87" /> <input type="checkbox" name="a" value="33cbf4deb87" />stackoverflow.com</td></tr>
<tr><td><input type="checkbox" name="t" value="11cbf4deb88" /> <input type="checkbox" name="a" value="33cbf4deb87" />microsoft.com</td></tr>
<tr><td><input type="checkbox" name="t" value="11cd3f33a89" /> <input type="checkbox" name="a" value="33cbf4deb87" />gmail.com</td></tr>
<tr><td><input type="checkbox" name="t" value="1138fecd337" /> <input type="checkbox" name="a" value="33cbf4deb87" />youporn.com</td></tr>
<tr><td><input type="checkbox" name="t" value="11009efdacc" /> <input type="checkbox" name="a" value="33bf4deb87" />fantasti.cc</td></tr>

質問 1: リピーターの実行中に各チェックボックスを個別に参照して、一意の値を設定するにはどうすればよいですか?

次のようなものでデータバインドしますか?

<itemtemplate>
   <tr>
      <td>
         <input type="checkbox" name="t" 
            value="<%# ((Item)Container.DataItem).TangoUniquifier %>" />
         <input type="checkbox" name="a" 
            value="<%# ((Item)Container.DataItem).AlphaUniquifier %>" />
         <%# ((Item)Container.DataItem).SiteName %>
      </td>
   </tr>
</itemtemplate>

または、OnItemDataBound で何らかの方法で設定することになっていますか?

<asp:repeater id="ItemsRepeater" 
      OnItemDataBound="ItemsRepeater_OnItemDataBound" runat="server">
   ...
   <itemtemplate>
      <tr>
         <td>
            <input id="chkTango" type="checkbox" name="t" runat="server" />
            <input id="chkAlpha" type="checkbox" name="a" runat="server" />
            <%# ((Item)Container.DataItem).SiteName %>
         </td>
      </tr>
   </itemtemplate>
   ...
</asp:repeater>


protected void ItemsRepeater_OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
   // if the data bound item is an item or alternating item (not the header etc)
   if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
   {
      // get the associated item
      Item item = (Item)e.Item.DataItem;

      //???
      this.chkTango.Value = item.TangoUniquifier;
      this.chkAlpha.Value = item.AlphaUniquifier;
   }
}

しかし、コード ビハインドで参照することになっている場合、コード ビハインドでどのように参照すればよいでしょうか? コントロールの (サーバー側の) id プロパティを使用して参照することになっています<INPUT>か? サーバー側のコントロールの ID は、クライアントに存在する ID と同じではないことに気付きました。

または、「t」という名前の INPUT コントロールと「a」という名前の別の INPUT コントロールを見つける必要がある場合に、何かをする必要がありますか? また、入力値を設定できる CheckBox とはどのようなコントロールでしょうか?

protected void ItemsRepeater_OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
   // if the data bound item is an item or alternating item (not the header etc)
   if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
   {
      // get the associated item
      Item item = (Item)e.Item.DataItem;

      CheckBox chkTango = (CheckBox)e.Item.FindControl("chkTango");
      chkTango.Value = item.TangoUniquifier;

      CheckBox chkAlpha = (CheckBox)e.Item.FindControl("chkAlpha");
      chkAlpha.Value = item.AlphaUniquifier;
   }
}

質問 2: ユーザーが後で [送信] をクリックしたときに、チェックされているすべてのチェックボックス、またはより具体的にはそれらの値を見つけるにはどうすればよいですか?

FindControl を使用する必要がありますか?

protected void DoStuffWithLinks_Click(object sender, EventArgs e)
{
   // loop through the repeater items
   foreach (RepeaterItem repeaterItem in actionItemRepeater.Items)
   {
      Item item = repeaterItem.DataItem as Item;

      // grab the checkboxes
      CheckBox chkAlpha = (CheckBox)repeaterItem.FindControl("chkAlpha");
      CheckBox chkTango = (CheckBox)repeaterItem.FindControl("chkTango");

      if (chkAlpha.Checked)
      {          
         item.DoAlphaStuff(chkAlpha.Name);
      }

      if (chkTango.Checked)
      {
         item.DoTangoStuff(chkTango.Name);
      }
   }
}

リピーター項目の DataItem はまだクリック イベント ハンドラーにありますか?

4

4 に答える 4

13

入力コントロール runat=server を作成する代わりにサーバー コントロールを使用する

 <asp:CheckBox id="whatever" runat="Server" />

ItemDataBound に値を設定するときは、FindControl を使用します

CheckBox checkBox = (CheckBox)e.Item.FindControl("whatever");
checkBox.Checked = true;

項目を取得するときは、foreach コンストラクト内の項目から FindControl も使用します。また、データバインド方法によっては、ポストバック後に DataItem が存在しなくなる場合があります。

foreach (RepeaterItem item in myRepeater.Items)
{
    if (item.ItemType == ListItemType.Item 
        || item.ItemType == ListItemType.AlternatingItem) 
    { 
        CheckBox checkBox = (CheckBox)item.FindControl("whatever");
        if (checkBox.Checked)
        { /* do something */ }
    }
}
  • as多くの人は、演算子 withを使用して「安全にキャスト」しようとしFindControl()ます。フォーム上のコントロール名を変更すると、開発エラーを黙って無視し、追跡が難しくなる可能性があるため、私はそれが好きではありません。asコントロールがそこにあることが保証されていない場合にのみ、演算子を使用しようとします。

更新: CheckBox とは? レンダリングされたhtmlでは、これらすべてのチェックボックス名が次のようになります

ctl00_cph0_ParentContainer_MyRepeater_ctl01_MyCheckbox
ctl00_cph0_ParentContainer_MyRepeater_ctl02_MyCheckbox
ctl00_cph0_ParentContainer_MyRepeater_ctl03_MyCheckbox

foreach item.FindControl() がそれらを取得するため、名前が何であるかは気にしません。名前については何も想定しないでください。ただし、foreach を介して反復する場合、通常、それを参照して何かに戻す方法が必要です。ほとんどの場合、これは、各 CheckBox の横に asp:HiddenField コントロールを配置して、正しいエンティティと照合するための識別子を保持することによっても行われます。

セキュリティ上の注意: 非表示フィールドは JavaScript で変更できるため、非表示フィールドの使用にはセキュリティ上の問題があります。この値は、フォームが送信される前にユーザーによって変更されている可能性があることに常に注意してください。

于 2008-10-07T20:40:46.120 に答える
4

CheckBoxList コントロールを使用する方が簡単な場合があります。

単純なケースでは、DataTextVield と DataValueField をデータソースから取得した名前と値に設定し (データソースからデータを取り込むと仮定)、それをバインドして項目を作成します。

おそらく、リピーターでチェックボックスを作成するよりも、あなたの作業は少なくなります。

于 2008-10-07T19:31:25.810 に答える
2

隠しフィールドを処理する方法の特定のコードは次のとおりです。

マークアップ:

<asp:HiddenField ID="repeaterhidden" Value='<%# DataBinder.Eval(Container.DataItem, "value")%>' runat="server" >

C#:

{{

HiddenField hiddenField = (HiddenField)item.FindControl(repeaterStringhidden);

{ /* do something with hiddenField.Value */

}

于 2009-09-01T22:06:19.053 に答える
1

この KB が最良の答えを与えてくれたと思います。

http://msdn.microsoft.com/en-us/library/1d04y8ss.aspx

私自身の運の悪さに、これは .net 4.0 バージョンでのみ利用できるようです (そして、私はまだ 3.5 SP1 で立ち往生しています)。

引用(太字は私のものです):

コントロールが、コントロールの繰り返しインスタンスを生成するデータ バインド コントロール内にある場合、ASP.NET は、コントロールのインスタンスごとに UniqueID 値と ClientID 値を生成します。UniqueID 値は、名前付けコンテナーの UniqueID 値、コントロールの ID 値、および連番を組み合わせることによって生成されます。これは、DataList、Repeater、GridView、および ListView コントロールなどのコントロールに当てはまります。

ClientIDMode プロパティが AutoID に設定されている場合、ASP.NET は同様の方法で ClientID 値を生成します。これにより、クライアント スクリプトでコントロールを参照することが難しくなる可能性があります。これは、通常、使用される連続番号の値を予測できないためです。クライアント スクリプトからデータ バインド コントロールにアクセスする場合は、ClientIDMode プロパティを Predictable に設定できます。これにより、ClientID 値がどうなるかを予測しやすくなります。

ClientIDMode を Predictable に設定すると、ClientIDRowSuffixDataKeys プロパティを一意のデータ フィールドの名前 (データベース テーブルの主キーなど) に設定することもできます。これにより、ASP.NET は、データ キーの値を予測できる場合に、クライアント スクリプトでの予測と参照が容易になるクライアント ID を生成します。

したがって、バージョン 3.5 では、非表示フィールドを使用して実行しています。

    foreach (RepeaterItem item in rptClientes.Items)
    {
        Panel pnl = (Panel)item.FindControl("divCliente");
        Control c = pnl.FindControl("hdnID");
        if (c is HiddenField)
        {
            if (((HiddenField)c).Value == hdnClienteNome.Value)
                pnl.BackColor = System.Drawing.Color.Beige;
        }
    }
于 2012-03-16T12:19:48.257 に答える