C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: CheckBox + Repeater について


(過去ログ 22 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■9390 / inTopicNo.1)  CheckBox + Repeater について
  
□投稿者/ BCT (8回)-(2007/10/25(Thu) 15:14:53)

分類:[.NET 全般] 

またまたよろしくお願いいたします。。
今回はCheckBox + Repeater についてなのですが、
Textを空の状態で各チェックボックスのチェック状態を取得したいと思っております。

ボタンとRepeaterでは質問にて解決したので、こっちは自力でと思ったのですが、
行き詰ってしまいました。
今のところ、OnCheckedChangedのイベントで値を取得しようかな?と思っていますが、
こちらはボタンと違い、押されたタイミングで必ずしも状態を取得する
必要はありません。


あわせて、OnCheckedChangedのイベントについてのご質問ですが、
このイベントはボタンや、Windowsアプリのように、押したタイミングで
イベントが発生するものではないのでしょうか?


以上よろしくお願いいたします。



void command_Button(Object sender, CommandEventArgs e) {
list1.RemoveAt(Convert.ToInt32(e.CommandArgument));
}

protected void CheckBox1_Changed(object sender, EventArgs e)
{
CheckBox chk = (CheckBox)sender;
//
}

protected void CheckBox2_Changed(object sender, EventArgs e)
{
CheckBox chk = (CheckBox)sender;
//
}

<asp:Repeater id="repeater1" runat="server">
<HeaderTemplate>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<asp:Button ID="Button1" Text="Button"
CommandName="delButton"
CommandArgument="<%# Container.ItemIndex %>"
OnCommand="command_Button" runat="server" />

<asp:CheckBox id="CheckBox1"
OnCheckedChanged="CheckBox1_Changed"
runat="server" />

<asp:CheckBox id="CheckBox2"
OnCheckedChanged="CheckBox2_Changed"
runat="server" />
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</FooterTemplate>
</asp:Repeater>
引用返信 編集キー/
■9404 / inTopicNo.2)  Re[1]: CheckBox + Repeater について
□投稿者/ BCT (9回)-(2007/10/25(Thu) 18:56:29)
まずは簡単なものと思いまして、以下のようなコードを作ってみたのですが・・・
chkが必ずnullになってしまいます。
Page_Loadの中で、Repeaterにデータを渡しております。
(command_OKのイベントが起こるときには、まだCheckBox1がない??)

各チェックボックスのチェック状態を取得する方法として、
以下の方向性はあっておりますでしょうか?
知識がない為にごちゃごちゃですが、よろしくお願いいたします。


void command_OK(Object sender, CommandEventArgs e) {
for (int i = 0; i < repeater1.Items.Count; i++) {
CheckBox chk = (CheckBox)repeater1.FindControl("CheckBox1");
if (chk.Checked) { //nullになっちゃう
Label1.Text = "on";
} else {
Label1.Text = "off";
}
}
}

<asp:Button ID="okButton" Text="OK" OnCommand="command_OK" runat="server" />
<asp:Repeater id="repeater1" runat="server">
<HeaderTemplate>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<asp:CheckBox id="CheckBox1"
OnCheckedChanged="CheckBox1_Changed"
runat="server" />
</td>
<td>
<asp:CheckBox id="CheckBox2"
OnCheckedChanged="CheckBox2_Changed"
runat="server" />
</td>
</ItemTemplate>
<FooterTemplate>
</FooterTemplate>
</asp:Repeater>

<asp:Label id="Label1" runat="server"/>
引用返信 編集キー/
■9406 / inTopicNo.3)  Re[2]: CheckBox + Repeater について
□投稿者/ はつね (308回)-(2007/10/25(Thu) 19:25:58)
はつね さんの Web サイト
No9404 (BCT さん) に返信
> まずは簡単なものと思いまして、以下のようなコードを作ってみたのですが・・・
> chkが必ずnullになってしまいます。
> Page_Loadの中で、Repeaterにデータを渡しております。
> (command_OKのイベントが起こるときには、まだCheckBox1がない??)

CheckBoxをチェックされるたびにPostBackしてたら使い勝手悪いと思います(遅くなるしね)。
チェックはチェックで行ってもらい、何かコマンドボタンクリックなどによりPostBackしてRepeaterのItemを全行しらべていくのが良いかと。

おおざっぱには次のような感じ(VBちっくですまん)
For Each item In Repeterの各行コレクション
  If Ctype(・・・・・・.FindControl("CheckBox1"),CheckBox).Checked Then
        なんか処理
    End If
  If Ctype(・・・・・・.FindControl("CheckBox2"),CheckBox).Checked Then
        なんか処理
    End If
Next

引用返信 編集キー/
■9431 / inTopicNo.4)  Re[3]: CheckBox + Repeater について
□投稿者/ BCT (10回)-(2007/10/26(Fri) 10:10:27)
2007/10/26(Fri) 10:11:45 編集(投稿者)
2007/10/26(Fri) 10:11:36 編集(投稿者)

はつねさん、返信ありがとうございます!

> CheckBoxをチェックされるたびにPostBackしてたら使い勝手悪いと思います(遅くなるしね)。

そうですね。
その方が効率がいいかな?と思って、OKボタンを押したときに取得するようにしてみました。
調べるのはボタンのイベント内でよろしいでしょうか?


VB : For Each item In Repeterの各行コレクション
C# : for (int i = 0; i < repeater1.Items.Count; i++) {
VB : Ctype(・・・・・・.FindControl("CheckBox1"),CheckBox)
C# : (CheckBox)repeater1.FindControl("CheckBox1") ←4行目

これが対応しているのかなぁと思うのですが、"4行目"がnullになってしまい
うまく取得できませんでした。
もしかしたら、調べているタイミングが悪いのかな?とも疑っていますが、
いまのところ判っていません・・・

もうちょっと研究してみます。
引用返信 編集キー/
■9434 / inTopicNo.5)  Re[4]: CheckBox + Repeater について
□投稿者/ はつね (310回)-(2007/10/26(Fri) 13:11:07)
はつね さんの Web サイト
No9431 (BCT さん) に返信
> VB : For Each item In Repeterの各行コレクション
> C# : for (int i = 0; i < repeater1.Items.Count; i++) {
> VB : Ctype(・・・・・・.FindControl("CheckBox1"),CheckBox)
> C# : (CheckBox)repeater1.FindControl("CheckBox1") ←4行目

For Each item In Repeterの各行コレクション
↑ここでitemにRepeaterの一行分をまるごといれて、
その1行に対してFindControlをかけてください。

for (int i = 0; i < repeater1.Items.Count; i++) {
だとすれば、
(CheckBox)repeater1.items(i).FindControl("CheckBox1")
とかでしょうか。


引用返信 編集キー/
■9507 / inTopicNo.6)  Re[5]: CheckBox + Repeater について
□投稿者/ BCT (11回)-(2007/10/29(Mon) 13:34:12)
はつねさん、ありがとうございます。
返信遅くなりまして、すみません。
C#にもforeachがありました。

(当たり前ですが)リピーターへのセットのあとだと、値が失われてしまいます。
ありがとうございました。

void Page_Load(object sender, EventArgs e) {
if (IsPostBack) {
foreach (RepeaterItem rpItem in repeater1.Items) {
CheckBox chk = (CheckBox)rpItem.FindControl("CheckBox1");
if (chk != null) { //多分確認の必要ないと思いますが
Label1.Text += chk.Checked.ToString();
}
}
}
//省略していますが、ここでリピーターに値をセットしています。
}
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -