2013-03-10 117 views
0

在我的代碼中,我有一個CheckboxList,我動態地添加它的項目!我想要的是保存文本,但只從選中複選框在會話中,因爲我將在我的下一個表格中需要它!例外'索引超出範圍'

所以我想提出一些文本,當你看到我保存在與名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 2013-03-10 07:23:09

+0

@Lion - 您有足夠的聲譽進行編輯並向OP顯示正確的方式。 – Oded 2013-03-10 07:24:18

+0

請只發布_relevant_代碼 - 發佈所有這些代碼只是很難找出問題 - 比如導致錯誤和相關代碼的_line_。我建議遵循[sscce](http://sscce.org)的指導方針 – Oded 2013-03-10 07:28:23

回答

0

問題之前空是myche中有沒有項目的按鈕單擊事件處理程序被觸發時。

唯一的地方你實際上任何項目的名單是ddlNumberTourists_SelectedIndexChanged。此事件處理程序是而不是在回發後調用,因此myche爲空。

如果您希望在回發之間保留myche的值,您需要在視圖狀態下存儲和加載myche的值。

我建議您閱讀關於ASP.NET page life cycle以及TRULY Understanding ViewState如果您想了解如何使其正常工作。款式


注:

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

是可怕的做法 - 如果拋出一個異常,你永遠不知道這件事。

+0

問題不僅在於這個Oded - 當然是我!我的事情(mycheckbox.Items [s] .Selected始終是false,因爲當我在創建時動態創建它們時,它們不會被檢查!我認爲這是第一個問題。 – 2013-03-10 10:28:25

+0

@MilkaSalkova - 好吧,有很多事情要指出出來,但我建議先閱讀這兩篇文章 – Oded 2013-03-10 10:39:08

+0

是的,我讀他們,我婉在會話中存儲的檢查項目的文本 - 我和會議工作,我想嘗試 - 所以當我忽略這一點,如果(mycheckbox.Items [s] .Selected == true),並將所有複選框的文本存儲在一個會話中 - 它的工作原理完美。或許我的新問題是我應該檢查項目是否被檢查。如果你能幫助我會很高興 – 2013-03-10 10:45:39