Parameter aus einem Querystring entfernen.

Gerade habe ich einen interessanten Artikel gefunden der zeigt, wie man einen Parameter aus der Querystringauflistung entfernen kann. Public Sub RemoveQueryString(ByVal Req As HttpRequest, ByVal strKeyToDel As String, ByVal http_Context As HttpContext)Dim nvc As System.Collections.Specialized.NameValueCollection = New System.Collections.Specialized.NameValueCollection(Req.QueryString)Dim sPage As String = Req.ServerVariables("SERVER_NAME") & Req.ServerVariables("SCRIPT_NAME")nvc.Remove(strKeyToDel)Dim strNewURL As String = Req.PathDim sSeparator As String = "?"Dim sKey As StringFor Each sKey In nvcIf sKey <> Nothing ThenDim sValues As String() = nvc.GetValues(sKey)Dim sValue As StringFor Each sValue In sValuesIf sValue <> Nothing ThenstrNewURL &= sSeparatorstrNewURL &= sKey & "=" & sValuesSeparator = "&"End IfNextEnd IfNextIf nvc.Keys.Count < 1 ThenstrNewURL &= "?"End Ifhttp_Context.Current.RewritePath(strNewURL)End Sub Gefunden habe ich den Code unter http://www.codeproject.com

DNN (DotNetNuke) und Transaktionen

Eines meiner größten Probleme - oder sagen wir lieber Sorgen - war bisher, dass DNN keine Transaktionen unterstützt. Es gibt doch immer wieder mal Business-Cases wo man transaktionsicher Daten verarbeiten möchte. Ein typischens Beispiel wäre z.B. eine Online-Shop, wenn es um die Bestellung und gleichzeitige Zahlungsabwicklung geht. Da DotNetNuke in vermutlich in vielen Fällen auf einem Windows 2003 Server betrieben wird, ist die komplette Umgebung schon vorhanden um die Abläufe transaktionssicher zu gestalten. Das Stichwort ist hier "Services without Components". Der Begriff "Services without Components" steht für die Nutzung von COM+-Dienste in .NET-Anwendung ohne Registrierung als Serviced Component (COM+-Anwendung).Klassen: .ServiceConfig and System.EnterpriseServices.ServiceDomain Das folgende Beispiel zeigt eine ganz einfache Implementierung innerhalb einer Methode:                  //Hier wird mit einem Transaktionskontext gearbeitet,                //damit das Handling einfacher wird                ServiceConfig sc = new ServiceConfig();                sc.Transaction = TransactionOption.RequiresNew ;                ServiceDomain.Enter ( sc ) ;                try                {                    //mach was ....                    ContextUtil.SetComplete() ;                }                catch (Exception exc)                 {                    ContextUtil.SetAbort() ;                    throw exc ;                }                finally                {                    ServiceDomain.Leave();                }  

Architects Connection

Seit einigen Tagen existiert ein eigenes Informations-Portal für IT-Architekten (www.architectsconnection.de). Dort stehen sehr viele  architekturrelevanten Ressourcen – Fachartikel, Kommentare, Web- und PodCasts, Vorträge, Event-Termine u.v.m  zur Verfügung und soll bei den täglichen Aufgaben helfen und unterstützen. Der Gedanke des Portals ist "Service von Architekten für Architekten". Schauen wir mal wie sich dieses Microsoft Portal entwickelt. 

Exportieren / Umwandeln von DataTable in CSV

