0

私のコードには CheckboxList があり、その項目を動的に追加します! 私が望むのは、テキストを保存することですが、次のフォームで必要になるため、セッションでチェックされた CheckBoxes からのみです!

だから私はいくつかのテキストを作りたかったのですが、ご覧のように、チェックされたチェックボックスからのテキストを name のリストに保存しますが myche、ボタンを押してこのリストの最初の項目を表示すると、このコードlblProba.Text = myche[0];は例外 'Index out of範囲'。私のリストは空のようです。

public partial class FormEGN : System.Web.UI.Page
{
    string mynewstring;
   //List<List<string>> mycheckedList = new List<List<string>>();
    List<string> myche = new List<string>();
    CheckBoxList mycheckbox = new CheckBoxList();
    protected void Page_Load(object sender, EventArgs e)
    {
        mynewstring = (string)Session["id2"];


        if(!IsPostBack)
        {
            ddlNumberTourists.Items.Add("1");
            ddlNumberTourists.Items.Add("2");
            ddlNumberTourists.Items.Add("3");
        }
    }

    protected void btnProba_Click(object sender, EventArgs e)
    {
        lblProba.Text = myche[0];
    }

    protected void btnReserve_Click(object sender, EventArgs e)
    { 
        string num =Request.QueryString["ExcursionID"];
        Response.Redirect(String.Format("ClintsInformation.aspx?Excursiondate_ID={0}",num));

    }

    protected void ddlNumberTourists_SelectedIndexChanged(object sender, EventArgs e)
    {

        int numTourists = Convert.ToInt32(ddlNumberTourists.SelectedItem.Text);
        for (int i = 0; i < numTourists; i++)
        {

            Label myLabel = new Label();
            myLabel.ID = "lblAccomodation" + (i + 1).ToString();
            myLabel.Text = "Настаняване Турист" + (i + 1).ToString();
            Page.FindControl("form1").Controls.Add(myLabel);
            DropDownList myDropDownList = new DropDownList();
            myDropDownList.ID = "ddlTourist" + i.ToString();
            Page.FindControl("form1").Controls.Add(myDropDownList);
            Page.FindControl("form1").Controls.Add(new LiteralControl("<br />"));

            string connectionString = "Server=localhost\\SQLEXPRESS;Database=EXCURSIONSDATABASE;Trusted_Connection=true";
            string query =
      "SELECT Extra_Charge_ID, Excursion_ID, Amout, Extra_Charge_Description FROM EXTRA_CHARGES WHERE Excursion_ID=" + mynewstring;
            SqlConnection conn = new SqlConnection(connectionString);
            SqlCommand cmd = new SqlCommand(query, conn);

            try
            {
                conn.Open();
                SqlDataReader rd = cmd.ExecuteReader();
                int s = 0;

                while (rd.Read())
                {
                    mycheckbox.ID = "chkblextracharge" + i.ToString() + s.ToString();
                    mycheckbox.Items.Add(rd["Extra_Charge_Description"].ToString());
                    Page.FindControl("form1").Controls.Add(mycheckbox);

                    if (mycheckbox.Items[s].Selected == true)
                    {  
                        myche.Add(mycheckbox.Items[s].Text);
                    }
                    s++;
                }

            }//End of try

            catch (Exception ex)
            { }
            Session["chk"] = myche;

        }//end of for
    }
}
4

2 に答える 2

0

問題はmyche、ボタンクリックイベントハンドラーがトリガーされたときにアイテムが含まれていないことです。

リストに実際にアイテムを追加するddlNumberTourists_SelectedIndexChangedのは、にある唯一の場所です。このイベントハンドラーはポストバックでは呼び出されないmycheため、空です。

mycheポストバック間で値を保持する場合は、ビューステートの値を保存してロードする必要があります。

これを正しく機能させる方法を理解したい場合は、 ASP.NETページのライフサイクルと、ViewStateを本当に理解することについて読むことをお勧めします。


スタイルに関する注意:

try
{
  //something
}
catch (Exception ex)
{ }

ひどい練習です-例外がスローされた場合、あなたはそれについて決して知りません。

于 2013-03-10T08:02:32.067 に答える
0

myche使用前に が空かどうかを確認してくださいlblProba.Text = myche[0]

于 2013-03-10T08:00:32.710 に答える