Willkommen bei ASP.NET Zone. Anmelden | Registrieren | Hilfe
Hallo,
in den letzten Tagen bin ich mal wieder auf ein kleines Problem gestoßen, welches ich euch nicht vorenthalten möchte.

Ich hatte eine Möglichkeit gesucht gewissen Seiteneinstellung wie z.B. Seitentitel oder ausgewähltes Theme dauerhaft abzuspeichern OHNE dabei eine Datenbank verwenden zu müssen.

Meine erste Überlegung dabei war, meine Einstellungen in der Web.Config under der Sektion appSettings zu speichern. Diese Art und Weise war jedoch nicht sehr gut und sauber da die Webseite nach jeder dynamischen Änderung der Web.Config neu kompiliert wurde und diverese andere Fehler aufgetreten sind.

Mit Hilfe eines Kollegen bin ich dann auf das Thema XML Serialization gestoßen. XML Serialization macht dabei nichts anderes, als Objekte in eine XML Struktur zu schreiben welche ebenso auch wieder ausgelesen werden kann und wieder zum Objekt konvertiert werden kann.

Also habe ich folgendes gemacht: Zuerst hatte ich mir eine Klasse angelegt welche diverse Getter und Setter beinhaltet die für die Einstellungen auf meiner Seite wichtig sind.

Settings.cs:
private string strTitle;
private string strTheme;
public Settings()
{
     //
     // TODO: Konstruktorlogik hier hinzufügen
     //
}
public Settings(string valTitle, string valTheme, string valAuthor, string valCopy, string valStatus)
{
     strTitle = valTitle;
     strTheme = valTheme;
}
public string Title
{
     get { return strTitle; }
     set { strTitle = value; }
}
public string Theme
{
     get { return strTheme; }
     set { strTheme = value; }
}


Anschließend habe ich eine Klasse erstellt, welche meine Werte von einem Settingsobjekt in eine XML Struktur schreibt bzw. wieder ausliest. Dabei müssen die Namespaces System.IO und System.XML.Serialization eingebunden werden.

AppConfiguration.cs:
private string strAppCfgPath;
public AppConfiguration(string valPath)
{
     strAppCfgPath = valPath;
}
public void SerializeAppConfig(object _settings)
{
     XmlSerializer _serializer = new XmlSerializer(typeof(Settings));
     FileStream _stream = new FileStream(ConfigPath, FileMode.Create);
     _serializer.Serialize(_stream, _settings);
     _stream.Close();
}
public Settings DeserializeAppConfig()
{
     XmlSerializer _serializer = new XmlSerializer(typeof(Settings));
     FileStream _stream = new FileStream(ConfigPath, FileMode.Open);
     Settings _settings = (Settings)_serializer.Deserialize(_stream);
     _stream.Close();
     return _settings;
}
public string ConfigPath
{
     get { return strAppCfgPath; }
     set { strAppCfgPath = value; }
}


Nun habe ich die Möglichkeit im PreInit-Event meiner Seiten die Werte aus der XML Datei auszulesen...

AppConfiguration _appcfg = new AppConfiguration(MapPath("") + "\\App_Data\\settings.xml");
Settings _settings = _appcfg.DeserializeAppConfig();
Response.Write(_settings.Title);


... bzw. neue Daten in der XML Datei zu speichern.

Settings _settings = new Settings("Seitentitel", "Theme");
AppConfiguration _appcfg = new AppConfiguration(MapPath("") + "\\App_Data\\settings.xml");
_appcfg.SerializeAppConfig(_settings);


Man sollte jedoch unbedingt darauf achten, dass nur Werte in der XML Datei gespeichert werden, welche nicht für die Sicherheit der Webanwendung relevant sind. Sprich: KEINE PASSWÖRTER oder ähnliches!
1 Kommentare
Abgelegt unter: , ,
Hallo,
ich bin vor ein paar Tagen auf ein Problem gestoßen welches den Backgroundworker betrifft.

Ich hatte in einem Projekt eine Routine die etwas zeitaufwendiger war. Das Problem war dabei, dass die Applikation jedes mal eingefroren ist wenn ich diese ausgeführt hatte. Also hatte ich dementsprechend versucht mit einem sogenannten Backgroundworker einen asynchronen Methodenaufruf zu starten um die Oberfläche der Anwendung nicht zu beeinträchtigen.