Bevor ich aber mit .NET 2.0 so richtig loslege hier noch ein kleiner Codebeitrag. Man hat ja immer wieder die Anforderung Daten in CSV zu exportieren (im Zeitalter von XML für mich unverständlich aber gut ;-) ). Dafür veröffentliche ich jetzt das fünftausenste Code-Beispiel. Zunächst habe ich eine allgemeine Basisklasse geschrieben, die auch für weiter Exportformate genutzt werden kann: using System;using System.Data;using System.Web;using System.Text;using System.IO;namespace GaliNeo.Framework{    /// <summary>    /// Zusammenfassung für BaseConverter.    /// </summary>    public abstract class BaseConverter    {        public BaseConverter()        {        }        /// <summary>        /// Export DataTable to http stream        /// </summary>        /// <param name="oDataTable"></param>        /// <param name="response"></param>        /// <param name="sFileName"></param>        public void ExportToResponseStream(DataTable oDataTable, System.Web.HttpResponse response, string sFileName)        {            response.Clear() ;            response.ClearHeaders();            response.ClearContent();            response.Buffer = true;                        //Very importent because "ü", "ä", usw....            response.ContentEncoding = System.Text.Encoding.Default ;                        response.ContentType = GetHTTPContentType() ;            response.AppendHeader("content-disposition", "attachment; filename=" + HttpUtility.UrlEncode(sFileName, System.Text.Encoding.UTF8)) ;            response.Write( ConvertDataTable(oDataTable).ToString() ) ;                        //close http response            response.End();        }        /// <summary>        /// Export datatable to file        /// </summary>        /// <param name="oDataTable"></param>        /// <param name="sFileName"></param>        /// <returns></returns>        public bool ExportToFile(DataTable oDataTable, string sFileName )         {            try            {                string fullpath = System.IO.Path.GetFullPath( sFileName ) ;                if (System.IO.Directory.Exists ( fullpath ))                {                    System.IO.Directory.CreateDirectory( fullpath ) ;                }                StreamWriter SW;                            SW=File.CreateText(sFileName);                SW.WriteLine(ConvertDataTable(oDataTable).ToString());                            SW.Close();                return true ;            }            catch            {                return false ;            }        }        protected abstract StringBuilder ConvertDataTable(DataTable oDataTable) ;        protected abstract string GetHTTPContentType() ;    }}   Die Klasse ermöglicht es eine Stream entweder auf Festplatte zu schreiben oder aber in den HTTP Responsestream. Die passende CSV-Klasse ist relativ simple und kein wirkliches Geheimnis: using System;using System.Data;using System.IO;using System.Text;namespace GaliNeo.Framework{    /// <summary>    /// Summary description for CSVConvertor.    /// </summary>    public class CSVConverter : BaseConverter    {                protected override string GetHTTPContentType()         {            return "text/csv";        }        /// <summary>        /// To generate CSV file.        /// </summary>        /// <param name="oDataTable"></param>        /// <param name="directoryPath"></param>        /// <param name="fileName"></param>        /// <returns></returns>        protected override StringBuilder ConvertDataTable(DataTable oDataTable)         {                        StringBuilder oStringBuilder = new StringBuilder();                                     // Start, Creating column header            foreach(DataColumn oDataColumn in oDataTable.Columns)                {                oStringBuilder.Append(oDataColumn.ColumnName + ",");                oStringBuilder.Append( System.Environment.NewLine ) ;            }             //End, Creating column header             //Start, Creating rows            foreach(DataRow oDataRow in oDataTable.Rows)                {                                                foreach(DataColumn oDataColumn in oDataTable.Columns)                    {                    oStringBuilder.Append(oDataRow[oDataColumn.ColumnName] + ",");                }                oStringBuilder.Append( System.Environment.NewLine ) ;            }                         //End, Creating rows            return oStringBuilder;        }    }}   Fertig!  

Das Core Team von DotNetNuke bringt ein Shopmodul

Heute hat das Coreteam von DotNetNuke ein weiters Modul frei gegeben. Diesmal handelt es sich um ein Modul das eine Shopfunktionalität abbildet. Bei der Installation sollte man darauf achten das man nicht das Module "Categories" von efficionconsulting installiert hat, denn sonst kommt es zu Konflikten bei der Namensgebung. Diese Hürde einmal genommen ist die weiter Installation kein Problem. Die Funktionalität ist ziemlich Low-Level und an einige Stellen gibt es noch Fehlermeldungen (z.B. bei den Einstellungen). Es gibt aber ein paar ganz gute Ansätze und ich denke das im Laufe der Zeit dieses Modul noch an Funktionsumfang zunimmt.In den nächsten Tagen werde ich wohl auch noch mal in den Source reinschauen ... so einfach aus neugier. Für mich selber ist dieses Modul eher uninteressant, da mein Shop so langsam die Version 1.0 ereicht hat; auch wenn er laut Zeitplanung schon längst fertig sein sollte .. na ja es kommt halt immer anders als man denkt. Mittlerweile ist die Featureliste schon sehr lang - erspare mir diese aber jetzt. Eines der wichtigsten Merkmale ist aber wohl, dass alle öffentlichen Bereiche über Templates pro Portal dynamisch anpassbar sind. Ebenso ist der Bestellprozess über eine XML Workflowbeschreibung komplett frei definierbar. Anpassbarkeit und Konfigurierbakeit ist bei der Implementierung sehr wichtig gewesen. Das erste Projekt wird vermutlich nächste Woche live gehen aber dann nur für eine bestimme Gruppe von Personen.Wer trotzdem mal mehr darüber wissen möchte, kann sich ja bei mir melden. Was mit dem Shop passiert ist noch nicht ganz klar. 

Server Hosting / DotNetNuke Hosting

Eines der doch besten Argumente für die Linux- bzw. PHP-Welt im Webumfeld waren bis vor einiger Zeit immer noch die doch sehr teuren Hostingpakete von Windowsbetriebssystemen. Mittlerweile fallen die Preise ständig und sind auf einem Niveau, wie es auch im Linuxumfeld anzutreffen ist. Das ist besonders für Freunde und Fans von DotNetNuke interessant! Es gibt zwar auch einige Anbieter die ein DotNetNuke Hosting für z.B. 10€ anbiete aber wer gerne Kontrolle über seine System hat sollte sich überlegen einen eigenen Server zu mieten. Nicht nur das man dort der eigene Administrator ist .. man ist bei vielen Punkten nicht auf den Support seinen Providers angewiesen.  Ganz davon abgesehen, dass man auch weiter Anwendungen auf seinem Server unterbringen kann. Ich habe nun schon seit über einem Jahr einen Server bei Strato stehen und bin mit dem Service sehr zufrieden. Wer also ein paar Euro mehr ausgibt bekommt dafür auch deutlich mehr geboten. Ich persönlich möchte das nicht mehr missen. Immerhin läuft auch mein Block darüber und ein paar weitere Anwendungen. Weil ich das Angebot sehr gut finde habe ich oben mal einen Banner eingebaut - wer also einen Buchen will .. einfach klicken :)  

