0

これに関連するいくつかの質問を見つけましたが、私の問題に適用する方法を理解できるものはありませんでした. とにかく、データベースから質問と回答を取得してテーブルに配置する ASP Web フォームがあります。表には、ユーザーが質問にフラグを立てることができるチェックボックスのある列があります。私の問題は、CheckChanged イベントのイベント ハンドラーが起動していないことです。ポストバックなどについていくつか読んだことがありますが、私の問題は、質問の取得ボタンが押されるまでこれらのコントロールが作成されないことです。どんな助けや指針も素晴らしいでしょう。

ありがとう、

ジョセフ

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)
    {

    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        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.";           
    }
    private void GetConn()
    {
        string connString = @"
            removed ";

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

    private void ExecuteRetrieval()
    {
        List<string> names = new List<string>(),
          types = new List<string>();
        SqlDataReader reader = null;

         string 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();
            flagBox.ID = "flag" + idCell.Text.ToString();
            //flagBox.Text = "Flag";
            flagBox.CheckedChanged += new System.EventHandler(flagButton_Click);
            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.Text.Substring(4));

        if (lb.Checked)
        {
            lb.Checked = false;
            flaggedQuestions.Add(questionID);
            flagCounter.Text = Convert.ToString(Convert.ToInt32(flagCounter.Text) - 1);
        }
        else
        {
            lb.Checked = true;
            flaggedQuestions.Remove(questionID); 
            flagCounter.Text = Convert.ToString(Convert.ToInt32(flagCounter.Text) + 1);
        }          
    }
}

}

4

2 に答える 2

0

コントロールを作成するときに、AutoPostBackをtrueに設定してみてください。

flagBox.AutoPostBack = true;

これにより、イベントによってポストバックが発生します。これがない場合は、フォームを送信するまでコードは実行されません。

于 2012-10-29T21:37:25.303 に答える
0

私はそれを考え出した。ボタンをクリックするとポストバックが発生するため、ボタンハンドラーには何も必要なかったと思います。そのため、すべての button1 ハンドラーをページロードに入れ、if(postback) チェックを行ったところ、うまくいきました。

于 2012-10-30T19:17:39.363 に答える