2012-05-01 145 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接受的答案是較少的問題分離。 –