Verwendung von IntelliSense-Codeausschnitten (Snippets)

Visual Studio bietet eine nützliche Codesnippet-Funktionalität über InteliSense an. Man tippt einfach ein Kürzel und 2x TAB und VS fügt einen definierten Codeblock ein.

Beispiele:

ctor[TAB][TAB] -> fügt innerhalb einer Klasse einen Konstruktor mit der entsprechenden Klassenbezeichnung ein
prop[TAB][TAB] -> fügt innerhalb einer Klasse eine Property ein
cw[TAB][TAB] -> fügt ein Console.Writeline() ein
forr[TAB][TAB] -> fügt eine for-Schleife mit absteigendem Zähler ein
try[TAB][TAB] -> fügt einen try-catch-Block ein

Mehr dazu unter:

developer.com
MSDN

Auf Codeplex ist auch ein Snippet-Designer verfügbar: Snippet Designer

Mehrfachfilter auf Directory.GetFiles() anwenden

// Aufruf:
//
// string[] saFilterList = { "*.csv", "*.txt" };
// List<string-> lFileList = this.GetFilesByFilter(@"c:\temp\", saFilterList);
//
// foreach (string f in lFileList)
// {
//     ...
// }
//

using System.IO;

/// <summary>
/// listet Dateien eines Verzeichnisses anhand eines übergebenen Filters
/// </summary>
/// <param name="sPath">Suchpfad</param>
/// <param name="saFilterList">Filterliste (*.csv, *.txt)</param>
/// <returns>Dateiliste</returns>
public List<string-> GetFilesByFilter(string sPath, string[] saFilterList)
{
    List<string-> lFileList = new List<string->();

    if (Directory.Exists(sPath))
    {
        foreach (string filter in saFilterList)
        {
            lFileList.AddRange(Directory.GetFiles(sPath, filter));
        }
    }

    return lFileList;
}

Speicherauslastung (MEMORYSTATUSEX) auslesen

// Aufruf:
//
// MemInfo.MEMORYSTATUSEX ms = MemInfo.CurrentMemoryStatus;
//
// uint uiMemoryLoad = ms.dwMemoryLoad;
// ulong ulTotalPhys = ms.ulTotalPhysical;
// ulong ulAvailPhys = ms.ulAvailPhysical;
// ulong ulTotalPageFile = ms.ulTotalPageFile;
// ulong ulAvailPageFile = ms.ulAvailPageFile;
// ulong ulTotalVirtual = ms.ulTotalVirtual;
// ulong ulAvailVirtual = ms.ulAvailVirtual;
// ulong ulAvailExtendedVirtual = ms.ulAvailExtendedVirtual;

using System.Runtime.InteropServices;

/// <summary>
/// freeware helper class for getting memory info
/// (W) 2011 by admin of codezentrale.de
/// http://pinvoke.net/default.aspx/kernel32/GlobalMemoryStatusEx.html
/// http://msdn.microsoft.com/en-us/library/aa366589%28v=vs.85%29.aspx
/// </summary>
public static class MemInfo
{
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public struct MEMORYSTATUSEX
    {
        public uint dwLength;
        public uint dwMemoryLoad;
        public ulong ulTotalPhysical;
        public ulong ulAvailPhysical;
        public ulong ulTotalPageFile;
        public ulong ulAvailPageFile;
        public ulong ulTotalVirtual;
        public ulong ulAvailVirtual;
        public ulong ulAvailExtendedVirtual;
    }

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool GlobalMemoryStatusEx(ref MEMORYSTATUSEX lpBuffer);

    /// <summary>
    /// get current memory status struct
    /// </summary>
    public static MEMORYSTATUSEX CurrentMemoryStatus
    {
        get
        {
            MEMORYSTATUSEX ms = new MEMORYSTATUSEX();
            ms.dwLength = (uint)Marshal.SizeOf(typeof(MEMORYSTATUSEX));

            GlobalMemoryStatusEx(ref ms);

            return ms;
        }
    }
}

Die Zielversion von .NET Framework im Projekt einstellen

Manchmal erhält man beim compilieren eines Projektes mit einem integrierten Setupprojekt in VisualStudio 2010 folgende Warnmeldung:

