Fragen zu Import von Excel in DGV

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 39 Antworten in diesem Thema. Der letzte Beitrag () ist von Parmaster.

    Wenn ich das hier benutze

    C#-Quellcode

    1. dataGridView1.Height = dataGridView1.GetRowDisplayRectangle(dataGridView1.NewRowIndex, false).Height + dataGridView1.GetRowDisplayRectangle(dataGridView1.NewRowIndex, true).Bottom;


    bekomme ich folgende Fehlermeldung


    Kann mir mal bitte jemand erklären was das zu bedeuten hat und wie ich den Fehler wegbekomme?

    Wenn ich oben den Code ändere zu dem hier (nur mal als Beispiel), klappt es ohne Probleme

    C#-Quellcode

    1. dataGridView1.Height = (dataGridView1.GetRowDisplayRectangle(1, false).Height + dataGridView1.GetRowDisplayRectangle(1, true).Bottom)*2;
    Ne, hab in der Methode kein TryCatch, in einer anderen zum importieren der Excel Datei schon. Kann das damit was zu tun haben?


    Hier der Code zum importieren:

    C#-Quellcode

    1. ​private void btnExcelImport_Click(object sender, EventArgs e)
    2. {
    3. //var openFileDialog1 = new OpenFileDialog();
    4. openFileDialog1.Filter = "Excel Datei (*.xlsx)|*.xlsx";
    5. openFileDialog1.FilterIndex = 1;
    6. if (openFileDialog1.ShowDialog() == DialogResult.OK)
    7. {
    8. try
    9. {
    10. using (ExcelPackage pck = new ExcelPackage())
    11. {
    12. using (var stream = File.OpenRead(openFileDialog1.FileName))
    13. {
    14. pck.Load(stream);
    15. }
    16. ExcelWorksheet ws = pck.Workbook.Worksheets.First();
    17. //dataGridView1.DataSource = WorksheetToDataTable(ws, true); //chkHasHeader.Checked);
    18. dataGridView1.DataSource = WorksheetToDataTable(ws, true); //chkHasHeader.Checked);
    19. }
    20. }
    21. catch (Exception ex)
    22. {
    23. MessageBox.Show("Import fehlgeschlagen. Fehlermeldung: " + ex.Message);
    24. }
    25. }
    26. }


    Und hier der Code um die Größe anzupassen usw.

    C#-Quellcode

    1. ​private void dataGridView1_DataSourceChanged(object sender, EventArgs e)
    2. {
    3. dataGridView1.Height = (dataGridView1.GetRowDisplayRectangle(1, true).Bottom + dataGridView1.GetRowDisplayRectangle(1, false).Height)*2;
    4. //Generate Row Number
    5. if (dataGridView1.DataSource != null) //&& chkGenerateRowNumber.Checked)
    6. {
    7. foreach (DataGridViewRow row in dataGridView1.Rows)
    8. {
    9. row.HeaderCell.Value = string.Format("{0}", row.Index + 1);
    10. }
    11. }
    12. }
    Ich bastel das mal um ohne TryCatch, mal sehen was passiert. :)


    EDIT:

    wenn ich das TryCatch weg mache und wieder diesen Code benutze

    C#-Quellcode

    1. dataGridView1.Height = dataGridView1.GetRowDisplayRectangle(dataGridView1.NewRowIndex, true).Bottom + dataGridView1.GetRowDisplayRectangle(dataGridView1.NewRowIndex, false).Height;


    kommt diese Fehlermeldung:

    Spoiler anzeigen

    Quellcode

    1. System.ArgumentOutOfRangeException wurde nicht behandelt.
    2. HResult=-2146233086
    3. Message=Das angegebene Argument liegt außerhalb des gültigen Wertebereichs.
    4. Parametername: rowIndex
    5. Source=System.Windows.Forms
    6. ParamName=rowIndex
    7. StackTrace:
    8. bei System.Windows.Forms.DataGridView.GetRowDisplayRectangle(Int32 rowIndex, Boolean cutOverflow)
    9. bei Projekt.Form1.dataGridView1_DataSourceChanged(Object sender, EventArgs e) in d:\Projekt\Form1.cs:Zeile 168.
    10. bei System.Windows.Forms.DataGridView.OnDataSourceChanged(EventArgs e)
    11. bei System.Windows.Forms.DataGridView.set_DataSource(Object value)
    12. bei Projekt.Form1.btnExcelImport_Click(Object sender, EventArgs e) in d:\Projekt\Form1.cs:Zeile 114.
    13. bei System.Windows.Forms.Control.OnClick(EventArgs e)
    14. bei System.Windows.Forms.Button.OnClick(EventArgs e)
    15. bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
    16. bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
    17. bei System.Windows.Forms.Control.WndProc(Message& m)
    18. bei System.Windows.Forms.ButtonBase.WndProc(Message& m)
    19. bei System.Windows.Forms.Button.WndProc(Message& m)
    20. bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    21. bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    22. bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    23. bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
    24. bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
    25. bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
    26. bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
    27. bei System.Windows.Forms.Application.Run(Form mainForm)
    28. bei Projekt.Program.Main() in d:\Projekt\Program.cs:Zeile 19.
    29. bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
    30. bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
    31. bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
    32. bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
    33. bei System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
    34. bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
    35. bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    36. bei System.Threading.ThreadHelper.ThreadStart()
    37. InnerException:


    Kann es evtl. etwas damit zu tun haben, weil ich nicht erlaube neue Zeilen/Spalten hinzuzufügen? Das wäre für mich am plausibelsten. Weil wenn ich nämlich anstatt

    Quellcode

    1. dataGridView1.NewRowIndex
    die 1 (als Index für die Zeile) angebe, und es die ja dann schon gibt, dann wird halt die Höhe davon ermittelt.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Parmaster“ ()

    oh - dann lernst du ja heut schon ein zweites: NIcht alles was von MS kommt ist auch richtig.

    ansonsten müsstest du mit minimal selber denken auch selber drauf kommen: Also dgv.NewLineIndex ist out of Range - kannst du ja mal prüfen: ist OutOfRange im Sinne von zu groß oder zu klein?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Genau, und bei MSDN (msdn.microsoft.com/de-de/libra…ewrowindex(v=vs.110).aspx) steht:

    Quellcode

    1. EigenschaftswertTyp: System.Int32
    2. Der Index der Zeile für neue Datensätze oder -1, wenn AllowUserToAddRows false ist.
    3. Hinweise
    4. Sofern AllowUserToAddRows false ist, ist der Wert dieser Eigenschaft gleich der Anzahl der Zeilen im Steuerelement minus 1.


    Und beim hierher kopieren ist mir glaub ich auch die Lösung gekommen. Da bei mir AllowUserToAddRows tatsächlich false ist, muss ich anstatt dataGridView1.NewRowIndex die Anzahl der Zeilen -1 machen.


    EDIT:

    wenn ich nun dataGridView1.RowCount-1 benutze, kommt zwar keine Fehlermeldung, es wird aber auch nichts angezeigt. Ich werd verrückt. :D


    EDIT 2:

    ok, ich verstehe die Fehlermeldung nicht wirklich. Warum ist das OutOfRange? Steht doch dabei "Sofern AllowUserToAddRows false ist, ist der Wert dieser Eigenschaft gleich der Anzahl der Zeilen im Steuerelement minus 1."

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Parmaster“ ()

    ich verstehe deinen post nicht wirklich.
    Wenn nun die ArgumentOutOfRange-Exception in dieser Zeile nicht mehr kommt, nachdem du den übergebenen Index geändert hast, dann ist dieser Fehler in dieser Zeile wohl behoben, odr?

    Dass "nichts" angezeigt wird - was immer damit gemeint sein mag - , wird dann wohl an einem anderen Fehler liegen.
    Das mit dem .RowCount war natürlich quatsch. War wohl schon zu spät. :D


    Das mit .RowNewIndex geht trotzdem nicht, und ich weiß immer noch nicht warum. Bei mir ist das AllowUserToAddRows auf false, also sollte laut MSDN der Rückgabewert die Anzahl der Zeilen -1 sein. Trotzdem kommt OutOfRange, und ich weiß nicht was da erwartet wird.
    Ich weiß schon was da erwartet wird, 1. den Index der Zelle, also int, und der zweite Parameter ein bool. Darum geht es doch aber nicht. Die Frage ist warum das RowNewIndex OutOfRange ist, das würde mich mal interessieren.


    Das mit dem RowCount war insofern quatsch, weil GetRowDisplayRectangle nicht die Anzahl der Zeilen will.
    Ich gebs auf, jetzt also die Auflösung:
    Natürlich muss ein rowIndex, den dieser Methode akzeptieren kann im Bereich von 0 bis Anzahl der Zeilen (engl: "Row") liegen. Oder wie soll etwa das GetRowDisplayRectangle am RowIndex -1 ermittelt werden?
    Also der untere Wert des Bereiches (engl: "Range") ist sicherlich 0 (es sei denn, es sind gar keine Zeilen vorhanden, dann gibt es auch gar keinen gültigen Bereich).
    Und kann ein DisplayRectangle ermittelt werden an einem RowIndex, der größer oder gleich der Gesamtanzahl aller vorhandener Rows ist? nee, oder?
    Also dgv.RowCount-1 ist wohl der obere Wert des Bereiches (engl: "Range").
    Alle Werte, die ausserhalb dieses Bereiches liegen (engl: "out of range") sind als Argument dieser Methode ungültig, und werden mit der entsprechenden Exception quittiert: "Argument out of Range".