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