Neuer Version des FCKEditor provider

Am 15 Januar hat Locopon einen neuen alternativen DotNetNuke Provider für den WYSIWYG Editor FCKEditor zum download bereitgestellt. Zu finden under diesem Link.... Dieser Provider ist ein VB.NET OpenSource Projekt (und damit kostenlos) und stellt eine echte Alternative zur FreeTextBox dar - wenn nicht sogar eine besser Lösung. Die einzelnen Features werden auf der Website näher erklärt..... Wer eine deutsche Übersetzung sucht ist auf DeutschnetNuke gut aufgehoben.  

HTML Zeichen aus einem String entfernen

Ich wollte gerade eine Modul etwas benutzerfreundlicher gestalten und bei einem Link im ToolTip einen Kommantar / Vorschau anzeigen. Der Text der im ToolTip angezeigt werden soll liegt im HTML Format vor. Das macht die Ansicht schwer, da im ToolTip keine HTML-Zeichen verarbeitet werden. Habe mir dann einfach ein paar Regular Expressions geschrieben, die mir helfen sollen den Text vom HTML zu befreien. string sHTMLToolTip = ..... //HTML MessagesHTMLToolTip = Regex.Replace( sHTMLToolTip, "<(br|p)>", System.Environment.NewLine , RegexOptions.IgnoreCase | RegexOptions.Multiline);sHTMLToolTip = Regex.Replace( sHTMLToolTip, "<(.|\n)+?>", "", RegexOptions.IgnoreCase | RegexOptions.Multiline); Ich glaube auf die RegEx muss ich nicht näher eingehen ;-)

Cooler ASP.NET Kalender im Outlookstyle

