【发布时间】:2020-02-20 08:14:52
【问题描述】:
我为一个项目创建了一个网站,您可以注册该网站。它与 SQL 数据库挂钩。
我正在尝试创建一个页面,管理员可以在其中查看有关不同现有用户的信息,以及删除其中一些用户。
问题是,禁令系统是这样工作的: 所有用户都有一个单独的禁止按钮,其 ID 是用户名的 ID,然后,如果管理员想要禁止用户,他单击用户名旁边的禁止按钮,然后触发一个事件,并且该按钮的 ID单击的用户(正如我所说,等于用户名)会随查询一起发送,并且每个具有该用户名的用户都会被删除。
当我单击由后面的代码生成的按钮之一时,该事件不会触发,但如果我在 HTML aspx 页面中设置一个具有完全相同属性的按钮,它会完美运行。
这是我的代码:
{
public DbConnector Dbconnector = new DbConnector();
public string htmllist = "";
protected void Page_Load(object sender, EventArgs e)
{
if (Session["user"] == null) Server.Transfer("logincode.aspx");
if (Session["admin"] == null)
{
Server.Transfer("HomePage.aspx");
}
else
{
DbConnector dbc = new DbConnector();
SqlDataReader reader = dbc.read("SELECT * FROM UsersTable ORDER BY id");
while (reader.Read())
{
htmllist += $"<tr><td class=\"id\">{reader["Id"].ToString()}</td>";
htmllist += $"<td>{reader["Username"].ToString()}</td>";
htmllist += $"<td>{reader["Password"].ToString()}</td>";
htmllist += $"<td class = \"mail\">{reader["Email"].ToString()}</td>";
htmllist += $"<td>{reader["IsAdmin"].ToString()}</td>";
htmllist += $"<td><asp:Button runat=\"server\" name=\"{reader["Username"].ToString()}\" id=\"{reader["Username"].ToString()}\" class=\"btn\" value=\"Remove User\" OnClick=\"BanUser\"/></td></tr>";
htmllist += "<br />";
}
dbc.closeconnection();
}
}
protected void BanUser(object sender, EventArgs e)
{
Button button = (Button)sender;
string buttonid = button.ID;
string banquery = $"DELETE FROM UsersTable WHERE Username = '{buttonid}';";
new DbConnector().ExecuteCRUDQuery(banquery);
}
}
我已经尝试解决这个问题几个小时,但无济于事。 有谁知道我做错了什么?
编辑
我想提一下,我使用了检查元素来确保按钮 ID 设置正确并且它们是正确的。这是关于触发不起作用的事件。
【问题讨论】:
-
如果你想以表格结构显示数据,最好使用gridview。这还将支持显示控件,例如每行上的按钮并为所有这些触发公共事件。它们以您创建按钮的方式,它们实际上并未创建为按钮控件并添加到页面控件集合中。这肯定行不通
-
这不是触发事件。您正在尝试动态呈现 ASP 按钮,但您不能以将其作为字符串执行的方式来执行此操作。你如何渲染字符串
htmllist?您需要在代码(不是字符串)中创建一个按钮并将其添加到页面中。你需要一个容器(例如占位符)来添加你的按钮,这样你就可以控制它在页面上的添加位置。否则,您可以根据需要将其直接添加到页面中。