Add asp:Button from codebehind

前端 未结 3 520
一向
一向 2020-12-12 07:38

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

相关标签:
3条回答
  • 2020-12-12 08:06

    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>"));
    
    0 讨论(0)
  • 2020-12-12 08:19

    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;
        }
    }
    
    0 讨论(0)
  • 2020-12-12 08:22

    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.

    0 讨论(0)
提交回复
热议问题