Habe gerade bei The Code Project ein ziemlich cooles ASP.NET Control gefunden. Damit kann man einen Kalender genau wie in Outlook darstellen: http://www.codeproject.com/useritems/daypilot.asp Habe das Control selber noch nicht ausprobiert aber die Demo sieht schon mal sehr vielversprechend aus! Das Beste zu Schluß: Es ist ein OpenSource Projekt ;-)  

Templatesystem Part 3

Eine kleine Änderung habe ich in der Templateengine vorgenommen: Das Control skin aus der der Methode LoadSkin() habe ich nicht nur für diese Methode zur Verfügung gestellt sondern daraus eine protected Variable innerhalb der Klasse gemacht. Somit kann nun die abgeleitete Klasse immer darauf zugreifen und der "Umweg" über sender (siehe Part 2) kann geändert werden. Ich brauchte das gerade für eine Hilfsmethode die ich nicht nur innerhalb der Methode InitializeSkin aufrufen möchte. Keine Ahnung warum ich das nicht direkt so gemacht habe!

Templatesystem Part 2

In meinem ersten Eintrag habe ich beschrieben, wie man eine Grundlage für templategesteuerte DotNetNuke Module erstellen kann. Heute möchte ich kurz darauf eingehen, wie man innerhalb eines Eventhandler auf Steuerelemente des Templates zugreifen kann. Als Beispiel nehme ich hier einen LinkButton.. protected virtual void btnLogIn_Click(object sender, EventArgs e) {    txtBox = (TextBox) ((Control)sender).FindControl ( "txtUserName" );    if (txtBox != null)    {        userName = txtBox.Text ;    }} Der Zugriff erfolgt genau wie bei der InitializeSkin Methode über FindControl. Hier muss man nun lediglich den Parameter sender nehmen und die Methode FindControl darauf anwenden.    

Mit C# rechnen / dividieren von Integer-Werten als Ergebnis kommt eine Double-Zahlen raus

Ich habe gerade eine Komponente von mir nach C# portiert - voher VB.Net. Übrigens geht das sehr gut mit SharpDevelopment. Nun ja auf jeden Fall habe ich in VB.Net eine Berechnung gemacht iPageCount = Convert.ToInt32(System.Math.Ceiling(RecordCount / PagingCount)) Nach C# konveritert sieht das nun so aus: iPageCount = Convert.ToInt32(System.Math.Ceiling( RecordCount / PagingCount )); Jetzt muss ich dazusagen, dass die beiden Werte RecordCount und PagingCount von Typ Integer sind. Wenn man nun in C# die Rechnung 6/4 = 1,5 durchführt kommt aber immer 1 raus. Das liegt daran das C# eine typsichere Sprache ist. Wenn man nun ein korrektes Ergebnis haben möchte muss man die beiden Werte zuerst in einen Double Typ umwandeln. iPageCount = Convert.ToInt32(System.Math.Ceiling( Convert.ToDouble(RecordCount) / Convert.ToDouble(PagingCount) )); Jetzt kommt bei der Rechnung (RecordCount / PagingCount) auch der gewünschte Wert von 1,5 raus. Durch die Funktion System.Math.Ceiling() wird hier auf den Wert 2 aufgerundet.(Ergänzung -> siehe Kommentar)

foreach Statement und Hashtable

Durch eine Hashtable kann man nicht direkt via foreach Statement itterieren.  foreach(ProfileProperty currEntry in objInfo.ExtentedProperty) {    string sUsername = currEntry.Username; } Wenn man so einen Konstrukt abbilden muss dann geht das durch folgenden Umweg:  ProfileProperty baseProp = null ; foreach(System.Collections.DictionaryEntry currEntry in objInfo.ExtentedProperty) {    baseProp = (ProfileProperty)currEntry.Value ; }   Wichtig ist hierbei das man bei der Typumwandlung currEntry.Value zur Konvertierung nimmt, denn sonst gibt es eine Exception.  

Datagrid, DataList, Datarepeater und Radiobuttons

