[C#] DataGridView Zeile verschieben (move up/down)

// move up
private void btnUp_Click(object sender, EventArgs e)
{
    if (dataGridView1.SelectedCells.Count -> 0)
    {
        int idx = dataGridView1.SelectedCells[0].OwningRow.Index;

        if (idx -> 0)
        {
            int col = dataGridView1.SelectedCells[0].OwningColumn.Index;
                
            DataGridViewRowCollection rows = dataGridView1.Rows;
            DataGridViewRow row = rows[idx];
                
            rows.Remove(row);
            rows.Insert(idx - 1, row);

            dataGridView1.ClearSelection();
                
            dataGridView1.Rows[idx - 1].Cells[col].Selected = true;
        }
    }
}

// move down
private void btnDown_Click(object sender, EventArgs e)
{
    if (dataGridView1.SelectedCells.Count -> 0)
    {
        int idx = dataGridView1.SelectedCells[0].OwningRow.Index;

        if (idx < dataGridView1.Rows.Count)
        {
            int col = dataGridView1.SelectedCells[0].OwningColumn.Index;

            DataGridViewRowCollection rows = dataGridView1.Rows;
            DataGridViewRow row = rows[idx];

            rows.Remove(row);
            rows.Insert(idx + 1, row);

            dataGridView1.ClearSelection();

            dataGridView1.Rows[idx + 1].Cells[col].Selected = true;
        }
    }
}

[C#] DataGridView verwenden

  • DataGridView aus der Toolbox auf eine Form ziehen
  • rechts klicken und “Spalten bearbeiten …” wählen
  • ungebundene Spalte, Name “cCheck”, Typ “DataGridViewCheckBoxColumn”, Headertext “Check” hinzufügen
  • ungebundene Spalte, Name “cTime”, Typ “DataGridViewTextBoxColumn”, Headertext “Zeit” hinzufügen
  • ungebundene Spalte, Name “cValue”, Typ “DataGridViewTextBoxColumn”, Headertext “Wert” hinzufügen
  • ungebundene Spalte, Name “cUnit”, Typ “DataGridViewTextBoxColumn”, Headertext “Einheit” hinzufügen
  • Schließen
  • auf “Zeit” klicken und Eigenschaft Layout->Frozen auf true (fixiert Spalte “Zeit” beim Scrollen)
  • Ok zum Schließen
  • DataGridView Eigenschaften->AllowUserToAddRows = false
  • DataGridView Eigenschaften->AllowUserToDeleteRows = false
private void DataGridView()
{
    // Zeilen zum DataGridView hinzufügen
    for (int i = 1; i < 10; i++)
    {
        // neue Zeile erzeugen
        DataGridViewRow r = new DataGridViewRow();
        r.CreateCells(dataGridView1);

        // Zellwerte eintragen
        r.Cells[0].Value = true; // Check-Spalte
        r.Cells[1].Value = i.ToString();
        r.Cells[2].Value = (i * i).ToString();
        r.Cells[3].Value = "mm";

        // Zeile dem DataGridView hinzufügen
        dataGridView1.Rows.Add(r);
    }

    // Spaltenname von "Zeit" auf "Index" ändern
    dataGridView1.Columns[0].HeaderCell.Value = "Index";
    // Schrift ändern, siehe auch Eigenschaft ColumnHeadersDefaultCellStyle im Properties-Editor
    dataGridView1.Columns[0].HeaderCell.Style.Font = new Font("Microsoft Sans Serif", 9.75F, FontStyle.Bold);

    // Zugriff auf Zelle [0, 0]
    dataGridView1[0, 0].Value = "0.0";
    dataGridView1[0, 0].Style.ForeColor = Color.Fuchsia;
    dataGridView1[0, 0].Style.BackColor = Color.LightGreen;
}

[C#] Fließkommazahlen richtig runden

// NewSchool, mit .NET-Funktion
double x = Math.Round(1.56789, 2);

// Oldschool1
double y = RoundToQuick(-12345.6789, 3);
private double RoundToQuick(double z, int digits)
{
    double p10 = Math.Pow(10.0, (double)digits);
    return z >= 0.0 ? (int)(z * p10 + 0.5) / p10 : (int)(z * p10 - 0.5) / p10;
}

// Oldschool2
double z = RoundToFull(-12345.6789, 3);
private double RoundToFull(double z, int digits)
{
    double p10 = Math.Pow(10.0, (double)digits);
    return z >= 0.0 ? Math.Floor(z * p10 + 0.5) / p10 : Math.Ceiling(z * p10 - 0.5) / p10;
}

[C#] DataTable als XML Textdatei speichern

private void SaveDataTable(DataTable dt, string filename)
{
    DataSet ds = new DataSet("TestDataSet");
    ds.ExtendedProperties["TimeStamp"] = DateTime.Now;
    ds.ExtendedProperties["Company"] = "TestCompany";

    ds.Tables.Add(dt);
    string xml = ds.GetXml();

    StreamWriter sw = new StreamWriter(filename, false, Encoding.UTF8);
    sw.Write(xml);
    sw.Close();
}

[C#] Arbeit mit DataTable

private void DataTableTest()
{
    // DataTable "TestTable" erzeugen
    DataTable dt = new DataTable("TestTable");

    // Primärschlüssel
    DataColumn c_id = new DataColumn("ID", typeof(int));
    c_id.ReadOnly = true;
    c_id.Caption = "ID";
    c_id.AllowDBNull = false;
    c_id.Unique = true;
    c_id.AutoIncrement = true;
    c_id.AutoIncrementSeed = 0;
    c_id.AutoIncrementStep = 1;
    c_id.ColumnMapping = MappingType.Attribute;

    // weitere Spalten
    DataColumn c_herst = new DataColumn("Hersteller", typeof(string));
    DataColumn c_farbe = new DataColumn("Farbe", typeof(string));

    // Spalten hinzufügen
    dt.Columns.AddRange(new DataColumn[] { c_id, c_herst, c_farbe });

    // Primärschlüsselspalte "ID" setzen
    DataColumn[] prim = new DataColumn[1];
    prim[0] = dt.Columns["ID"];
    dt.PrimaryKey = prim;

    // eine Zeile hinzufügen, Spaltenzugriff über Index
    DataRow dr1 = dt.NewRow();
    dr1[1] = "Audi";
    dr1[2] = "grün";
    dt.Rows.Add(dr1);

    // eine Zeile hinzufügen, Spaltenzugriff über Name
    DataRow dr2 = dt.NewRow();
    dr2["Hersteller"] = "BMW";
    dr2["Farbe"] = "blau";
    dt.Rows.Add(dr2);

    // zwei komplette Zeilen hinzufügen
    dt.Rows.Add(new string[] { null, "VW", "gelb" });
    dt.Rows.Add(new string[] { null, "Opel", "weiß" });

    this.DisplayDataTable(dt);

    // Zeile "Audi" anhand des Primärschlüssels suchen
    DataRow dr = dt.Rows.Find(0);
    dr["Farbe"] = "orange";

    // Änderungen übernehmen
    dt.AcceptChanges();

    this.DisplayDataTable(dt);

    // Zeile "Opel" anhand des Primärschlüssels suchen
    DataRow drg = dt.Rows.Find("3");

    // Zeile löschen
    drg.Delete();

    // Änderungen übernehmen
    dt.AcceptChanges();

    this.DisplayDataTable(dt);
}
/// <summary->
/// DataTable zeilenweise auf Console ausgeben
/// </summary->
/// <param name="dt"->DataTable</param->
public void DisplayDataTable(DataTable dt)
{
    foreach (DataRow r in dt.Rows)
    {
        for (int i = 0; i < dt.Columns.Count; i++)
        {
            Console.Write(r[i] + " | ");
        }

        Console.WriteLine();
    }
    
    Console.WriteLine();
}

[C#] Spaltenbreite eines PropertyGrids festlegen

  • SetPropertyGridColumnWidth() simuliert das Verstellen der Spaltenbreite mit der Maus
  • das PropertyGrid muss sichtbar sein (visible == true)
  • Funktionsaufruf funktioniert nicht im Form-Konstruktor, da dort das PropertyGrid noch nicht sichtbar ist
using System;
using System.Windows.Forms;
using System.Reflection;

// statt im Konstruktor die Breite einzustellen, lieber das Ereignis Shown()
// benutzen, da dies erst eintritt, nachdem die gesamte Form schon angezeigt wurde
private void Form1_Shown(object sender, EventArgs e)
{
    this.SetPropertyGridColumnWidth(PropertyGrid1, 100);
}

// Spaltenbreite eines Propertygrids setzen
private void SetPropertyGridColumnWidth(PropertyGrid grid, int width)
{
    if (grid != null)
    {
        FieldInfo fi = grid.GetType().GetField(@"gridView", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.GetField);
        if (fi != null)
        {
            Control view = fi.GetValue(grid) as Control;
            if (view != null)
            {
                // Funktion "MoveSplitterTo" holen
                MethodInfo mi = view.GetType().GetMethod(@"MoveSplitterTo", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod);
                if (mi != null)
                {
                    // Funktion "MoveSplitterTo" ausführen
                    mi.Invoke(view, new object[] { width });
                }
            }
        }
    }
}

[C#] XML-Daten lesen

// XML-Datenobjekt erzeugen
XmlDocument xml = new XmlDocument();

// XML-Daten von einer URL lesen
xml.Load(new XmlTextReader("www.xmllesen.de"));

// Stringwert einer XML-Node lesen
string city = xml["weatherdata"]["location"]["name"].InnerText;

// testen, ob in einer Node weitere ChildNodes vorhanden sind
if (xml["weatherdata"]["forecast"].HasChildNodes)
{
    // alle ChildNodes durchgehen
    for (int i = 0; i < xml["weatherdata"]["forecast"].ChildNodes.Count; i++)
    {
        // ChildNode anhand des Indexes holen
        XmlNode node = xml["weatherdata"]["forecast"].ChildNodes[i];

        // Attribut der ChildNode lesen
        string wert1 = node.Attributes["from"].Value.ToString();
    }
}