2012-11-28 24 views
0

我對我正在處理的項目中的一些動態複選框有問題。ASP.NET複選框在回發上的值不正確

我有一個表,並在每行的一個單元格中,我有一個複選框。該複選框被選中以「標記」該記錄。在用戶設置了一系列過濾器之後,表中的記錄將在按鈕單擊時填充。因此,表格內容在每次回發時完全更改。

我使用一個列表來保存哪些記錄已被標記,這樣如果一條記錄出現之前被檢查過,它也會在檢索時被檢查。

我在我的page_load函數中對我的列表執行此檢查,我可以通過調試看到它正在正確設置。但是,當頁面加載完成時,檢查的狀態通常是錯誤的。

是否需要將我的複選框狀態驗證步驟移至頁面生命週期的另一部分?

任何提示都會很棒。我在複選框中發現了一些關於asp.net問題的問題,但是我似乎與我的問題沒有關係。

下面是代碼,隨意批判它的任何/所有:)

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Data.SqlClient; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace ScienceAssessmentToolASP 
{ 
    public partial class createnewtest : System.Web.UI.Page 
    { 
    private int n; 
    private SqlConnection conn = null; 
    private List<int> flaggedQuestions = new List<int>(); 

    protected void Page_Load(object sender, EventArgs e) 
    { 

     if (IsPostBack) 
     { 
      var temp = (List<int>)Session["flaggedQuestions"]; 
      if (temp != null) 
       flaggedQuestions = temp; ;//retrieve flags from session 
      try 
      { 
       GetConn(); 
       ExecuteRetrieval(); 

       n = 1; 
      } 
      catch (Exception ex) { n = 0; Response.Write("for debugging: " + ex); } 
      finally { if (conn != null) conn.Close(); } 
      if (n < 0) 
       //Label1.Text = "Connection Successful"; 
       Label3.Text = "Failed to Connect to Database, please contact the administrator."; 
     } 
    } 

    protected void Button1_Click(object sender, EventArgs e) 
    { 
    } 

    private void GetConn() 
    { 
     string connString = @"laalalala"; 


     conn = new SqlConnection(connString); 
     conn.Open(); 
    } 

    private void ExecuteRetrieval() 
    { 
     SqlDataReader reader = null; 
     string query; 

     if (!IsPostBack) 
     { 
      query = "select * from [ScienceQA]"; 
      flaggedQuestions = (List<int>)Session["flaggedQuestions"];//retrieve flags from session 
     } 
     else query = "select * from [ScienceQA] where [GradeLevel] = " + DropDownList1.Text + 
      " and [Topic] = '" + DropDownList2.Text + "';"; 

     SqlCommand cmd = new SqlCommand(query, conn); 

     reader = cmd.ExecuteReader(); 

     TableHeaderRow headerRow = new TableHeaderRow(); 
     TableHeaderCell idH = new TableHeaderCell(); 
     TableHeaderCell questionH = new TableHeaderCell(); 
     TableHeaderCell answerH = new TableHeaderCell(); 
     TableHeaderCell flagH = new TableHeaderCell(); 

     idH.Text = "ID"; 
     questionH.Text = "Question"; 
     answerH.Text = "Answer"; 
     flagH.Text = "Flag"; 

     headerRow.Cells.Add(idH); 
     headerRow.Cells.Add(questionH); 
     headerRow.Cells.Add(answerH); 
     headerRow.Cells.Add(flagH); 
     resultTable.Controls.Add(headerRow); 

     while (reader.Read()) 
     { 
      TableRow row = new TableRow(); 
      TableCell idCell = new TableCell(); 
      TableCell qCell = new TableCell(); 
      TableCell aCell = new TableCell(); 
      TableCell flag = new TableCell(); 

      idCell.Text = reader[0].ToString(); 
      qCell.Text = reader[1].ToString(); 
      aCell.Text = reader[2].ToString(); 

      CheckBox flagBox = new CheckBox(); 
      int id = Convert.ToInt32(idCell.Text); 
      flagBox.AutoPostBack = true; 
      flagBox.CheckedChanged += new System.EventHandler(flagButton_Click); 
      flagBox.EnableViewState = true; 
      flagBox.ViewStateMode = ViewStateMode.Enabled; 

      if (flaggedQuestions.Contains(id) && flagBox.ID == "flag" + id) 
       flagBox.Checked = true; 
      else flagBox.Checked = false; 

      flagBox.Text = id.ToString(); 
      flag.Controls.Add(flagBox); 

      row.Cells.Add(idCell); 
      row.Cells.Add(qCell); 
      row.Cells.Add(aCell); 
      row.Cells.Add(flag); 
      resultTable.Controls.Add(row);   
     } 

     Label4.Visible = true; 
     flagCounter.Visible = true; 
     resultTable.Visible = true; 
    } 


    protected void flagButton_Click(object sender, EventArgs e) 
    { 
     CheckBox lb = (CheckBox)sender; 
     int questionID = Convert.ToInt32(lb.ID.Substring(4)); 


     if (lb.Checked && !flaggedQuestions.Contains(questionID)) 
     { 
      //lb.Checked = false; 
      flaggedQuestions.Add(questionID); 
      flagCounter.Text = Convert.ToString(flaggedQuestions.Count); 
     } 
     else 
     { 
      //lb.Checked = true; 
      flaggedQuestions.Remove(questionID); 
      flagCounter.Text = Convert.ToString(flaggedQuestions.Count); 
     } 
     Session["flaggedQuestions"] = flaggedQuestions;//store questions to session 
    } 

    protected void createTestButton_Click(object sender, EventArgs e) 
    { 
     //create a test 
     bool sendQuery = true; 
     string author = Session["user"].ToString(); 
     string accessLevel = accessDropdown.Text; 
     int gradeLevel = Convert.ToInt32(DropDownList1.Text); 
     int questionCount = flaggedQuestions.Count(); 
     string testType = testTypeDropDown.Text; 
     string description = descriptionBox.Text; 

     string questionString = ""; 

     for (int i = 0; i < flaggedQuestions.Count(); i++) 
      questionString += flaggedQuestions[i] + ","; 

     string query = @"Insert into Tests Values ('" + author + "','" + questionString 
      + "','" + accessLevel + "','" + gradeLevel + "','" + questionCount + "','" 
       + testType + "','" + description +"');"; 

     //check parameters 
     if (accessLevel == "") 
     { 
      errorLabel.Text = "Please choose an access level."; 
      sendQuery = false; 
     } 
     if (questionCount == 0) 
     { 
      errorLabel.Text = "Please flag a set of questions before creating a test."; 
      sendQuery = false; 
     } 
     if (testType == "") 
     { 
      errorLabel.Text = "Please choose a test type"; 
      sendQuery = false; 
     } 
     if (description == "") 
     { 
      errorLabel.Text = "Please describe your test"; 
      sendQuery = false; 
     } 
     if (sendQuery) 
     { 

      try 
      { 
       GetConn(); 
       SqlCommand cmd = new SqlCommand(query, conn); 
       cmd.Prepare(); 
       int n; 
       n = cmd.ExecuteNonQuery(); 
      } 
      catch (Exception e2) { n = 0; } 

      if (n == 1) 
       errorLabel.Text = "Test Created Successfully"; 
      else errorLabel.Text = "Test Creation Failed, please check your parameters."; 
     } 
    } 

} 
} 