Wer schon mal versucht hat bei einem DataRepeater Radiobuttons hinzuzufügen wird bestimmt ähnliche graue Haare bekommen haben wie ich heute. Die Radiobuttons werden zwar sehr schön angezeigt aber leider funktioniert das Gruppieren von diesen Elementen überhaupt nicht. Das liegt daran das die Klasse Radiobuttons das Interface  "INamingContainer" implementiert und somit jeder RadioButton einen eigenen Namen bekommt. Auch das Attribut "GroupName" bleibt ohne Wirkung... Abhilfe schafft da da ein eigenes ASP.NET Control das unter der URL http://www.codeproject.com/aspnet/How_group_RButtons.asp zu finden ist. Eine Erweiterung für einen Postback gibt es dann noch hier: http://www.codeproject.com/aspnet/groupradiobuttons.asp Allerdings funktioniert dieser Postback nicht wirklich und deswegen habe ich einen kleine Trick angewendet .. (achtung! Jetzt wird es kompliziert *lach*): <GaliNeo:GroupRadioButton AutoPostBack=True  OnCheckedChanged="rbtnProduct_CheckedChanged" id="rbtnProduct" runat="server" GroupName="SelectProd" />         public void rbtnProduct_CheckedChanged(object sender, System.EventArgs e)        {                        string sCommandArgument = ((GroupRadioButton)sender).CommandArgument ;                        Response.Redirect ("http://localhost/dotnetnuke/DesktopModules/GaliNeo/OnlineStore/DashboardAddToCart.aspx?ProductId=" + sCommandArgument, true) ;        } Mit dieser Lösung funktioniert das nun einwandfrei .....

Generierung von random string Zeichenfolgen

Hier ein kurzer Beispielcode, wie man schnell eine Randomzeichenfolge erstellen kann. Nützlich z.B. für Passwörter oder ähnliches. Ausbauen kann man diesen Bereich jetzt natürlich noch indem man Buchstaben wahlweise groß oder klein schreibt. string alphabets = "abcdefghijklmnopqrstuvwxyz";string numbers = "01234567890123456789012345";StringBuilder randomstring = new StringBuilder();Random r = new Random();for(int j=0; j<=20;j++){   for(int i=0;i<=5;i++)   {      randomstring.Append(alphabets[r.Next(alphabets.Length)]);      randomstring.Append(numbers[r.Next(numbers.Length)]);   } }

Beim DNN Installation SQL-Skript werden Zeichen automatisch entfernt

Nachdem ich ein paar sehr witzige Stunden mit den Installationsroutinen (für Module) von DotNetNuke hatte und schon fast verzweifelt habe, kam eine gute Fee und holte mich da raus ... aber alles hübsch der Reihe nach! Ich habe ein eigenes Module geschrieben und dieses DNN Module hatte eine wahnsinnige Enterprise Funktionlität - nämlich folgende: SET newOrderno = ((SELECT MAX(OderNo) FROM TABLE) + 1) Dieses funktionierte auch einwandfrei, allerdings als ich dann das Modul zusammen packte und es auf einem Server installieren wollte, spuckte die Installation immer einen SQL Fehler aus ... "Fehler in der Nähe von 1"Ist auch logisch, denn was da ankam sah so aus: SET newOrderno = ((SELECT MAX(OderNo) FROM TABLE)  1) Das "+" fehlte also ... um das jetzt hier mal abzukürzen: Es lag an dem Dateiformat .. die Textdatei mit den SQL-Befehlen war als ANSI Datei abgespeichert. Nachdem ich diese Datei im UTF-8 Format abgespeicher hatte war das Problem behoben und das "+" stand im SQL-Befehl... Zum Glück gibt es das www.dnnportal.de und Hans-Peter, der auch Nachts noch gute Tipps hat :)   Nur mal so nebenbei:Wenn man eine Textdatei z.B. als Templatevorlage ausließt und es fehlen die Umlaute .. ja dann würde ich diese auch mal im UTF-8 Format speichern....dann beim Auslesen der Datei noch das richtige Format angeben und schon ist mal alle Sorgen los!  

ASP.Net Textbox width / height im Firefox

