public int CompareTo(object obj)
        {
            Rennfahrer that = obj as Rennfahrer;
            int        res;

            if (that == null)
            {
                return(0);
            }

            // "CompareTo()" method
            res = this.getPoints().CompareTo(that.getPoints());

            if (res == 0)
            {
                int lthis = this.läufe.Count;
                int lthat = that.läufe.Count;

                for (int c = anzahlGewerteteLäufe + 1; c <= lthis && c <= lthat; c++)
                {
                    res = this.getPoints(c).CompareTo(that.getPoints(c));
                    if (res != 0)
                    {
                        break;
                    }
                }
            }

            return(res);
        }
        private void button2_Click(object sender, EventArgs e)
        {
            //ofd1.InitialDirectory = "C:\\Users\\Daniel Zwygart\\Dropbox\\SEC Renndaten\\2019_Expert";
            ofd1.InitialDirectory = Directory.GetCurrentDirectory();
            ofd1.RestoreDirectory = true;
            ofd1.Multiselect      = true;
            if (DialogResult.OK == ofd1.ShowDialog())
            {
                files = ofd1.FileNames;
            }


            Excel.Application oXL;
            Excel._Workbook   oWB;
            Excel._Worksheet  oSheet;
            Excel.Range       oRng;

            jahresrangliste.Clear();
            läufe.Clear();
            dataGridView1.Rows.Clear();

            try
            {
                //Start Excel and get Application object.
                oXL         = new Excel.Application();
                oXL.Visible = false;



                // Daten einlesen

                foreach (string lauf in files)
                {
                    bool       added = false;
                    int        rang  = 0;
                    string     nachname;
                    string     vorname;
                    Rennfahrer rennfahrer;

                    int rCnt;
                    int cCnt;
                    int rw = 0;
                    int cl = 0;

                    int platzSpalte    = 1;
                    int vornameSpalte  = 4;
                    int nachnameSpalte = 3;

                    string[] words = lauf.Split('_');

                    string laufName   = words[words.Length - 1].Split('.').First();
                    int    laufNummer = Convert.ToInt16(words[words.Length - 2]);
                    klasse = words[words.Length - 3];
                    jahr   = words[words.Length - 4].Split('\\').Last();

                    path = Path.GetDirectoryName(lauf);


                    label4.Text = "Jahresrangliste " + klasse + " " + jahr;

                    läufe.Add(new Lauf(laufName, laufNummer, 0));
                    try
                    {
                        //Get a the workbook.
                        oWB    = oXL.Workbooks.Open(lauf, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
                        oSheet = (Excel.Worksheet)oWB.Worksheets.get_Item(1);

                        oRng = oSheet.UsedRange;
                        rw   = oRng.Rows.Count;
                        cl   = oRng.Columns.Count;

                        for (cCnt = 1; cCnt <= cl; cCnt++)
                        {
                            string header = (string)(oRng.Cells[1, cCnt] as Excel.Range).Value2;
                            if (header == "Platz")
                            {
                                platzSpalte = cCnt;
                            }
                            if (header == "Nachname")
                            {
                                nachnameSpalte = cCnt;
                            }
                            if (header == "Vachname")
                            {
                                vornameSpalte = cCnt;
                            }
                        }

                        for (rCnt = 2; rCnt <= rw; rCnt++)
                        {
                            added = false;
                            if (Convert.ToInt16((oRng.Cells[rCnt, 1] as Excel.Range).Value2) != 0)
                            {
                                rang = Convert.ToInt16((oRng.Cells[rCnt, 1] as Excel.Range).Value2);                                                                    //Bei mehreren gleichen Rängen den Rang von vorher übernehmen
                            }
                            nachname = (string)(oRng.Cells[rCnt, nachnameSpalte] as Excel.Range).Value2;
                            vorname  = (string)(oRng.Cells[rCnt, vornameSpalte] as Excel.Range).Value2;

                            foreach (Rennfahrer r in jahresrangliste)
                            {
                                if (r.nachname == nachname && r.vorname == vorname)
                                {
                                    r.Add(laufName, laufNummer, rangZuPunkte(rang));
                                    added = true;
                                    break;
                                }
                            }

                            if (added == false)
                            {
                                rennfahrer = new Rennfahrer(vorname, nachname, läufeZuGewerteteLäufe(files.Length));
                                rennfahrer.Add(laufName, laufNummer, rangZuPunkte(rang));
                                jahresrangliste.Add(rennfahrer);
                            }
                        }

                        oWB.Close();
                    }
                    catch
                    {
                    }
                }

                // Daten verarbeiten
                jahresrangliste.Sort();
                jahresrangliste.Reverse();

                läufe.Sort();

                // Daten ausgeben

                dataGridView1.ColumnCount     = 4 + läufe.Count;
                dataGridView1.Columns[0].Name = "Rang";
                dataGridView1.Columns[1].Name = "Nachname";
                dataGridView1.Columns[2].Name = "Vorname";



                for (int i = 0; i < läufe.Count; i++)
                {
                    dataGridView1.Columns[i + 3].Name = läufe[i].name;
                }

                dataGridView1.Columns[dataGridView1.ColumnCount - 1].Name = "Total";

                int rangNeu = 0;
                int punkteVorangegangener = -1;
                int anzahlGleiche         = 1;
                foreach (Rennfahrer r in jahresrangliste)
                {
                    if (punkteVorangegangener != r.getPoints())
                    {
                        rangNeu      += anzahlGleiche; //
                        anzahlGleiche = 1;
                    }
                    else
                    {
                        anzahlGleiche++;
                    }
                    List <string> row = new List <string> {
                        rangNeu.ToString(), r.nachname, r.vorname
                    };
                    for (int i = 0; i < läufe.Count; i++)
                    {
                        bool found = false;
                        for (int n = 0; n < r.läufe.Count; n++)
                        {
                            if (r.läufe[n].name == läufe[i].name && r.läufe[n].nummer == läufe[i].nummer)
                            {
                                found = true;
                                row.Add(r.läufe[n].punkte.ToString());
                                break;
                            }
                        }
                        if (found == false)
                        {
                            row.Add(null);
                        }
                    }
                    row.Add(r.getPoints().ToString());
                    punkteVorangegangener = r.getPoints();
                    dataGridView1.Rows.Add(row.ToArray <string>());
                }
            }
            catch
            {
            }
        }