2012-05-01 6 views
0

からボタン私は分離コードで構築しています。テーブルはデータベースレコード(行ごとに1つのレコード)のリストで、各行に削除ボタンを追加する必要があります。そのためには、私はもちろん、そのための一意の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

あなたの問題は、あなたがHTMLにのみ、あなたのコントロールのClientIDを追加し、ページ自体にコントロールを追加していないということです。

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

OKです。しかし、私がControls.Addを行うと、どこが終了するのですか(初心者)?もともと私が望んでいたテーブルの場所にそれをどのように追加するのですか?おかげで – Ondrej

+0

私はテーブルの残りの部分が追加されるかのサンプルが含まれるように私の答えを編集しました。これはあなたが望むテーブルセルの中にあなたの削除ボタンを置きます。 – skeletank

+0

なぜリピータ制御はありませんか?またはデータリスト、または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の背後にあるコードからビルドしている場合、StringBuilderではなく文字列を使用しないでください。文字列は不変で、パフォーマンス上のペナルティがあります。代わりに、背後にあるコード内でテーブル全体のマークアップを作成する

+0

私はhtmlコードを注入すると、制御ページのライフサイクルを追加するよりも優れているとは思いません。 – Ulises

+0

私はそれが良いとは言いませんでした。しかし、例えばHTMLのようなコードから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の受け入れられた答えでは、懸念の分離が少なくなります。 –

関連する問題