0

このコードでは、データベースからのデータを入力するチェックボックスを動的に作成します。

私の意図は、btnProbaボタンを押して、選択したチェックボックスからのみテキストプロパティを表示することです。しかし、この行にインデックスが範囲外であるというエラーが表示されます! 理由は説明できません。

lblProba.Text = myche[0];

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

           // lblProba.Text = mynewstring;
            if(!IsPostBack)
            {
                ddlNumberTourists.Items.Add("1");
                ddlNumberTourists.Items.Add("2");
                ddlNumberTourists.Items.Add("3");
            }
        }

        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())
                    {
                        // CheckBox myCheckbox = new CheckBox();
                        //   myCheckbox.ID = "ckbExtraCharge" + i.ToString() + s.ToString();
                        // myCheckbox.Text = rd["Extra_Charge_Description"].ToString();
                        //  Page.FindControl("form1").Controls.Add(myCheckbox);
                        //  Page.FindControl("form1").Controls.Add(new LiteralControl("<br />"));
                        //  s++;

                        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++;
                    }
                }
                catch (Exception ex)
                { }
            }
        }    

        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));
        }
    }
}
4

2 に答える 2

0

この関数ddlNumberTourists_SelectedIndexChangedは、選択されたものをいつ見つけるかを設定する関数ですmycheが、2 回目の呼び出しでデータが失われます。

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

2 つの呼び出しは、別のポスト バックで発生しています。

ddlNumberTourists_SelectedIndexChanged(object sender, EventArgs e)ドロップダウンリストのすべての変更ではなく、ボタンクリックで呼び出す必要があります。たとえば、名前を変更するCheckWhatIsSelected()と、コードは次のようになります。

protected void CheckWhatIsSelected()
        {
            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())
                    {
                        // CheckBox myCheckbox = new CheckBox();
                        //   myCheckbox.ID = "ckbExtraCharge" + i.ToString() + s.ToString();
                        // myCheckbox.Text = rd["Extra_Charge_Description"].ToString();
                        //  Page.FindControl("form1").Controls.Add(myCheckbox);
                        //  Page.FindControl("form1").Controls.Add(new LiteralControl("<br />"));
                        //  s++;

                        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++;
                    }
                }
                catch (Exception ex)
                { }
            }
        }    

     protected void btnProba_Click(object sender, EventArgs e)
            {
                CheckWhatIsSelected();
                if(myche.Count > 0)
                   lblProba.Text = myche[0];
                else
                   lblProba.Text = "Non selected";
            }

もう 1 つの考えられる解決策は、on ビューステートを保存することmycheです。

于 2013-01-13T18:18:45.840 に答える
0

ViewState を使用したその他のソリューション。ViewState を使用して選択内容を保存し、ポストバック後にそれを取得します。リストをクリアすることを忘れないでくださいddlNumberTourists_SelectedIndexChanged

List<string> myche
{
    get
    {
        if (!(ViewState["cMyChe"] is List<string>))
        {
            // need to fix the memory and added to viewstate
            ViewState["cMyChe"] = new List<string>();
        }

        return (List<string>)ViewState["cMyChe"];
    }
}

 protected void btnProba_Click(object sender, EventArgs e)
{
    // double check if have something on the list
    if(myche.Count > 0)
       lblProba.Text = myche[0];
    else
       lblProba.Text = "Non selected";
}
于 2013-01-13T18:24:52.347 に答える