私が取り組んでいるプロジェクトの動的チェックボックスのいくつかに問題があります。
テーブルがあり、行ごとに 1 つのセルにチェックボックスがあります。このチェックボックスをオンにすると、そのレコードに「フラグ」が付けられます。ユーザーが一連のフィルターを設定した後、ボタンをクリックすると、テーブル内のレコードが入力されます。したがって、ポストバックごとにテーブルの内容が完全に変わります。
リストを使用して、既にフラグが立てられているレコードを保存し、以前にチェックされたレコードが表示された場合、そのレコードもその取得時にチェックされるようにします。
関数内のリストに対してこのチェックを実行して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;
}
}
}
}