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何时找到某些选定的功能,但在第二次调用时数据丢失

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

这两个电话发生在不同的回邮上。

您需要调用ddlNumberTourists_SelectedIndexChanged(object sender, EventArgs e)on 按钮单击,而不是在下拉列表的每个更改上调用,例如,我将其重命名为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";
            }

另一种可能的解决方案是保存mycheon viewstate。

于 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 回答