0

私はプログラミングに不慣れで、問題があります。aspxページに2つのボタンがあります。両方のボタンにはrunat="server"プロパティがあり、<form runat="server" >タグ内にあります

aspxコード

<form id="form1" runat="server">
<asp:Button ID="btnGetData"  runat="server" onclick="btnGetData_Click" />
<asp:Button ID="btnShow" Text="Send" runat="server" onclick="btnShow_Click" />
</form>

btnGetData

 protected void btnGetData_Click(object sender, EventArgs e)
 {
            headlines = masg.Split('*');
            //Response.Write(headlines.Length);
            cb = new CheckBox[headlines.Length];

            for (int i = 0; i < headlines.Length; i++)
            {
                cb[i] = new CheckBox();

                cb[i].Text = headlines[i];
                Literal br = new Literal();
                br.Text = "<br/>";
                Form.Controls.Add(cb[i]);
                Form.Controls.Add(br);
            }

 }     

[データの取得]ボタンをクリックすると、関連するテキストとともに複数のチェックボックスが生成されます。

いくつかのチェックボックスをクリックしてから、[表示]ボタンをクリックします。これは、正しく機能する場合は、選択したチェックボックスのテキストを1つの文字列に結合して表示する必要があります。

btnShow

protected void btnShow_Click(object sender, EventArgs e)
{



            for (int i = 0; i < headlines.Length; i++)
            {
                if (cb[i].Checked)
                    newmsg += cb[i].Text + '*';
            }
            Response.Write("<BR><BR><BR>" + newmsg);

}

しかし、GetDataボタンをクリックすると、HTTPが統計情報を持たないため、チェックボックスが保持されないため、チェックボックスが失われます。Viewstateについて読みましたが、大量のデータが含まれる場合は処理が大幅に遅延するため、お勧めしません。

別の方法は、Sessionを使用することです。IsPostBackここでページプロパティの使用はありますか?

選択したチェックボックスを1つのボタン(GetData)クリックから他のボタン(つまり[表示]ボタン)に渡すセッションを実装する方法をガイドしてください。

4

1 に答える 1

1

あなたが遭遇したことはかなり一般的な問題なので、リピーターを使用することをお勧めします。例:

<asp:Repeater id="rptCheckboxes" runat="server">
<ItemTemplate>
  <asp:CheckBox ID="cbxMessage" runat="server" Text="<%# Container.DataItem %>" />
  <br />
</ItemTemplate>

</asp:Repeater>

そしてコードで:

protected void btnGetData_Click(object sender, EventArgs e)
{
   headlines = masg.Split('*');
   rptCheckboxes.DataSource = headlines;
   rptCheckboxes.DataBind();
}     

protected void btnShow_Click(object sender, EventArgs e)
{
   string newmsg = new string();
   foreach(RepeaterItem currentControl in rptCheckboxes.Items)
   {
       CheckBox currentCheckBox = currentControl.FindControl("cbxMessage");

       if(currentCheckBox != null && currentCheckBox.Checked)
       {
             newmsg += cb[i].Text + '*';
       }
   }

   //This is a bad idea here, but we'll keep it for now
   Response.Write("<BR><BR><BR>" + newmsg);
}

これは概念実証であり、機能するかどうかはテストされていないことに注意してください。ここでの基本は、ポストバック中に、aspxページとその投稿用に作成したロジックに基づいてすべてのコントロールがリセットされることです。ポストバックにコントロールを動的に追加しないでください。実際には、ViewStateが破損/無効になるリスクを最小限に抑えるために、プレースホルダーを使用して追加する必要があります。

于 2012-12-10T14:28:19.750 に答える