Dabei bin ich aber erneut auf ein Problem gestoßen. Ich hatte nämlich in meiner Anwendung eine Progressbar welche ich in meiner Methode immer um einen Wert erhöhen wollte. Ruft man dabei die Progressbar wie gewohnt auf...

myProgressbar.Value = 5;

... erhält man einen Fehler:

Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement progressBar1 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.

Nun ja wie kann man jetzt aus einem Backgroundworker Prozess auf eine Progressbar zugreifen? Das Zauberwort heisst "Invoke".

Zuerst erstellen wir eine eigene Methode welche dazu dient unsere Progressbar um einen bestimmten Wert zu erhöhen:

private void UpdateMyProgressbar(int value)
{
myProgressBar.Value = value;
}


Anschließend erstellen wir ein Delegate und weisen diesem im DoWork-Event unsere Methode "UpdateMyProgressbar" zu:

private delegate void DelegateUpdateProgress(int value);
private void myBackgroundworker_DoWork(object sender, DoWorkEventArgs e)
{
DelegateUpdateProgress myProgress = new DelegateUpdateProgress(UpdateMyProgressbar);
for (int i = 0; i < 100; i++)
{
//Hier der Prozess
//...
//Aktualisieren der Progressbar
myProgressbar.Invoke(myProgress, i);
}
}


Was ist ein Delegate? Auszug aus MSDN:
Mit dem delegate-Schlüsselwort wird ein Referenztyp deklariert, mit dem eine benannte oder eine anonyme Methode gekapselt werden kann. Delegaten entsprechen den Funktionszeigern in C++, sie sind jedoch typsicher und geschützt.

Als letztes können wir nun unseren Backgroundworker ganz einfach (z.B. im Form_Load-Event) aufrufen:

myBackgroundworker.RunWorkerAsync();
2 Kommentare
Abgelegt unter: ,
Endlich wieder zuhause!

Es ist vermutlich schon aufgefallen, dass ich schon längere Zeit keinen Blogeintrag mehr geschrieben habe. Grund war, dass ich mit diversen Azubis aus dem Norden Deutschlands auf Studienreise in Brüssel war.

Wir haben uns dort unter anderem das EU-Parlament und das Nato-Hauptquartier angeschaut.

Ab Montag geht es jedoch dann wieder los mit der Arbeit und mit vielen neuen Posts in meinem Blog! :)

Liebe Grüße
Hahne
0 Kommentare
Abgelegt unter:
Wenn man vor hat z.B. ein Div mit schwarzer Hintergrundfarbe ein wenig transparent zu gestalten stößt man schnell auf die Probleme, dass nicht alle Browser diese Transparenz anzeigen können.

Dafür muss man für jeden einzelnen Browser in dem CSS-Element die Transparenz definieren

  • IE:
    • filter:alpha(opacity=90);
  • Mozilla:
    • -moz-opacity: 0.90;
  • Opera:
    • opacity: 0.90;

1 Kommentare
Abgelegt unter:
Wer zum Beispiel eine kleine Fotogallery entwickeln möchte wird sicherlich irgendwann überlegen müssen wie es möglich ist, dass die Bilder nicht nur in einer Spalte untereinander stehen sondern ggf. zwei, drei oder vier Bilder in einer Zeile stehen und dann erst eine neue Zeile angefangen wird.

Dieses zu realisieren ist nicht wirklich schwer da uns dafür ein Control namens "DataList" zur Verfügung gestellt wird.

In diesem Datalist hat man die Möglichkeit die "RepeatDirection" auf horizontal und die "RepeatColumns" auf 2 zu setzen. Sobald man nun das Control an eine Datenquelle bindet werden immer zwei Datensätze in einer Zeile stehen und erst dann wird eine neue Zeile begonnen.
0 Kommentare
Abgelegt unter: ,
Hallo ihr!

Ich habe mal wieder etwas neues lernen dürfen. Die so genannte "Methodenüberladung". Was ist das eigentlich? Im E-Book von Galileo Computing steht:

Zitat: Von einer Methodenüberladung wird bekanntlich gesprochen, wenn sich zwei gleichnamige Methoden einer Klasse nur in ihrer Parameterliste unterscheiden.

Genau diese Methodenüberladung habe ich mir jetzt zu nutzen gemacht und bin total begeistert wieviel arbeit man sich dadurch ersparen kann. Hier mal ein Beispiel:

