I\'m building a in codebehind. The table is a listing of a database records (one record per row) and I neeed to add a delete button for each row. To do that, I of course ne
Your problem is that you're adding only the ClientID
of your control to the html and not adding the control to the page itself.
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>"));
Instead of creating the entire table markup in your code behind, use the controls made available by ASP.NET.
For an example, place this in your .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>
And include this in your code-behind:
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;
}
}
The best Solution to Your problem i can think of is
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>";
This way you can get any control's HTML. :) If you are building dynamically HTML from code behind then try not to use string rather StringBuilder. strings are immutable and has performance penalty.