2013-03-10 4 views
0

В моем коде у меня есть CheckboxList, и я добавляю его элементы динамически! Я хочу сохранить текст, но только с проверил CheckBoxes в сеансе, потому что он понадобится мне в следующей форме!Exception 'Index out the range'

Так что я хотел сделать какой-нибудь текст и, как вы видите, я сохранить текст из проверяемых флажков в списке с именем myche, но при нажатии на кнопку, чтобы увидеть первый элемент этого списка - это код lblProba.Text = myche[0]; дает мне исключение «Индекс вне диапазона». Кажется, мой список пуст.

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

Правильно отформатируйте свой код, удалив бессмысленные пустые строки. – Lion

+0

@ Lion - У вас достаточно репутации, чтобы сделать изменения и показать OP правильный способ сделать это. – Oded

+0

Пожалуйста, публикуйте только код _relevant_ - публикация всего этого кода просто затрудняет определение проблемы - такие вещи, как _line_, которые вызвали ошибку и связанный с ней код. Я предлагаю следовать рекомендациям [sscce] (http://sscce.org) – Oded

ответ

0

Проверьте myche пуст перед использованием lblProba.Text = myche[0]

0

Проблема заключается в том, что myche не имеет элементов в нем, когда обработчик события нажатия кнопки запускается.

Единственное место, где вы на самом деле добавить любые предметы в список: ddlNumberTourists_SelectedIndexChanged. Этот обработчик события не вызван на почту, поэтому myche пуст.

Вам необходимо сохранить и загрузить значения myche в viewstate, если вы хотите, чтобы они сохранялись между обратными передачами.

Я предлагаю прочитать о ASP.NET page life cycle, а также TRULY Understanding ViewState, если вы хотите понять, как заставить это нормально работать.


Примечание по стилю:

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

страшен практика - если исключение, вы никогда не знаете об этом.

+0

Проблема не только в этом Одед - по моему мнению, конечно! Я так считаю, что (mycheckbox.Items [s] .Выбран всегда всегда, потому что, когда я создаю элементы динамически при создании, они не проверяются! Я думаю, что это первая проблема. –

+0

@MilkaSalkova - Ну, есть много вещей, чтобы указать но я предлагаю сначала прочитать эти две статьи. – Oded

+0

да, я прочитал их, и я хочу хранить текст отмеченных элементов в сеансе - я работал с сеансом, и я хотел попробовать - поэтому, когда я игнорирую это, если (mycheckbox.Items [s] .Selected == true), и я сохраняю текст всех флажков в сеансе - он отлично работает. SO, возможно, мой новый вопрос - это где я должен проверить, проверены ли элементы. Если вы можете мне помочь, буду рад –

Смежные вопросы