Ich rufe bei meinem Seitenaufruf "scheinbar" immer wieder die selbe Methode auf jedoch übergebe jeweils immer andere Werte.

protected void Page_Load(object sender, EventArgs e)
{
//Aufruf der Methode mit dem Stringparameter
//Ausgabe: "Hello World"
response.write(myReturn("Hello World"));
//Aufruf der Methode mit dem Integerparameter
//Ausgabe: 1024
response.write(myReturn(1024).ToString());
}
public string myReturn(string myStringValue)
{
return myStringValue;
}
public integer myReturn(integer myIntegerValue)
{
return myIntegerValue;
}


Was ich hier jetzt gemacht habe ist, dass ich jeweils immer eine Methode mit dem gleichen Namen angelegt habe, wobei sich diese lediglich durch die Parameter unterscheiden. Je nachdem ob ich einen String oder einen Integer als Parameter mitgebe wird beim Methodenaufruf eine der beiden Methoden ausgeführt.

Man sollte einfach mal ein wenig mit der Methodenüberladung experimentieren. Man kann damit viele nützliche und tolle Sachen realisieren und viel Zeit sparen!
2 Kommentare
Abgelegt unter: ,
Hallo,
seit langem melde ich mich auch mal wieder!

Ich habe im laufe meines Projektes an dem ich z.Z. arbeite immer wieder Stellen entdecken können an denen man sehr gut Codezeilen einsparen konnte und der Code dabei gut lesbar blieb. So hatte ich z.B. einen solchen Fall bei meinem Login. Ich hatte in einer Klasse meine Prüfung ob der User erfolgreich eingeloggt worden ist. Diese gab dementsprechend dann "true" bzw. "false" zurück. Auf der Seite "Login.aspx", wo mein Logincontrol platziert war, hatte ich als erstes einen ziemlich langen Code stehen...

if(Auth.UserAuth(Login1.UserName, Login1.Password))
{
e.Authenticated = true;
}else{
e.Authenticated = false;
}


... welcher nach längerem Betrachten auch super gut abgekürzt werden konnte indem ich folgendes schrieb:

e.Authenticated = Auth.UserAuth(Login1.UserName, Login1.Password));

Was ich damit sagen will ist, dass man sich auch mal genügend Zeit nehmen sollte um den Code genau anzuschauen und zu gucken ob man diesen nicht ggf. auch mal wie in meinem Fall Codezeilen kürzer und effizienter schreiben könnte. Wobei man dabei auch vorsichtig sein muss, dass der Code dadurch nicht unlesbar wird!
1 Kommentare
Abgelegt unter: ,
Hallo!
Gestern hatte ich an einem Formular gearbeitet welches die eingegebenen Daten ganz einfach in eine SQL-Datenbank speichert. Als ich diese dann wieder ausgegeben habe waren aber jedesmal die Zeilenumbrüche die ich vorher mit der "Enter"-Taste eingefügt habe verschwunden.

Meine Frage: Wie bekomme ich das jetzt hin, dass Zeilenumbrüche in der Datenbank gespeichert werden?

Ganz ehrlich. Ich habe es mir schwerer vorgestellt. Vorerst muss jedem klar sein, dass Zeilenumbrüche in einer Textbox (die mit einem "Enter"-Tastendruck hinzugefügt werden) mit \n dargestellt werden. Diese müssen vor dem abspeichern in die Datenbank einfach durch ein <br /> ersetzt werden.

//String erstellen und Textboxwert übergeben
string strMessage = txtMessagebox.Text;
//Zeichen ersetzen durch ein Zeilenumbruch <br>
strMessage = strMessage.Replace("\n", "<br />");



3 Kommentare
Abgelegt unter: ,
Hallo!
Ich stand in den letzten beiden Tagen mal wieder vor einem Problem was ich nun glücklicherweise gelöst habe. Dieses möchte ich euch natürlich nicht vorenthalten!

Ich habe für meinen Freundeskreis ein kleines Gästebuch programmiert wobei ich Hintergrundbilder verwendet habe die transparent waren und immer eine Größe von ca. 2 x 1 Pixel hatten. Diese Hintergrundbilder habe ich in meinem CSS als Hintergrundbilder definiert und dann in meinen Tabellen u.s.w. wieder verwendet. Das Problem war jetzt nur, dass wenn man die Seite mit dem Internet Explorer angeschaut hat diese total am ruckeln war. Das Problem trat jedoch nur im IE auf und nicht in anderen Browsern wie z.B. Firefox oder Safari.

