DataGridView - Add Item in importierter Excel Tabelle

  • VB.NET
  • .NET (FX) 4.0

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von Patty98.

    DataGridView - Add Item in importierter Excel Tabelle

    Hey, wie der Titel schon sagt möchte ich eine Excel Tabelle Importieren (5 Spalten) (Was ich auch hingekriegt habe).
    Jetzt habe ich 5 TextBoxen, aus denen ich mit einem klick eine Reihe des DataGridViews befüllen möchte. (krieg ich nicht hin)

    Nach langem herumgebastel und gegoogle habe ich keine Ahnung wie das richtig funktioniert. ?(

    Hat von euch einer eine Idee ?

    Danke schonmal. LG
    Habe ich versucht dann kommt:

    InvalidOperationException wurde nicht behandelt.

    Zeilen können nicht automatisch zur Zeilenauflistung der DataGridView hinzugefügt werden, wenn das Steuerelement datengebunden ist.

    Spoiler anzeigen
    System.InvalidOperationException wurde nicht behandelt.
    HResult=-2146233079
    Message=Zeilen können nicht automatisch zur Zeilenauflistung der DataGridView hinzugefügt werden, wenn das Steuerelement datengebunden ist.
    Source=System.Windows.Forms
    StackTrace:
    bei System.Windows.Forms.DataGridViewRowCollection.Add(Object[] values)
    bei Neuer_Versuch.Form1.Button1_Click(Object sender, EventArgs e) in c:\users\patrick\documents\visual studio 2010\Projects\Neuer Versuch\Neuer Versuch\Form1.vb:Zeile 79.
    bei System.Windows.Forms.Control.OnClick(EventArgs e)
    bei System.Windows.Forms.Button.OnClick(EventArgs e)
    bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
    bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
    bei System.Windows.Forms.Control.WndProc(Message& m)
    bei System.Windows.Forms.ButtonBase.WndProc(Message& m)
    bei System.Windows.Forms.Button.WndProc(Message& m)
    bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
    bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
    bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
    bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
    bei System.Windows.Forms.Application.Run(ApplicationContext context)
    bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
    bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
    bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
    bei Neuer_Versuch.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:Zeile 81.
    bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
    bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
    bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
    bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
    bei System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
    bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
    bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    bei System.Threading.ThreadHelper.ThreadStart()
    InnerException:



    So importiere ich die Tabelle :

    VB.NET-Quellcode

    1. Private Sub ComboBox1_SelectedIndexChanged_1(sender As System.Object, e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
    2. Try
    3. Dim fileName As String = ComboBox1.Text
    4. Dim MyConnection As System.Data.OleDb.OleDbConnection
    5. Dim dataSet As System.Data.DataSet
    6. Dim MyCommand As System.Data.OleDb.OleDbDataAdapter
    7. Dim path As String = Application.StartupPath & "\Tabellen\" & fileName & ".xlsx"
    8. Dim sTable As String = ComboBox1.Text + "$"
    9. MyConnection = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;")
    10. MyCommand = New System.Data.OleDb.OleDbDataAdapter("Select * from [Tabelle1$]", MyConnection)
    11. dataSet = New System.Data.DataSet
    12. MyCommand.Fill(dataSet)
    13. DataGridView1.DataSource = dataSet.Tables(0)
    14. MyConnection.Close()
    15. Catch ex As Exception
    16. MsgBox(ex.Message.ToString)
    17. End Try
    18. End Sub



    Export:

    VB.NET-Quellcode

    1. Dim strings(ComboBox1.Items.Count - 1) As String
    2. ComboBox1.Items.CopyTo(strings, 0)
    3. My.Settings.ComboItems.Clear()
    4. My.Settings.ComboItems.AddRange(strings)
    5. Dim fileName As String = ComboBox1.Text
    6. Dim xls_Appl As Object ' Excel Anwendung
    7. Dim xls_Mappe As Object ' Excel Arbeitsmappe (Datei)
    8. Dim xls_Blatt As Object ' Excel Blatt (Tabelle)
    9. Dim Anzahlzeilen As Integer
    10. xls_Appl = CreateObject("Excel.Application") ' Excel Instanz bilden
    11. xls_Appl.Visible = False
    12. xls_Mappe = xls_Appl.Workbooks.Add() ' Tabelle hinzufügen
    13. xls_Blatt = xls_Mappe.ActiveSheet ' Tabelle auswählen
    14. xls_Blatt.Columns("A:Z").ColumnWidth = 10
    15. xls_Blatt.Columns("A").ColumnWidth = 15
    16. xls_Blatt.Columns("B").ColumnWidth = 7
    17. xls_Blatt.Columns("C").ColumnWidth = 20
    18. xls_Blatt.Columns("D").ColumnWidth = 20
    19. With DataGridView1
    20. For Spalte As Integer = 0 To .Columns.Count - 1 ' Spaltenbezeichungen nach Excel
    21. xls_Blatt.Cells(1, Spalte + 1).Value = .Columns(Spalte).HeaderText
    22. xls_Blatt.Cells(1, Spalte + 1).Font.Bold = True
    23. Next
    24. Anzahlzeilen = .Rows.Count
    25. If .AllowUserToAddRows = True Then
    26. Anzahlzeilen = Anzahlzeilen - 1 ' Leerzeile abziehen
    27. End If
    28. For Zeile As Integer = 0 To Anzahlzeilen - 1 ' Alle Zeilen durchlaufen
    29. For Spalte As Integer = 0 To .Columns.Count - 1 ' Darin alle Spalten durchlaufen
    30. xls_Blatt.Cells(Zeile + 2, Spalte + 1).Value _
    31. = .Rows(Zeile).Cells(Spalte).Value.ToString
    32. Next
    33. Next
    34. End With
    35. xls_Appl.DisplayAlerts = False ' Alle Warnungen unterdrücken
    36. xls_Mappe.Saveas(Application.StartupPath & "\Tabellen\" & fileName & ".xlsx") ' Abspeichern, ggf. Überschreiben
    37. xls_Appl.DisplayAlerts = True ' Warnungen wieder zulassen
    38. xls_Mappe.Close() ' Datei schließen
    39. xls_Appl.Quit() ' Excel schließen
    40. xls_Blatt = Nothing ' Resourcen freigeben
    41. xls_Mappe = Nothing
    42. xls_Appl = Nothing


    Ja.. und jetzt fehlt mir der Button womit ich 5x TextBox.text hinzufügen kann..
    Jo, das Datagridview ist also an dataSet.Tables(0) gebunden, dann füge der auch eine Zeile zu.

    Hihi - geht schlecht, weil dataSet.Tables(0) ist zu dem Zeitpunkt gar nicht mehr zugreifbar.

    Was erhellt, dass der Ansatz ziemlich ungeschickt ist, insbesondere, dass du bei jedem Combobox.SelectedIndexChanged ein neues Dataset erzeugst mit einer neuen DataTable drin.
    Auszug aus obiger Verlinkung, diw ich dir gegeben habe:

    Ich schlage dir jetzt vor, du fügst dir ein typ. DataSet in dein Projekt ein und bildest sämtliche Tabellen analog deiner XLS-Datei darin ab.
    Als nächstes gehst du dann in die Datenquellen und ziehst dir eine Tabelle als DGV in eine Form und schaue, was dabei alles automatisch mit generiert wurde.
    Wichtig ist dabei zu beachten, dass dein neu generiertes DGV mit einer BindingSource an die Tabelle gebunden wurde...

    Wenn du das geschafft hast, dann kannst du deine Extratextboxen bequem an die Bindingsource binden und fertig...
    Tut mir leid.. aber ich bin noch Anfänger.. Das einzige was ich hingekriegt habe ist, dass ich eine zweite Form gemacht habe, wo das gleiche DGV drin ist. Was aaber glaub ich nicht das Ziel ist. :/ Könntest du mir die weiteren Schritte vielleicht etwas genauer erklären ? Wäre sehr nett.

    Danke aufjedenfall bis jetzt schonmal.
    Typisiertes Dataset erstellen :
    Wähle das Menü (Rechtsklick mit der Maus über den Projektordner) Projekt/Neues Element hinzufügen... und dann die Vorlage »DataSet« aus. Aus der Toolbox ziehst du dir dann deine Tabellen in das Dataset. Fügst dann entsprechend deine Spalten mit den richtigen Datentypen in jeder Tabelle ein und benamst alles analog deiner XLS-Datei...
    Danach, wie oben schon geschrieben, die gewünschte Tabelle aus dem Datenquellenfenster auf eine leere Form ziehen...
    Probiere das einmal und mache dann ein Bildchen von deiner Form im Designer mit Komponentenfach...
    Schaue dir auch die Filme von EDR an: die vier Views auf Video
    Jetzt schreibt der mir die Einträge auch in die TextBox also falschrum ich möchte es ja nur rein schreiben können.. und so richtig verstehe ich es auch nicht wie ich jetzt die Tabellen aus Excel da mit reinkriegen soll.. Wieso wird das denn jetzt so kompliziert ?(


    Hab es jetzt so hinbekommen eine .xlsx auszulesen:

    VB.NET-Quellcode

    1. Try
    2. Dim fileName As String = "ExcelFile"
    3. Dim MyConnection As System.Data.OleDb.OleDbConnection
    4. Dim dataSet As System.Data.DataSet
    5. Dim MyCommand As System.Data.OleDb.OleDbDataAdapter
    6. Dim path As String = Application.StartupPath & "\Tabellen\" & fileName & ".xlsx"
    7. If File.Exists(Application.StartupPath & "\Tabellen\" & fileName & ".xlsx") = False Then
    8. My.Computer.FileSystem.CopyFile(Application.StartupPath & "\Tabellen\master_Table.xlsx",
    9. Application.StartupPath & "\Tabellen\" & fileName & ".xlsx", Microsoft.VisualBasic.FileIO.UIOption.OnlyErrorDialogs, FileIO.UICancelOption.DoNothing) ' leere Tabelle mit Header erstellen
    10. End If
    11. MyConnection = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;")
    12. MyCommand = New System.Data.OleDb.OleDbDataAdapter("Select * from [Tabelle1$]", MyConnection)
    13. dataSet = New System.Data.DataSet
    14. MyCommand.Fill(dataSet)
    15. TabelleDataGridView.DataSource = dataSet.Tables(0)
    16. MyConnection.Close()
    17. Catch ex As Exception
    18. MsgBox(ex.Message.ToString)
    19. End Try

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