Meine GUI blockiert, was kann ich tun?
Die GUI blockiert meist aus dem selben Grund:
Eine Anweisung welche ausgeführt wurde benötigt zu viel Zeit. Diese Abfrage laufen in der Regel in dem selben Thread wie deine GUI. Um dies zu beheben muss man die aufwändige Anweisung in einen extra Thread packen.
Dies kann man auf mehrere Wege lösen:
1. Mittels "new Thread(new ThreadStart(METHODENNAME)).Start()"
2. Mittels einem BackgroundWorker
3. Benutzen eines Timers (System.Timers.Timer) **
** Update 20.08.2010:
Ein Benutzer gab mir den Tipp, dass man auch System.Timers.Timer verwenden kann (siehe Punkt 3).
Bitte beachtet dabei folgenden Artikel (englisch): LINK
...der rest liegt bei euch!
Gibt es weitere Fragen? Schreibt in den Kommentaren oder schreibt mir eine E-Mail!
[SVN / C#] Entfernen von “bin” und “obj”- Ordnern im gesamten SVN Repository
Hallo,
letztens hatte ich enorme Probleme durch vorhandene "bin" und "obj" Ordner im SVN Repository.
Mein Tipp ist: Gar nicht erst committen!
Ihr könnt allerdings auch nachträglich aufräumen durch verwendung folgendes Scripts (benötigt SharpSvn Library für .NET):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | using System; using System.Collections.Generic; using System.Windows.Forms; using SharpSvn; using System.Net; using System.Collections.ObjectModel; using System.Diagnostics; static List<Uri> badFolders = new List<Uri>(); public static void Main(string[] args) { InitializeComponent(); using (SvnClient client = new SvnClient()) { GetDirectories(client, SvnTarget.FromString("svn://IPADRESSE/")); DeleteDirectories(client); } } private static void GetDirectories(SvnClient client, SvnTarget target) { client.Authentication.DefaultCredentials = new NetworkCredential("BENUTZERNAME", "PASSWORT"); Collection<SvnListEventArgs> listResults = new Collection<SvnListEventArgs>(); client.GetList(target, out listResults); foreach (SvnListEventArgs e in listResults) { if (e.EntryUri.ToString().EndsWith("/bin/") || e.EntryUri.ToString().EndsWith("/obj/")) { if (!badFolders.Exists(delegate(Uri s) { return s == e.EntryUri; })) { Debug.Print("Found: " + e.EntryUri.ToString()); badFolders.Add(e.EntryUri); } } if (e.EntryUri.ToString().EndsWith("/")) { Debug.Print("-> " + e.EntryUri.ToString()); GetDirectories(client, SvnTarget.FromUri(e.EntryUri)); } } } private static void DeleteDirectories(SvnClient client) { SvnDeleteArgs arg = new SvnDeleteArgs(); arg.LogMessage = "Automatisierte Löschung von bin und obj Ordnern."; client.RemoteDelete(badFolders, arg); } |
Bitte die Wörter IPADRESSE, BENUTZERNAME und PASSWORT
durch eure Angaben ersetzen!
Alternativ kann in der untersten Methode noch die LogMessage verändert werden.
Ich freue mich auf euer Feedback, eure Kritik und Wünsche.
[MSSQL] Paging in SQL Server 2005 (Northwind Database)
Hier eine alternative zum "LIMIT"-Befehl von MySQL:
1 2 3 4 5 | SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY ProductName ASC) AS rownum, ProductID, ProductName FROM Northwind.dbo.Products) AS Products WHERE rownum BETWEEN 11 AND 10 ORDER BY rownum ASC |
Es werden aus der Tabelle "Products" (Zeile 3) die Spalten "ProductID" sowie "ProductName" ausgegeben.
Mittels ROW_NUMBER lässt sich festlegen, von welcher Startposition bis zu welcher Position gelesen werden soll.
In unserem Fall von Zeile 11 bis 20 (also genau 10 Einträge). Das Paging lässt sich dadurch sehr leicht realisieren.
Anmerkung: Ein "ORDER BY rownum" ist erforderlich, da die Reihenfolge unterschiedlich sein kann.
[C#] – HtmlControl to String
Deutsch - Ein schneller weg ein HtmlControl, oder beliebiges anderes Control welches HtmlControl als Basis hat, in einen String zu konvertieren.
English - A quick way to convert a HtmlControl into a String.
1 2 3 4 5 6 7 | public static string ToHtml(this HtmlControl c) { StringBuilder sb = new StringBuilder(); StringWriter sw = new StringWriter(sb); HtmlTextWriter writer = new HtmlTextWriter(sw); c.RenderControl(writer); return sb.ToString(); } |
1 2 3 | HtmlTableRow row = new HtmlTableRow(); // ... string myRow = row.ToHtml(); |
[C#] Silverlight – Timer
![]()
Viele kennen die Timer Klasse bei WindowsForms Anwendungen, diese Klasse kann man in Silverlight & WPF aber nicht verwenden, zumindest sollte man das nicht. Es gibt allerdings eine ähnliche Klasse - Der DispatcherTimer im Namespace "System.Windows.Threading".
Hier ein kleines Beispiel:
1 2 3 | DispatcherTimer dispatcherTimer = new DispatcherTimer(); dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick); // dispatcherTimer_Tick wird bei jedem Tick aufgerufen dispatcherTimer.Interval = new TimeSpan(0, 0, 3); // Stunden, Minuten, Sekunden |
Und die dazugehörige Methode:
1 2 3 | void dispatcherTimer_Tick(object sender, EventArgs e) { // code... } |
Diese Methode würde laut diesem Beispiel alle 3 Sekunden aufgerufen werden.
Wichtig zu erwähnen wäre noch, dass der DispatcherTimer Enabled sein muss. Dies erfolgt durch setzen der IsEnabled Eigenschaft auf "true".
MacOSX – Webdav im Finder anzeigen
Um unter Mac zum Beispiel das MediaCenter von GMX (webdav) anzuzeigen, genügen nur wenige Klicks:
- Im Finder auf "Mit Server verbinden ..." klicken.
- Die entsprechende Webdav Adresse eingeben, bei GMX wäre dies folgende: "https://mediacenter.gmx.net"
- Anschließend noch die Zugangsdaten eingeben, bei GMX wäre das bei Benutzername die Email-Adresse oder die Kundennummer und das zugehörige Passwort.
- Fertig! Im Finder wird nun das Mediacenter angezeigt.
[MySQL] Dumping database with triggers and routines
Um eine MySQL Datenbank mit Trigger und Routinen zu exportieren, genügt folgende Kommandozeile:
1 | mysqldump -u root -p --triggers --routines DATENBANK > dump.sql |
Bitte ersetzen Sie "DATENBANK" mit dem Namen ihrer Datenbank!
SQLite3 – Teil II
Um in SQLite3 eine neue Datenbank zu erstellen, gibt es 2 Möglichkeiten:
1 | SQLiteConnection.CreateFile("datenbank.sqlite"); |
Dies erstellt eine Leere Datei, den selben Effekt haben wir auch durch folgende Zeile:
1 | File.Create("datenbank.sqlite"); |
Damit aus diesen leeren Dateien auch eine echte SQLite3 Datenbank entsteht, müssen Tabellen angelegt werden:
1 2 3 4 5 6 7 8 9 10 11 12 | StringBuilder sb = new StringBuilder(); sb.Append(@"CREATE TABLE [Test] ("); sb.Append(@" [ID] integer PRIMARY KEY NOT NULL,"); sb.Append(@" [MeineSpalte] varchar(32) NOT NULL"); sb.Append(@");"); sb.Append(@"INSERT INTO [Test] VALUES(""Hallo Welt!"");"); using (cmd = new SQLiteCommand(sb.ToString(), conn)) { result = cmd.ExecuteNonQuery(); } |
Nun wurde aus der leeren Datei eine SQLite3 Datenbank.
--------------------------------------------------
SICHERHEIT (Passwortschutz)
--------------------------------------------------
Um die Datenbank mit einem Kennwort zu versehen muss eine neue Verbindung aufgebaut werden, die Verbindung darf aber nicht geöffnet werden, sprich: Es darf nur der ConnectionString angegeben werden.
Anschließend genügt folgender Befehl:
1 | conn.SetPassword("geheim"); |
Wurde das Passwort einmal gesetzt, so muss anschließend der ConnectionString angepasst werden, alternativ kann man das Passwort im ConnectionString auch weglassen und jedesmal "SetPassword" direkt vor dem Öffnen der Datenbank setzen!
--------------------------------------------------
Passwort ändern
--------------------------------------------------
Um das Passwort zu ändern, muss die Datenbank erfolgreich geöffnet werden.
Nachdem die Datenbank geöffnet wurde, kann man mit folgendem Code das gesetzte Passwort ändern:
1 2 3 | if (conn != null && conn.State == ConnectionState.Open) { conn.ChangePassword("anderes_passwort"); } |
Es empfiehlt sich, die Datenbank anschließend zu schließen und neu zu öffnen:
1 2 3 4 | if (conn != null && conn.State != ConnectionState.Closed) { conn.Close(); conn.Dispose(); } |
1 2 3 | conn = new SQLiteConnection(connectionString); conn.SetPassword("anderes_passwort"); conn.Open(); |
Aero Snippets – Updated: 25.05.2010
--------------------------------------------------
Auslesen ob Aero aktiviert ist:
--------------------------------------------------
[DllImport("dwmapi.dll", PreserveSig = false)] private static extern bool DwmIsCompositionEnabled();
public static bool IsAeroEnabled { get { try { return DwmIsCompositionEnabled(); }catch(Exception e) { return false; } } }
--------------------------------------------------
Aktuelle Aero Window Farbe auslesen:
--------------------------------------------------
Um die Aktuelle Fensterfarbe auszulesen, kann man sich folgendem Code zu nutze machen:
[DllImport("dwmapi.dll", PreserveSig = false)] private static extern void DwmGetColorizationColor(out int pcrColorization, [MarshalAs(UnmanagedType.Bool)]out bool pfOpaqueBlend);
try { int argb; bool opaque; DwmGetColorizationColor(out argb, out opaque); return Color.FromArgb(argb); } catch (Exception) { // Fehler beim Lesen der Farben, tritt meistens dann auf, // wenn man Zwischen Aero und dem Basic Theme hin und her wechselt oder // Aero nicht aktiviert war. }
--------------------------------------------------
Glass Bereich bei der eigenen Anwendung ändern:
--------------------------------------------------
Um dies zu ermöglichen benötigen wir folgenden Code:
[DllImport("dwmapi.dll", PreserveSig = false)] private static extern int DwmExtendFrameIntoClientArea(IntPtr hwnd, ref MARGINS margins);
[StructLayout(LayoutKind.Sequential)] public struct MARGINS { public MARGINS(int left, int right, int top, int bottom) { this.CXLeftWidth = left; this.CXRightWidth = right; this.CYBottomHeight = bottom; this.CYTopHeight = top; } public int CXLeftWidth; public int CXRightWidth; public int CYTopHeight; public int CYBottomHeight; public override int GetHashCode() { return base.GetHashCode(); } public override bool Equals(object obj) { return base.Equals(obj); } public static bool operator ==(MARGINS x, MARGINS y) { if ((x.CXLeftWidth == y.CXLeftWidth) && (x.CXRightWidth == y.CXRightWidth) && (x.CYBottomHeight == y.CYBottomHeight) && (x.CYTopHeight == y.CYTopHeight)) return true; return false; } public static bool operator !=(MARGINS x, MARGINS y) { if ((x.CXLeftWidth == y.CXLeftWidth) && (x.CXRightWidth == y.CXRightWidth) && (x.CYBottomHeight == y.CYBottomHeight) && (x.CYTopHeight == y.CYTopHeight)) return false; return true; } }
Wir benötigen eine öffentliche Funktion in unserer Klasse:
public static void ExtendGlass(IntPtr hwnd, MARGINS margins) { try { int result = DwmExtendFrameIntoClientArea(hwnd, ref margins); } catch (Exception e) { // ... } }
Beispiel zum Aufrufen, am besten auf der Hauptform nach "InitializeComponent();":
if (Aero.IsAeroEnabled) { Aero.ExtendGlass(this.Handle, new Aero.MARGINS(0, 0, 33, this.Width)); }
Hinweis:
Aero ist der Name meiner Klasse!
Damit der Glass Effekt eintritt muss nun auf der Hauptform ein Schwarzer Hintergrund an den Stellen sein welche hinterher Transparent wirken sollen. Hierzu überschreiben wir die "OnPaintBackground" Funktion unserer Form, alternativ kann man an den Stellen auch ein Panel mit Schwarzem Hintergrund positionieren:
protected override void OnPaintBackground(PaintEventArgs e) { base.OnPaint(e); if (Aero.IsAeroEnabled) { e.Graphics.Clear(Color.Black); Rectangle clientArea = new Rectangle( 0, 0, this.Width, 33 ); Brush b = new SolidBrush(this.BackColor); e.Graphics.FillRectangle(b, clientArea); } }
Viel Spaß!
| DOWNLOAD | |
| Aero.cs | |
[C#] FileUpload
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | public static string UploadFile(string fileName) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.myDomain.de:80/path/upload.php"); request.Method = "POST"; request.ContentType = "text/plain"; //Entsprechenden MIME-Type angeben: http://de.selfhtml.org/diverses/mimetypen.htm using (Stream writeStream = request.GetRequestStream()) { string content = string.Empty; using (StreamReader sr = new StreamReader(HttpContext.Current.Server.MapPath(fileName))) { content = sr.ReadToEnd(); } using (StreamWriter sw = new StreamWriter(writeStream)) { sw.Write(content); } } string result = string.Empty; using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { using (Stream responseStream = response.GetResponseStream()) { using (StreamReader readStream = new StreamReader(responseStream, Encoding.UTF8)) { result = readStream.ReadToEnd(); } } } return result; } |