Ich hatte das Problem, dass ASP.NET eine Textbox im Modus "MultiLine" nicht richtige Breite und Höhe für den Firefox rendert. Im HTML Code sah das so aus: IE:<textarea name="txtComment" id="txtComment" style="height:226px;width:100%;"> Firefox:<textarea name="txtComment" id="txtComment"> Die Lösung des Problem ist es, die Eigenschaften Rows und Cols zu setzen - dann funktioniert es auch im Firefox. Oder der saubere Weg (aufgenommen wegen des Kommentars), die browserCaps modifizieren: <browserCaps>      <!-- GECKO Based Browsers (Netscape 6+, Mozilla/Firefox, ...) //-->      <case match="^Mozilla\/5\.0.+rv:(\d\.\d\.\d).+Gecko">        browser=Gecko        type=${type}        frames=true        tables=true        cookies=true        javascript=true        javaapplets=true        ecmascriptversion=1.5        w3cdomversion=1.0        css1=true        css2=true        xml=true        tagwriter=System.Web.UI.HtmlTextWriter        <case match="rv:(?'version'(?'major'\d+)(?'minor'\.\d+)(?'letters'\w*))">            version=${version}            majorversion=${major}            minorversion=${minor}            <case match="^b" with="${letters}">                beta=true            </case>        </case>    </case></browserCaps> Weiter Infos gibt es unter http://slingfive.com/pages/code/browserCaps/

Konvertierung HTML Farben in eine DotNet Farbe

Hier in kurzes Codebeispiel, wie man aus einer HTML Farbe eine DotNet-Farbe machen kann. Die Umwandlung ist denkbar einfach, denn das .NET Framework hat dafür bereits eine Funktion: System.Drawing.ColorTranslator.FromHtml(#000000 ) Das wäre auch schon das ganze Geheimnis!

Cooles Tool fuer Codegenerierung

Für alle die keine Lizenz von CodeSmith kaufen möchten, aber auf den Luxus der Codegeneriung nicht verzichten möchten, gibt es eine Alternative. Diese Alternative nennt sich MyGeneration und ist zu finden unter: http://www.mygenerationsoftware.com Dieses Tool ist lizenzkostenfrei und biedet alles was man benötigt. Zumindest ist es in meinem Bereich noch nicht an seine Grenzen gekommen. Was mir lediglich fehlt ist eine Art Batch-Job, da es schon manchmal lästig ist die einzelne Gerneriung von Hand anzustoßen. Es gibt auch schon für jede Menge Zwecke / Anwendungsfälle Templates - natürlich auch für DotNetNuke (!).Das Erstellen von MyGeneration-Templates finde ich etwas besser und intuitiver gelößt - kann aber auch nur Einbildung sein ;-)

Dissembler fuer .NET (DotNet) Assemblies

Das Tool Reflector for .NET habe ich bereits vor ein paar Monaten als ein cooles Tool hier im Blog erwähnt. Jetzt habe ich vor kurzen ein noch geileres Plug-In dafür entdeckt:          Reflector.FileDisassembler Das Tool ist von Denis Bauer und erzeugt Source-Code Dateien aus einer .NET Assembly. Es wird einfach in den Reflector for .NET eingebunden und schon kann man sich nicht nur Methoden anschauen sondern sich direkt ganze Files erzeugen lassen :) Ein wirklich cooles Tool für .NET ....

Ein eigenes Eventlog schreiben

Das Schreiben in das Eventlog von Windows ist mit Sicherheit kein Geheimnis mehr und es gibt sehr viele Beispiele dafür.Hier zeige ich nur schnell, wie man in ein eigens - also nicht system, security, usw. - Eventlog von .NET (DotNet) ansprechen kann. Wie eigentlich fasst alles bei mir ist das in C# geschrieben... EventLog eLog = null; // Holds the event log reference.EventLogEntry eLogEntry = null; // A single entry.// To create a special log, then you need to// register an event source first (as you already did in// your example code).if ( ! EventLog.SourceExists( "GaliNeo_Job_Source" ) ) { // Create the new event source.EventLog.CreateEventSource( "GaliNeo_Job_Source", "GaliNeo_Job_Log", "." ); } // Register the new event source.eLog = new EventLog( "GaliNeo_Job_Log" ); eLog.Source = "GaliNeo_Job_Source"; eLog.WriteEntry("My Message,EventLogEntryType.Information) ; // orEventLog.WriteEntry( "GaliNeo_Job_Source", "Special Message", EventLogEntryType.Information, 12, 22 ); Mit den paar Zeilen C# ist das erledigt und man kann eigene EventLog schreiben und später die Daten etwas besser trennen.     

