Update: Problem umgangen – hier nachzulesen...
Eigentlich wollte ich nur ein GridView aus meiner ASP.NET-Anwendung nach Excel exportieren. Mehr nicht. Aber aus diesem Vorhaben wurde ein Unterfangen das mich lehrte, Microsoft zu hassen…
Aus ASP.NET kann man relativ leicht Daten nach Excel exportieren. Man muß nur die zu übertragenden Daten als HTML-Tabelle an Excel senden. Excel versteht diese HTMl-Tabelle und kann sie problemlos als Quasi-Excel-Sheet laden.
Und es ist auch ganz einfach ein Control – wie etwa ein GridView oder DataGrid – in HTML-Code umzuwandeln. Dazu gibt es in ASP.NET den Befehl RenderControl(StringWriter).
Such man im Internet nach Excel-Export und GridView bzw. DataGrid, findet man immer wieder Code-Beispiele, die diese beiden einfachen Dinge zusammenführen. Ein Grid wird nach HTML gerendert und als Excel-Anwendungsdaten zurückgeschickt.
Response.ClearContent();
Response.AddHeader(„content-disposition“, „attachment;
filename=MyExcelFile.xls“);
Response.ContentType = „application/excel“;
StringWriter sw = new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
TestGrid.RenderControl(htw);
Response.Write(sw.ToString());
Response.End();
Diese Code funktioniert einwandfrei – sofern man ein DataGrid verwendet. Dieses alte Grid wurde in Visual Studio 2005 bekanntermaßen durch das neue GridView abgelöst.
Wendet man nun den obigen Code auf ein GridView an – das ja sooo viel besser, genialer, revolutionärer ist als das DataGrid – erhält man diese Fehlermeldung:
Das Steuerelement ctl00_ContentPlaceholder1_TestGrid vom Typ GridView muss in einem Formulartag mit runat=server positioniert werden
Häähhh??
Natürlich befindet sich das GridView automatisch innerhalb eines Formulartags mit runat=“Server“ – schließlich hat VS 2005 den Code für mich generiert. Was bedeutet also diese sinnlose Fehlermeldung? Ich weiß es nicht.
Nach einigem suchen im Internet findet man dann heraus, dass diese Fehlermeldung ein Bug in VS 2005 ist, den man umgehen kann, wenn man folgenden, wunderbaren, logischen, selbsterklärenden und einfachen Code in seine aspx-Seite mit aufnimmt:
public override void VerifyRenderingInServerForm(Control control)
{
}
Jeder vernünftige Compiler den ich kenne würde solchen Code automatisch herauscompilieren. Nutzloser Code. Ohne Funktionalität. Ohne Sinn.
Und doch – läßt man das Programm mit dieser leeren Funktion laufen erhält man tatsächlich eine Excel-Tabelle, ohne jede weitere Fehlermeldung.
Naja, zumindest meistens. Nicht immer. Denn wenn das GridView weitere Controls enthält, wie z.B. Editierbuttons, Spalten mit Checkboxen, oder das Grid ganz einfach Sortierung und Paging erlaubt – dann kracht es erneut:
RegisterForEventValidation kann nur während Render() aufgerufen werden;
Aha. Logisch. Oder? Oder etwas nicht?
Ich kapiere es nicht – und suche mir wieder einen Wolf im Internet. Und finde heraus, dass diese Fehlermeldung umgangen werden kann, wenn man in die Seitendirektive folgenden Wert eingibt:
EnableEventValidation=“false“
Also:
<%@ Page Language=“C#“ EnableEventValidation=“false“ AutoEventWireup=“true“ CodeFile=“Default.aspx.cs“ Inherits=“_Default“ %>
Jetzt aber! Nun funktioniert der Export eines GridViews nach Excel. Hurra!
Ich habe ja auch nur gut 4 Stunden gebraucht, um all das herauszufinden.
Das regt mich an Visual Studio 2005 so unendlich auf. Man will was machen und findet sehr schnell im Internet entsprechende Lösungen bzw. Beispielcodes, wie etwas gehen könnte. Doch geht man dann in die Tiefe, taucht ein Problem nach dem anderen auf. Wie ein Dominoeffekt.
Nach dem Motto: „Hurra – ich bin eine Fehlermeldung weiter“ – nächster Level!! Yeahhh.
Um so ärgerlicher ist es, wenn man dann auch noch an Bugs von Microsoft scheitert. Wenn man einen Workaround für einen Fehler braucht, und wenn er nur aus einer leeren Routine besteht.
Doch manchmal habe ich den Verdacht, das sind gar keine Bugs. Das ist pure Absicht! Microsoft will ganz einfach in möglichst vielen Blogs von verzweifelten Entwicklern auftauchen! Das ist Microschufts Art, den Goolge-Page-Rank zu erhöhen! Jawohl! SEO (search engine optimization)) der ganz besonderen Art!