這裏是爲我工作,移動複選框狀態檢查到的OnPreRender功能的解決方案。

 protected override void OnPreRender(EventArgs e) 
    { 
     foreach (TableRow row in resultTable.Rows) 
     { 
      var cell = row.Cells[3]; 
      foreach (Control control in cell.Controls) 
      { 
       var flagBox = control as CheckBox; 
       if (flagBox != null) 
       { 
        int id = Convert.ToInt32(flagBox.ID.Substring(4)); 
        if (flaggedQuestions.Contains(id) && flagBox.ID == "flag" + id) 
         flagBox.Checked = true; 
        else flagBox.Checked = false; 
       } 
      } 
     } 
    } 
+3

發佈代碼,如果它們是動態創建的,這可能是一個問題。你是否也確保你的代碼執行'if!(page.ispostback)..' – JonH

+0

我使用ajax的動態數據有一些類似的問題,我必須從頁面加載事件中將我的代碼移動到頁面預渲染事件。 ..但不知道在你的情況下...上傳一些代碼... – Scorpio

+0

代碼補充,謝謝! – Teknos

回答

1

您可能需要更新PreRender中複選框的選中狀態,因爲在按鈕單擊事件觸發後發生該複選框。

+0

這對我有用。我將複選框狀態檢查移至OnPreRender函數, – Teknos