【问题标题】:Exception 'Index out of range'异常“索引超出范围”
【发布时间】:2013-03-10 07:20:08
【问题描述】:

在我的代码中,我有一个 CheckboxList,我动态添加它的项目!我想要的是保存文本,但只能从会话中的 checked CheckBoxes 中保存,因为我将在下一个表单中需要它!

所以我想制作一些文本,如您所见,我将选中复选框中的文本保存在名称为 myche 的列表中,但是当我按下按钮查看此列表的第一项时 - 此代码 @987654323 @ 给了我一个例外“索引超出范围”。看来我的清单是空的。

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
    }
}

【问题讨论】:

  • 请正确格式化您的代码,删除无意义的空行。
  • @Lion - 你有足够的声誉进行编辑并向 OP 展示正确的方法。
  • 请仅发布 相关 代码 - 发布所有这些代码只会让人难以找出问题 - 诸如导致错误和相关代码。我建议遵循sscce 的指导方针
  • 空的 catch 块是一种非常糟糕的编码习惯——不要吞下这样的异常。

标签: asp.net


【解决方案1】:

在使用lblProba.Text = myche[0]之前检查myche是否为空

【讨论】:

    【解决方案2】:

    问题是在触发按钮点击事件处理程序时,myche 中没有任何项目。

    您真正添加任何项目到列表的唯一位置是ddlNumberTourists_SelectedIndexChanged。此事件处理程序在回发时调用,因此myche 为空。

    如果您希望在回发之间保留myche 的值,则需要在视图状态中存储和加载它们。

    如果您想了解如何使其正常工作,我建议您阅读ASP.NET page life cycleTRULY Understanding ViewState


    风格说明:

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

    这是一种糟糕的做法——如果抛出异常,你永远不会知道。

    【讨论】:

    • 问题不只是这个 Oded - 当然是根据我的!我认为 (mycheckbox.Items[s].Selected 总是错误的,因为当我在创建时动态创建项目时,它们不会被检查!我认为这是第一个问题。
    • @MilkaSalkova - 有很多事情需要指出,但我建议先阅读这两篇文章。
    • 是的,我阅读了它们,并且我想在会话中存储选中项目的文本 - 我已经使用过会话并且我想尝试 - 所以当我忽略这个 if (mycheckbox.Items[ s].Selected == true )并且我将所有复选框的文本存储在会话中 - 它工作得很好。所以也许我的新问题是我应该在哪里检查项目是否已检查如果你能帮助我,我会很高兴
    • @MilkaSalkova - 嗯,这是一个完全不同的问题,有不同的答案......我建议你作为一个新问题提出。
    猜你喜欢
    • 2011-03-16
    • 1970-01-01
    • 2011-12-25
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多