2012-05-01 102 views
0

我正在构建一个代码隐藏。该表是数据库记录的列表(每行一个记录),我需要为每行添加一个删除按钮。为此,我当然需要为此创建一个具有唯一ID的按钮。为了做到这一点,我想出了以下......这是行不通的。有关如何使这项工作的任何提示?添加asp:代码隐藏按钮

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>"; 
+2

是表一个GridView或中继器?或数据专家? –

+0

你是什么意思的“不工作”? –

+1

您所做的只是使用您创建的按钮创建一个带有ClientID字符串的单元格。你实际上并没有以这种方式向页面添加按钮。 –

回答

4

你的问题是,你只需要添加控件的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>")); 
+0

好的,听起来很合理。但是,如果我做Controls.Add,它在哪里结束(初学者)?我如何将它添加到我最初想要的表格中的位置?谢谢 – Ondrej

+0

我编辑了我的答案,其中包含了如何添加表格其余部分的示例。这会将您的删除按钮放置在所需的表格单元格内。 – skeletank

+0

为什么没有中继器控制?或datalist,或gridview? –

0

您的问题,最好的解决办法我能想到的是

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,那么尽量不要使用string而是StringBuilder。字符串是不可改变的,并且会有性能损失

+0

我不认为注入html代码比添加页面生命周期控件更好。 – Ulises

+0

我从来没有说过它会更好。但是如果他是通过代码后面的代码制作HTML的话,一个电子邮件然后这是很好的方法。 –

3

而不是在您的代码中创建整个表标记,使用由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> 

,包括这在你的后台代码:

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

这个答案要好得多,然后在后面的代码中建立一个循环,并在那里构建HTML。与@skeletank接受的答案是较少的问题分离。 –