Anscheind kann der IE diese kleinen und immer wiederholenden Bilddateien nicht so schnell verarbeiten, sodass ich alle meine Hintergrundbilder vergrößert habe.

Nun läuft alles prima!
1 Kommentare
Abgelegt unter:
Hallooooooooooooooo!
Ich habe mal wieder Zeit gehabt um ein wenig im Internet zu stöbern und bin dabei auf den Codeparser.NET gestoßen.

Was ermöglichst uns dieser Codeparser.NET? Er hilft uns dabei den sogenannten BB-Code ins ganz normale HTML zu übersetzen. Ich finde dieses Tool spitze und habe es schon in einer meiner Webanwendungen verbaut.

http://www.codeparser.net/

BB-Code? Was ist das?
Bestimmt hat jeder schon einmal BB-Code verwendet. Hauptsächlich in irgendwelchen Internetforen. Einige Befehle laute z.B. so:

[code]...[/code]
[IMG]...[/IMG]



0 Kommentare
Abgelegt unter:
Hallo,
ich habe mich heute mal ein wenig mit dem Thema Paging auseinander gesetzt da ich z.Z. an einem Gästebuch arbeite welches die Ausgaben über ein Repeater macht. Da ich aber nicht alle Einträge auf einer Seite stehen haben möchte wollte ich gerne eine Pagerfunktion einbauen.

Also habe ich mir einmal das PagedDataSource-Objekt zu herzen genommen.

Zuerst habe ich ganz normal meine Daten aus der Datenbank abgefragt und diese in ein DataSet-Objekt gespeichert. Anschließend habe ich dann die wichtigen Einstellungen für das Paging vorgenommen:

//Objekt erstellen
PagedDataSource myPagedSource = new PagedDataSource();
//Die DataSet-Tabelle an das PagedDataSource-Objekt binden
myPagedSource.DataSource = myDataSet.Tables["Tablename"].DefaultView;
//Paging erlauben
myPagedSource.AllowPaging = true;
//Festlegen wieviel Datensätze pro Seite dargestellt werden sollen
myPagedSource.PageSize = 10;
//Aktuelle Seite; die Variable CurrentPage ist die Nummer der aktuellen Seite
myPagedSource.CurrentPageIndex = CurrentPage;


Als letztes muss das PagedDataSource-Objekt nur noch an den Repeater gebunden werden.

Den CurrentPageIndex kann man jetzt ganz einfach ändern indem man über Links die nächst höhere bzw. kleinere Seite über z.B. einen QueryString mitteilt (z.B. Default.aspx?page=3).
Um einigen Webseitenbenutzer komplizierte Fehlerseiten zu ersparen ist es in ASP.NET möglich eigene Fehlerseiten in der Web.Config zu definieren.

Im Bereich "<system.web>" kannt man den Bereich "<customErrors>" anlegen.

<customErrors mode="RemoteOnly" defaultRedirect="App_Error/Default.aspx">
<error statusCode="404" redirect="App_Error/FileNotFound.aspx"/>
</customErrors>


Im Bespielcode wurden gerade zwei eigene Fehlerseiten definiert. Eine Defaultfehlerseite und eine für den Fehler 404 (Datei nicht gefunden).

mode: Modus ob die Fehlerseiten angezeigt werden dürfen (On, Off, RemoteOnly)

defaultRedirect: Fehlerseite, welche angezeigt wird wenn keiner der definierten Fehler aufgetreten ist.

statusCode: Art der Fehlermeldung (Auflistung aller Meldungen findet ihr auf SelfHTML.org)

redirect: Fehlerseite, die bei definierten Fehler aufgerufen werden soll
1 Kommentare
Abgelegt unter:
Ich möchte zuerst einmal alle Besucher meines Blogs willkommen heissen!

Ich habe diesen Blog errichtet um im laufe meiner Ausbildung, welche ich im letzten Jahr (2007) begonnen habe, Lösungen von Problemen zu posten auf die ich in der Zeit so gestoßen bin. Dabei gelten die Beiträge einerseits für mich als Nachschlagewerk um mir irgendwann noch einmal Dinge vor Augen führen zu können aber ebenfalls möchte ich euch meine Beiträge nicht vorenthalten und ich hoffe, dass ich einigen von euch auch mit meinem Posts helfen kann.

Gruß
Hahne