2

データベースにリピーターを接続しており、そのデータを xls ファイルにエクスポートしたいと考えています。私のリピーターには行を操作する(削除する)ためのコントロールボタンが含まれているため、このボタンでxlsがレンダリングされることを除いて、私はそれを行うことができました。

<asp:Repeater ID="Repeater1" runat="server"   EnableTheming="true"onitemcommand="Repeater1_ItemCommand" >
    <HeaderTemplate>
            <table class="datatable fullwidthpercent"> 
               <tr>
                   <td>ID</td>                     
                   <td> Nom</td>                             
                   <td>Prénom</td>                              
                   <td>Email</td>                      
                   <td>Adresse</td>
                   <td>Ville</td>
                   <td>Tél</td>
               </tr>

    </HeaderTemplate>
        <ItemTemplate>

               <tr>
                   <td><%# Eval("id") %></td>                           
                   <td><%# Eval("nom") %></td>                         
                   <td><%# Eval("prenom") %></td>                         
                   <td><%# Eval("email") %></td>
                   <td><%# Eval("adresse") %></td>
                   <td><%# Eval("ville") %></td>
                   <td><%# Eval("tel") %></td>
                   <td><asp:Button ID="Btn1" runat="server" CommandArgument= ' <%# Eval("id") %> ' Text="Eliminer" OnClick = "buttonEliminer_click" ></asp:Button></td>                   
               </tr>                  

        </ItemTemplate>
        <SeparatorTemplate>
        <tr>
        <td colspan="6"><hr /></td>
        </tr>
        </SeparatorTemplate>
        <FooterTemplate>
           </table>
        </FooterTemplate>
</asp:Repeater>
</div>

コードビハインド:

  protected void ButtonExporter_Click(object sender, EventArgs e)
    {

        Response.Clear();
        Response.Buffer = true;
        Response.AddHeader("content-disposition", "attachment;filename=Gagnants.xls");
        Response.Charset = "";
        Response.ContentType = "application/vnd.ms-excel";

        System.IO.StringWriter stringWrite = new System.IO.StringWriter();
        System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
        Repeater1.RenderControl(htmlWrite);
        Response.Write("<table>");
        Response.Write(stringWrite.ToString());
        Response.Write("</table>");
        Response.End();

    }

内部コントロールでリピーターをレンダリングするときのフォームバリスの問題を克服するためのメソッドのオーバーライド:

public override void VerifyRenderingInServerForm(Control control)
    {
        /* Confirms that an HtmlForm control is rendered for the specified ASP.NET
           server control at run time. */
    }

そして、私は出力xlsでこれを取得します: ここに画像の説明を入力

4

1 に答える 1

2

基本的に、ボタン ( Btn1) の可視性を false に設定するコードを実装する必要があります。サーバー コントロールの可視性が false に設定されている場合、そのコントロールはページに表示されません。

次のコード変更をお勧めします。

最初に、レンダリング先を決定するページ レベルの変数を作成します。trueこれがデフォルトのステータス(画面へのレンダリング)であるため、これをデフォルトに設定する必要があります

private bool _IsRenderForScreen = true;
public property bool IsRenderForScreen {
   get {
      return this._IsRenderForScreen;
   }
   set {
      this._IsRenderForScreen = value;
   }
}

次に、ButtonExporter_Clickメソッドで、この変数を false に設定します。

this.IsRenderForScreen = false;

次に、リピーターのItemDataBoundイベントにフックします。

<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound" ...

次に、イベントを処理する次のメソッドを追加します。

public void Repeater1_ItemDataBound(Object sender, RepeaterItemEventArgs e)
{
    if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) {
        if(!this.IsRenderForScreen) {
            ((Button)e.Item.FindControl("Btn1")).Visible = false;
        }
    }
}

HTH。不明な点があればお知らせください

于 2013-08-10T00:23:43.753 に答える