0

I found a few questions related to this, but none that I could figure out how to apply to my issue. Anyway, I have a ASP webform that pulls questions and answers from a database and puts them in a table. In the table, I have a column with a checkbox where the user can flag questions. My problem is that event handler for the CheckChanged event is not firing. I read some things about postback and whatnot, but my issue is that these controls are not created until the retrieve question button is pressed. Any help or pointers would be great.

Thanks,

Joseph

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

Try setting AutoPostBack to true when you create the control:

flagBox.AutoPostBack = true;

This makes it so the event will cause a postback. If you don't have this the code won't fire until you submit the form.

于 2012-10-29T21:37:25.303 回答
0

I figured it out. I guess I didnt need anything in button handler, since the clicking of the button causing a postback. So I put all the button1 handler stuff in my pageload with a if(postback) check and that worked.

于 2012-10-30T19:17:39.363 回答