ASP.NET Komponente verliert ihren Viewstate

Super klasse (!) ich habe heute den gesamten Nachmittag verschwendet und habe mal wieder an mir und meinen Verstand gezweifelt! Ich arbeite gerade an einem TabPage - Control. Als Vorlage habe ich den Wizard von DotNetNuke genommen und den Rest reinprogrammiert. Alles gar kein Problem - nur etwas Arbeit. Dann hatte ich aber das Problem, dass z.B. die ASP:Textbox ihren Viewstate verlor. Nach langen suchen und google, ohne jeden Erfolg, habe ich dann alles auskommentiert und dann Stückchen für Stückchen wieder reingenommen. Was soll ich sagen, diese Zeile: _tabCtrl.Rows.Insert(0,_parentTr) ; ist dafür verantwortlich. Ich habe ein Tabelle und füge dynamisch eine Zeile an erste Stelle ein... dadurch scheint dann der ViewState aller Elemente, die darunter angeordnet sind weg zu sein. Jetzt setze ich halt einfach eine zweite Tabelle drüber und dann läuft es.

Bessers Kalender WebControl für asp.net

Bin gerade über einen verbesserten Kalender für ASP.NET gefallen... wer also einen Alternative oder einen ASP.NET Kalender mit erweiterten Funktionen sucht sollte doch einfach mal hier schauen: http://www.codetools.com/aspnet/BetterCalendar.asp http://www.brainjar.com/

Seit Zwei Jahren Veranstalltet Microsoft Webcast Das Sind Technische Vortr%c3%a4ge Pr%c3%a4sentationen Die Man Sich %c3%9cber Das Interne

Seit zwei Jahren veranstalltet Microsoft Webcast. Das sind technische Vorträge / Präsentationen die man sich über das Internet anschauen kann. Nun gibt es eine DVD mit allen bisherigen Webcast. Diese kann man bei Microsoft kostenlos bestellen: hier bestellen..

Richtig runden mit .NET

Hier eine kleine Übersicht, wie man in .NET runden kann .. Abrunden: Wenn man immer abrunde möchte muss man die Funktion Math.Floor verwenden. Floor bekommt als Parameter einen Double-Typ und gibt den nächst kleinere Ganzzahl zurück. Hier ein Beispiel: System.Console.WriteLine("Floor " + System.Math.Floor(1.1));System.Console.WriteLine("Floor " + System.Math.Floor(1.5));System.Console.WriteLine("Floor " + System.Math.Floor(1.9));     Liefert als Ergebnis folgends Zurück: Floor: 1Floor: 1Floor: 1 Aufrunden: Im Gegensatz dazu liefert die Funktion System.Math.Ceiling immer die nächst höhere Ganzzahl Beispiel: System.Console.WriteLine("Ceiling " + System.Math.Ceiling(1.1));System.Console.WriteLine("Ceiling " + System.Math.Ceiling(1.5));System.Console.WriteLine("Ceiling " + System.Math.Ceiling(1.9)); Liefert folgendes zurück: Ceiling 2Ceiling 2Ceiling 2 "Normals Runden" Die Funktion System.Math.Round rundet dagegen in Abhängigkeit der letzten Zahl auf oder ab. System.Console.WriteLine("Round " + System.Math.Round(1.1));System.Console.WriteLine("Round " + System.Math.Round(1.5));System.Console.WriteLine("Round " + System.Math.Round(1.9)); Liefert als Ergebnis: Round 1Round 2Round 2