DataGridView: Ausführliche bearbeitung, Image, prüfungen und so weiter

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Bibi.

    DataGridView: Ausführliche bearbeitung, Image, prüfungen und so weiter

    Guten Tag,

    ich wende mich wieder mal an euch da ich gerade den Wald vor lauter Bäumen nicht sehe.
    Ich hatte mich schon mal wegen des DataGridView Themas an euch gewendet, es damals aus zeitlichen Gründen und der fehlenden Resultate verworfen.
    Nun bin ich erneut dazu angehalten das Thema aufzugreifen.

    Ziel:
    Eine ordentliche Bearbeitung diverser Daten im DataGridView.
    So wie es in einem WaWi, ERP, Administrativen Tool gewünscht ist.

    Um es etwas genauer zu erklären.
    Das DataGridView soll mit Positions-Daten gefüllt werden und der Benutzer soll diese bearbeitet, erstellen und löschen können.
    Dazu gibt es bestimmte Zellen. Diese erwarten eine bestimmte Handhabung.
    So möchte ich z.b. das ich in einer Zelle ein Image habe, das ich per Klick dann nutzen kann.
    Außerdem sollen Formatierungsüberprüfungen statt finden. So das man in einer Zelle mit "Zahlen" keinen Text eingeben kann und ggf. später etwas genauer.

    Beispiel
    Artikel | | Bezeichnung | Menge | ....
    1234 | Btn | Hier steht Bezeichnung | 10 | ....

    Neben der Zeile "Artikel" - die eine Zahl beinhaltet - soll ein Image/Button zu finden sein.
    Klickt der Benutzer auf diesen Button "oder" betätigt die Enter-Taste innerhalb der Artikel-Spalte, so soll etwas passieren. In diesem Falle öffne ich ein anderes Form wo der Benutzer etwas auswählen kann. Danach sollen bestimmte Zellen dieser Zeile mit der Auswahl gefüllt werden.

    Lange Rede, kurzer Sinn.
    Ich brauche eine brauchbare Bearbeitung über ein Datagrid aber weiß gerade nicht wie ich es angehen soll.
    Das es "einzelne" Schritte sein werden und mehrere Themen vereint ist mir bewusst.
    Doch bei keinem finde ich gerade den Ansatz.


    P.S.
    Ich selber nutze das Datagridview bisher in verschiedenen Konstellationen.
    In einer Konstellation fülle ich das Datagrid über eine BindingSource, in einer anderen Konstellation erstelle ich eine eigenes Dataset das ich dann dem Datagrid übergebe. Beides aber Varianten die sehr dynamisch gehalten sind (weil ein Benutzerdefinierter Spalteneditor dazu erschaffen wurde) und wozu ich auch keinen Ansatz gefunden habe dies so umzusetzen.

    Man möge mir die Verworrenheit in meiner Erklärung verzeihen denn wie schon gesagt, ich sehe den Wald vor lauter Bäumen nicht und damit auch den Einstieg nicht.

    Wie immer bin ich über jegliche Hilfestellung sehr Dankbar.
    Vielleicht baust Du Dir Deinen eigenen Zell-Typ für Dein DGV:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich weiß nicht recht, was du willst: Alle Anforderungen, die du ansprichst, sind bei einem an ein typisiertes Dataset gebundenem Datagridview erfüllt.
    Eine spezielle Validierung kann man auch im _CellValidating durchführen - schnuckliger isses aber, in partiellen Dataset-Klassen e.Row.RowError zu setzen - gugge IDataErrorInfo (sorry - c#, aber guggen lohnt trotzdem)
    Hallo,

    vielen Dank schon einmal für eure Antworten.

    ErfinderDesRades schrieb:

    Ich weiß nicht recht, was du willst: Alle Anforderungen, die du ansprichst, sind bei einem an ein typisiertes Dataset gebundenem Datagridview erfüllt.

    Das kann vielleicht sein und wäre natürlich klasse wenn ich dies hin bekomme.
    Doch mangelt es mir da wohl an dem passenden Einstieg.

    Eines der Varianten wie ich die DataGridView momentan nutze sieht wie folgt aus ....

    VB.NET-Quellcode

    1. Connection_Start(conn) 'Verbindung aufbauen
    2. Dim myAdapter As New MySqlDataAdapter
    3. Dim dt As New DataTable
    4. Dim bs As BindingSource
    5. Dim ds As New DataSet
    6. Dim cmd As New MySqlCommand
    7. cmd.Connection = conn
    8. cmd.CommandText = "SELECT position.*,address.company AS 'Lieferant' from position LEFT JOIN Address ON position.supplier = address.address WHERE position.document = ?document"
    9. cmd.Parameters.AddWithValue("?Document", iDocument)
    10. myAdapter.SelectCommand = cmd
    11. dt = New DataTable("RESULT")
    12. ds.Tables.Add(dt)
    13. myAdapter.Fill(dt)
    14. bs = New BindingSource
    15. bs.DataSource = ds
    16. dgPosition.DataBindings.Clear()
    17. dgPosition.DataSource = bs
    18. dgPosition.DataMember = "RESULT"
    19. dgPosition.Refresh()

    Unten weiter kommt dann noch eine Routine für das Anzeigen/Verstecken und anpassen der Spalten-Köpfe (ein selbst geschriebener Spalten-Editor).
    Ich denke auf diese Art und Weise bekomme ich keine Spalte mit einer ImageColumn hinein.

    Die andere Variante sieht wie folgt aus...

    VB.NET-Quellcode

    1. Connection_start(AFSConn, GetAFSConnectionString)
    2. dgAuftrag.DataSource = Nothing
    3. Dim ds As New DataSet
    4. Dim dt As DataTable = ds.Tables.Add("Auftrag")
    5. Dim dr As DataRow
    6. dt.Columns.Add("Auftrag", GetType(String))
    7. dt.Columns.Add("Nummer", GetType(String))
    8. dt.Columns.Add("Adresse", GetType(Integer))
    9. dt.Columns.Add("Datum", GetType(String))
    10. dt.Columns.Add("Summe", GetType(Double))
    11. Dim myData As New DataTable
    12. Dim myAdapter As New MySqlDataAdapter
    13. Dim cmd As New MySqlCommand
    14. cmd.Connection = AFSConn
    15. cmd.CommandText = "SELECT * FROM Auftrag WHERE Mandant = mandant AND Art = 1 AND Vorgangsnummer LIKE ?vorgangsnummer"
    16. cmd.Parameters.AddWithValue("?mandant", gMandant)
    17. cmd.Parameters.AddWithValue("?vorgangsnummer", txtAuftragsnummer.Text)
    18. myAdapter.SelectCommand = cmd
    19. myAdapter.Fill(myData)
    20. Dim Auftrag As clsAuftrag
    21. For Each dRow As DataRow In myData.Rows()
    22. Auftrag = New clsAuftrag
    23. MakeAuftragVarchange(Auftrag, dRow)
    24. dr = dt.NewRow
    25. dr("Auftrag") = Auftrag.Auftrag
    26. dr("Nummer") = Auftrag.Vorgangsnummer
    27. dr("Adresse") = Auftrag.Adresse
    28. dr("Datum") = Auftrag.Auftragsdatum
    29. dr("Summe") = Auftrag.Betrag
    30. dt.Rows.Add(dr)
    31. Next
    32. dgAuftrag.DataSource = ds
    33. dgAuftrag.DataMember = "auftrag"
    34. dgAuftrag.Refresh()
    35. dgAuftrag.AutoResizeColumns()


    Leicht veränderter Code aus meinen Projekte. Dürfte aber soweit selbsterklärend sein.
    Der Einstieg für die ImageColumn, welche durch drücken etwas auslöst, fehlt mir da.
    untypisierte Datasets sind Müll. Sprach ich nicht von typisierten Datasets?
    ein Einstieg kann sein: "Datenbank in 10 Minuten" auf Movie-Tuts.
    Eine (grauenhafte) Imagecolumn sieht man in Autowerte inserten
    Eine etwas sinnvoller eingesetzte in noch ein coloriertes Datagridview
    ImageColumns im DGV sind IMO nur sinnvoll, um Icons darzustellen, nicht wirklich Bilder, denn für Bilder müssteman die Zeilen irre hoch ziehen - das würde das DGV ziemlich entstellen.
    Zum Klicksen - die _CellMouseClick-, _CellMouseDown-, etc- Events stehen jeder Zelle zur Verfügung, unabhängig von der Art der Column.

    Dein Code zeigt auch, dass du keinen Ansatz hast, die DB-Zugriffe iwie an einem Ort zu bündeln (Data-Access-Layer).
    IMO sollteman, wenn man die designergenerierten TableAdapter nicht mag (dafür gibts gute Gründe), dann ein alternatives DAL programmieren, aber nicht die Zugriffe unsystematisch unter den restlichen Code verstreuen (sodaß zB. Forms entstehen mit 10000 Zeilen Code)
    Hallo,

    danke für den Beitrag.

    ErfinderDesRades schrieb:

    untypisierte Datasets sind Müll. Sprach ich nicht von typisierten Datasets?

    Mir fehlt das Knowledgement dazu, werde mich aber in das Thema - vor allem den Links von dir - nun etwas einlesen.

    ErfinderDesRades schrieb:


    ImageColumns im DGV sind IMO nur sinnvoll, um Icons darzustellen, nicht wirklich Bilder, denn für Bilder müssteman die Zeilen irre hoch ziehen - das würde das DGV ziemlich entstellen.

    Genau, Icons waren gedacht.
    Eben jene für div. Aktionen.

    ErfinderDesRades schrieb:


    Zum Klicksen - die _CellMouseClick-, _CellMouseDown-, etc- Events stehen jeder Zelle zur Verfügung, unabhängig von der Art der Column.

    Ah super :)

    ErfinderDesRades schrieb:


    Dein Code zeigt auch, dass du keinen Ansatz hast, die DB-Zugriffe iwie an einem Ort zu bündeln (Data-Access-Layer).
    IMO sollteman, wenn man die designergenerierten TableAdapter nicht mag (dafür gibts gute Gründe), dann ein alternatives DAL programmieren, aber nicht die Zugriffe unsystematisch unter den restlichen Code verstreuen (sodaß zB. Forms entstehen mit 10000 Zeilen Code)

    Ich werde mich mal mit besagtem auseinander setzen und schauen was sich da machen lässt.
    Ich danke vielmals für die Ansätze, nun habe ich etwas zu tun :)

    Melde mich bei Resultaten oder weiteren Problemstellungen zurück.