Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从codebehind添加asp:按钮_C#_Asp.net - Fatal编程技术网

C# 从codebehind添加asp:按钮

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

我正在建立一个密码。该表是一个数据库记录列表,每行一条记录,我需要为每行添加一个删除按钮。要做到这一点,我当然需要构建一个具有唯一ID的按钮。为此,我提出了以下建议。。。这不管用。关于如何让它工作,有什么建议吗

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;
    }
}