C# 从codebehind添加asp:按钮
我正在建立一个密码。该表是一个数据库记录列表,每行一条记录,我需要为每行添加一个删除按钮。要做到这一点,我当然需要构建一个具有唯一ID的按钮。为此,我提出了以下建议。。。这不管用。关于如何让它工作,有什么建议吗C# 从codebehind添加asp:按钮,c#,asp.net,C#,Asp.net,我正在建立一个密码。该表是一个数据库记录列表,每行一条记录,我需要为每行添加一个删除按钮。要做到这一点,我当然需要构建一个具有唯一ID的按钮。为此,我提出了以下建议。。。这不管用。关于如何让它工作,有什么建议吗 Button deleteButton = new Button(); deleteButton.ID = "deleteStudentWithID" + singleStudent.ID.ToString(); deleteButton.Text = "X"; string row
Button deleteButton = new Button();
deleteButton.ID = "deleteStudentWithID" + singleStudent.ID.ToString();
deleteButton.Text = "X";
string row = "<tr>";
row += "<td class=\"style5\">"+deleteButton.ClientID +"</td>";
row += "</tr>";
您的问题是只将控件的ClientID添加到html中,而没有将控件添加到页面本身
Controls.Add(new LiteralControl("<table>"));
foreach(var singleStudent in students)
{
Controls.Add(new LiteralControl("<tr>"));
//Code to add other columns
Button deleteButton = new Button();
deleteButton.ID = "deleteStudentWithID" + singleStudent.ID.ToString();
deleteButton.Text = "X";
Controls.Add(new LiteralControl("<td class=\"style5\">"));
Controls.Add(deleteButton);
Controls.Add(new LiteralControl("</td></tr>");
}
Controls.Add(new LiteralControl("</table>"));
我能想到的解决你问题的最好办法是
Button deleteButton = new Button();
deleteButton.ID = "deleteStudentWithID" + singleStudent.ID.ToString();
deleteButton.Text = "X";
StringBuilder sb = new StringBuilder();
StringWriter writer = new StringWriter(sb);
HtmlTextWriter htmlWriter = new HtmlTextWriter(writer);
deletedButton.RenderControl(htmlWriter);
string row = "<tr>";
row += "<td class=\"style5\">"+sb.toString(); +"</td>";
row += "</tr>";
这样您就可以获得任何控件的HTML:如果您是从代码隐藏中动态构建HTML,那么请尝试不要使用字符串而使用StringBuilder。字符串是不可变的,并且有性能损失。使用ASP.NET提供的控件,而不是在代码中创建整个表标记 例如,将其放在.aspx中:
<table>
<asp:Repeater runat="server" ID="MyRepeater1">
<ItemTemplate>
<tr>
<td><%# Eval("StudentName")%></td>
<td>... other student object bindings ...</td>
<td>
<asp:Button runat="server" ID="MyDeleteButton"
CommandArgument='<%# Eval("ID")%>'
CommandName="Delete"
OnCommand="MyDeleteButton_Command"
Text="X" />
</td>
</tr>
</ItemTemplate>
</asp:Repeater>
</table>
那张表是gridview还是repeater?或者datalist?你说的不工作是什么意思?你在那里所做的就是用你创建的按钮的ClientID字符串创建一个单元格。实际上,您并没有这样将按钮添加到页面中。我认为使用Grid view可以轻松完成所有这些操作。查看这个ASP.NET GridView控件演示@JPHellemons,我怀疑它根本不是一个控件;相反,看起来他完全是自己生成标记并将其发送到页面。这意味着他可能需要介绍GridView和Repeater控件,以及Eval绑定。好的,听起来很合理。但如果我使用Controls.Add,那么初学者在哪里结束呢?如何将它添加到表中最初需要它的位置?谢谢,我已经编辑了我的答案,其中包括了如何添加表的其余部分的示例。这将把你的删除按钮放在你想要的表格单元格内。为什么没有中继器控件?或者datalist,或者gridview?@JPHellemons你说得对。我相信在这种情况下,中继器控制将是最可靠的解决方案,我对GuthMD的答案投了赞成票。datalist或gridview可能太多。由于不知道昂德雷的时间限制,我试图给出一个符合已经使用的模式的答案。当我有完全在代码中的控件时,我有时会使用这种方法。我不认为注入html代码比在页面生命周期中添加控件更好。我从来没有说过它更好。但是,如果他是从代码隐藏(例如电子邮件)生成HTML,那么这是一个好方法。这个答案比在代码隐藏中循环并在那里生成HTML要好得多。对于@skeletank的公认答案,关注点的分离更少。
protected void Page_Load(object sender, EventArgs e)
{
MyRepeater1.DataSource = new MyStudent[]
{
new MyStudent()
{
ID = 1,
StudentName = "Student 1"
},
new MyStudent()
{
ID = 2,
StudentName = "Student 2"
}
};
MyRepeater1.DataBind();
}
protected void MyDeleteButton_Command(object sender, CommandEventArgs e)
{
switch (e.CommandName)
{
case "Delete":
// stuff for deleting by e.CommandArgument
break;
}
}