WARNUNG: Die Zielversion von .NET Framework im Projekt entspricht nicht der .NET Framework-Startbedingungsversion “2.0.50727”. Aktualisieren Sie die Version der .NET Framework-Startbedingung, sodass sie der Zielversion von .NET Framework im Dialogfeld “Erweiterte Kompilierungsoptionen” (VB) oder auf der Anwendungsseite (C#, F#) entspricht.

Um Ursache dieser Warnung zu beseitigen, muss man wie folgt vorgehen:

  1. Setup->Gefundene Abhängigkeiten aufklappen
  2. Doppelklick auf “Microsoft .NET-Framework”
  3. Anforderungen für den Zielcomputer->Startbedingungen->.NET Framework wählen
  4. im Eigenschaftsfenster unter Version die benötigte Frameworkversion einstellen

Mit TextRenderer die Breite eines stringbasierten Textes messen

using System.Windows.Forms;

/// <summary>
/// prüft, ob übergebener Text eine best. Länge in Pixeln nicht Überschreitet
/// </summary>
/// <param name="sText">der zur prüfende Text</param>
/// <param name="iLength">max. Textlänge in Pixeln</param>
/// <param name="ftTextFont">angewendete Schriftart</param>
/// <returns>true, else false</returns>
public bool FitsLength(string sText, int iLength, Font ftTextFont)
{
    return (TextRenderer.MeasureText(sText, ftTextFont).Width <= iLength);
}

Weiterführende Informationen zur Klasse TextRenderer: MSDN

[C#] CSV-Daten in DataTable einlesen und in DataGridView anzeigen

// dgvGrid == DataGridView auf dem Formular
private void btnOpen_Click(object sender, EventArgs e)
{
    // Datei öffnen
    if (openFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
    {
        // DataTable hält die gesplitteten CSV-Daten
        DataTable dt = new DataTable();

        // Datei öffnen, hier als UTF8
        using (StreamReader sr = new StreamReader(openFileDialog.FileName, Encoding.UTF8))
        {
            // bis Dateiende lesen
            while (!sr.EndOfStream)
            {
                // Zeile einlesen und anhand des Trennzeichens ";" in einzelne Spalten (stringarray) splitten
                string[] currentline = sr.ReadLine().Split(new string[] { ";" }, StringSplitOptions.None);

                // wenn neue Tabelle (noch keine Spalten enthalten)
                if (dt.Columns.Count == 0)
                {
                    // n Spalten der ersten gelesenen Zeile hinzufügen
                    for (int i = 0; i < currentline.Length; i++)
                    {
                        // als Spaltenüberschrift die eingelesenen Teile des Stringarrays verwenden
                        dt.Columns.Add(currentline[i]);
                    }
                }
                else
                {
                    // ansonsten Daten des Stringarrays zeilenweise hinzufügen
                    dt.Rows.Add(currentline);
                }
            }

            // Stream schließen
            sr.Close();
        }

        // DataTable an das Gitter auf der Oberfläche übergeben und somit anzeigen
        dgvGrid.DataSource = dt;
    }
}

Html-Elemente unter dem Mauszeiger ermitteln

// für "mshtml.IHTMLImgElement" unter Projekt->Verweise->Verweis hinzufügen->COM->Microsoft HTML Object Library hinzufügen
// benötigt wird außerdem ein WebBrowser-Steuerelement "webBrowser" auf dem Formular

// Ereignis, wenn WebBrowser ein Dokument fertig geladen hat
private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    if (e.Url == webBrowser.Url)
    {
        // MouseMove-Event dem eben geladenen Dokument zuweisen
        webBrowser.Document.MouseMove += new HtmlElementEventHandler(Document_MouseMove);
    }
}

private void Document_MouseMove(object sender, HtmlElementEventArgs e)
{
    HtmlDocument doc = sender as HtmlDocument;

    if (doc != null)
    {
        HtmlElement el = doc.GetElementFromPoint(webBrowser.PointToClient(Control.MousePosition));

        if (el != null)
        {
            string sHTML = el.OuterHtml;

            mshtml.IHTMLImgElement htmImg = el.DomElement as mshtml.IHTMLImgElement;

            ...
        }
    }
}

TrailingPathDelimiter für Pfadnamen hinzufügen oder entfernen

using System.IO;

/// <summary>
/// freeware helper class for managing DirectorySeparatorChar
/// (W) 2011 by admin of codezentrale.de
/// </summary>
public static class FileSystem
{
    /// <summary>
    /// include ending DirectorySeparatorChar
    /// </summary>
    /// <param name="path">current path</param>
    /// <returns>path with ending DirectorySeparatorChar</returns>
    public static string IncludeTrailingPathDelimiter(string path)
    {
        return path.EndsWith(Path.DirectorySeparatorChar.ToString()) ? path : path + Path.DirectorySeparatorChar;
    }
    /// <summary>
    /// exclude ending DirectorySeparatorChar
    /// </summary>
    /// <param name="path">current path</param>
    /// <returns>path without ending DirectorySeparatorChar</returns>
    public static string ExcludeTrailingPathDelimiter(string path)
    {
        return path.EndsWith(Path.DirectorySeparatorChar.ToString()) ? path.Remove(path.Length, 1) : path;
    }
}