Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态复选框事件处理程序asp.net_Asp.net_.net_C# 4.0 - Fatal编程技术网

动态复选框事件处理程序asp.net

动态复选框事件处理程序asp.net,asp.net,.net,c#-4.0,Asp.net,.net,C# 4.0,我发现了一些与此相关的问题,但没有一个是我能弄明白如何应用于我的问题的。无论如何,我有一个ASP网络表单,它从数据库中提取问题和答案,并将它们放在一个表中。在表中,我有一个带有复选框的列,用户可以在其中标记问题。我的问题是CheckChanged事件的事件处理程序没有启动。我读了一些关于回发之类的东西,但我的问题是,在按下检索问题按钮之前,这些控件不会被创建。任何帮助或指点都会很好 谢谢 约瑟夫 using System; using System.Collections.Generic; us

我发现了一些与此相关的问题,但没有一个是我能弄明白如何应用于我的问题的。无论如何,我有一个ASP网络表单,它从数据库中提取问题和答案,并将它们放在一个表中。在表中,我有一个带有复选框的列,用户可以在其中标记问题。我的问题是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);
        }          
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Web;
使用System.Data.SqlClient;
使用System.Web.UI;
使用System.Web.UI.WebControl;
命名空间科学评估工具ASP
{
公共分部类createnewtest:System.Web.UI.Page
{
私人int n;
私有SqlConnection conn=null;
private List flaggedQuestions=新列表();
受保护的无效页面加载(对象发送方、事件参数e)
{
}
受保护的无效按钮1\u单击(对象发送者,事件参数e)
{
尝试
{
GetConn();
executetrieval();
n=1;
}
catch(异常ex){n=0;Response.Write(“用于调试:+ex);}
最后{if(conn!=null)conn.Close();}
if(n<0)
//Label1.Text=“连接成功”;
Label3.Text=“无法连接到数据库,请与管理员联系。”;
}
私有void GetConn()
{
字符串connString=@”
删除”;
conn=新的SqlConnection(connString);
conn.Open();
}
private void ExecuteTrieval()
{
列表名称=新列表(),
类型=新列表();
SqlDataReader=null;
string query=“从[ScienceQA]中选择*,其中[GradeLevel]=”+DropDownList1.Text+
“和[主题]=”+DropDownList2.Text+”;”;
SqlCommand cmd=新的SqlCommand(查询,连接);
reader=cmd.ExecuteReader();
TableHeaderRow headerRow=新的TableHeaderRow();
TableHeaderCell idH=新的TableHeaderCell();
TableHeaderCell questionH=新的TableHeaderCell();
TableHeaderCell answerH=新的TableHeaderCell();
TableHeaderCell flagH=新的TableHeaderCell();
idH.Text=“ID”;
问题h.Text=“问题”;
answerH.Text=“Answer”;
flagH.Text=“Flag”;
头错误单元格添加(idH);
标题。单元格。添加(问题H);
标题。单元格。添加(应答);
headerRow.Cells.Add(flagH);
可结果。对照。添加(headerRow);
while(reader.Read())
{
TableRow行=新TableRow();
TableCell idCell=新的TableCell();
TableCell qCell=新的TableCell();
TableCell aCell=新的TableCell();
TableCell标志=新的TableCell();
idCell.Text=读取器[0]。ToString();
qCell.Text=reader[1].ToString();
aCell.Text=reader[2].ToString();
复选框flagBox=新复选框();
flagBox.ID=“flag”+idCell.Text.ToString();
//flagBox.Text=“Flag”;
flagBox.CheckedChanged+=新系统.EventHandler(flagButton\u单击);
flag.Controls.Add(flagBox);
row.Cells.Add(idCell);
行.单元格.添加(qCell);
row.Cells.Add(aCell);
行.单元格.添加(标志);
可结果.Controls.Add(行);
}
Label4.可见=真;
flagCounter.Visible=true;
resultTable.Visible=true;
}
受保护的无效标志按钮\u单击(对象发送者,事件参数e)
{
复选框lb=(复选框)发送方;
int questionID=Convert.ToInt32(lb.Text.Substring(4));
如果(磅已检查)
{
lb.选中=错误;
添加(问题ID);
flagCounter.Text=Convert.ToString(Convert.ToInt32(flagCounter.Text)-1);
}
其他的
{
lb.选中=真;
标记问题。删除(问题ID);
flagCounter.Text=Convert.ToString(Convert.ToInt32(flagCounter.Text)+1);
}          
}
}
}

创建控件时,请尝试将设置为true:

flagBox.AutoPostBack = true;

这使得事件将导致回发。如果你没有这个,在你提交表单之前,代码不会启动。

我想出来了。我想我不需要按钮处理程序中的任何东西,因为点击按钮会导致回发。因此,我在页面加载中添加了所有button1处理程序,并进行了if(回发)检查,结果成功了

ASP和ASP.NET之间存在差异。确保你知道这一点,否则人们会取笑你。那是行不通的。当我选中这些复选框时,它会删除所有动态元素(表、复选框)。是的,如果您有动态元素,则每次回发都必须重新创建它们。基于这样一个事实,即当您选中复选框时,您将收到回发消息,我想说它现在正在回发…那么我是否需要在pageload中的ExecuteTrieval方法中使用if(回发)添加创建回发消息的相同代码?我可能错了,但看起来您可以使用javascript/jQuery在客户端执行所需的操作(也就是说,不做回发)。这将绕过当前问题,提供更好的用户体验。如果这不是一个选项,我将从页面加载中调用
executetrieval
函数。