DataGridView mit Excel-Funktion

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Yannici.

    DataGridView mit Excel-Funktion

    Hallo Leute,

    ich hoffe ihr könnt mir dabei helfen bzw. mir eine Antwort liefern.

    In einem Formular (Windows Forms) habe ich eine DataGridView eingebunden. Diese DataGridView ist mit einer BindingSource bestückt, die auf eine Liste mit "Location"-Objekten gefüllt, referenziert. Ein Location-Objekt hat verschiedene Properties, die in dieser DataGridView angezeigt werden und auch verändert werden können (also nicht ReadOnly).

    Jetzt zu meiner eigentlichen Frage: Unter den Properties gibt es auch eine Property die den Namen des Location-Objekts beinhaltet. Dieser Name wird auch in der DataGridView angezeigt. Nun möchte ich eine Funktion wie in Excel, die es erlaubt in der DataGridView einen eingegebenen Namen "nach unten zu ziehen", um somit numerische Werte innerhalb des Namens automatisch zu erhöhen. Ich weiß einfach nicht wie ich das realisieren kann.

    Ich hoffe ihr habt dazu eine Idee. Es muss nicht exakt wie in Excel funktionieren, aber eine Lösungsmöglichkeit oder -ansatz wäre schon genial :thumbup:

    Grüße Yannici
    Naja mein Vorschlag:

    - Lege eine Stelle für jede Zelle fest, die bei MouseHover das Mouseicon ändert, von der aus man eine Zelle kopieren kann
    - Im Mousedown prüfst du, ob eine solche Stelle geklickt wurde, und merkst dir die Zelle(n) bzw Inhalt(e) und setzt einen Schalter auf True und markierst alle Zellen nur noch waagerecht oder senkrecht (musst wohl manuell machen)
    - Im Mouse Up prüfst du, ob Schalter = True, Selection anders als im MouseDown und dementsprechend rufst du eine CopyCells Methode auf und befüllst dort alle neu markierten Felder. In der Copymethode kannst du noch die Daten prüfen, wenn eine Zahl am Ende stehst, zählst halt immer eins drauf beim neuen Wert.

    Ist sicher eine nicht ganz so einfache Sache und vll gehts auch anders.

    LG
    Das ist meine Signatur und sie wird wunderbar sein!

    Mono schrieb:

    Naja mein Vorschlag:

    - Lege eine Stelle für jede Zelle fest, die bei MouseHover das Mouseicon ändert, von der aus man eine Zelle kopieren kann
    - Im Mousedown prüfst du, ob eine solche Stelle geklickt wurde, und merkst dir die Zelle(n) bzw Inhalt(e) und setzt einen Schalter auf True und markierst alle Zellen nur noch waagerecht oder senkrecht (musst wohl manuell machen)
    - Im Mouse Up prüfst du, ob Schalter = True, Selection anders als im MouseDown und dementsprechend rufst du eine CopyCells Methode auf und befüllst dort alle neu markierten Felder. In der Copymethode kannst du noch die Daten prüfen, wenn eine Zahl am Ende stehst, zählst halt immer eins drauf beim neuen Wert.

    Ist sicher eine nicht ganz so einfache Sache und vll gehts auch anders.

    LG


    Wow, das ist ein verdammt guter Lösungsansatz. Ich werde es mal versuchen. Weitere Antworten sind natürlich trotzdem noch Willkommen :D
    als erstes sollteste dir klar machen, dass dieser Vorgang in den Daten stattzufinden hat, nicht im DGV.
    Und die Daten sind in deiner Liste drin, nicht im DGV.

    Nun weiß ich leider nicht, wie man in Excel einen Namen runterzieht, daher kann ich keine weiteren Hinweise geben.
    Auch weiß ich nichts über die Art deiner Daten, nichtmal, welcher Art deine Liste ist.

    ErfinderDesRades schrieb:

    als erstes sollteste dir klar machen, dass dieser Vorgang in den Daten stattzufinden hat, nicht im DGV.
    Und die Daten sind in deiner Liste drin, nicht im DGV.

    Nun weiß ich leider nicht, wie man in Excel einen Namen runterzieht, daher kann ich keine weiteren Hinweise geben.
    Auch weiß ich nichts über die Art deiner Daten, nichtmal, welcher Art deine Liste ist.


    Die Datenänderung muss aber erst von der GUI aus (DGV) getriggert werden. Außerdem muss vom Benutzer ausgewählt werden, welche dieser Daten
    geändert werden sollen. Dass die Daten in meiner Liste drin sind ist mir auch klar, aber die Liste ist ja am DGV gebunden, also im Prinzip repräsentiert die DGV ja meine Liste ;)

    Was für eine Art meine Daten sind habe ich bereits geschrieben. Die Liste ist eine List(Of Location).
    Im Excel einen Namen eingeben z.B. "Filter 1". Die Spalte auswählen und die Zelle im rechten unteren Eck "packen" und runterziehen ;)
    Dann weißt du was ich meine.
    Also so ein Drag-Verhalten dürfte sehr anspruchsvoll werden, schomal. Was machbar ist, dass du einen Bereich selektierst, und dann per KontextMenü einen Dialog öffnest, wo du iwie ein Namens-Muster eingibst, und das Proggi macht dann was mit den Daten.

    Allerdings ist List(Of Location) keine geeignete Klasse für Databinding. Da solltest du auf BindingList(Of Location) umstellen.
    Denn eine BindingList aktualisiert das DGV, wenn Einträge zukommen/gelöscht werden.

    Und ob die Location-Klasse geeignet ist, hängt davon ab, ob sie INotifyPropertychanged implementiert.
    Denn nur mit INotifyPropertyChanged aktualisiert ein Location-Objekt das DGV, wenn eine seiner Properties geändert wurden.

    ErfinderDesRades schrieb:

    Allerdings ist List(Of Location) keine geeignete Klasse für Databinding. Da solltest du auf BindingList(Of Location) umstellen.
    Denn eine BindingList aktualisiert das DGV, wenn Einträge zukommen/gelöscht werden.

    Ich muss mich korrigieren, die Liste ist bereits eine BindingList(Of Location)

    ErfinderDesRades schrieb:

    Und ob die Location-Klasse geeignet ist, hängt davon ab, ob sie INotifyPropertychanged implementiert.
    Denn nur mit INotifyPropertyChanged aktualisiert ein Location-Objekt das DGV, wenn eine seiner Properties geändert wurden.

    Danke, das wusste ich noch nicht. Ich hatte schon Probleme mit dem Aktualisieren von einzelner Properties, was das nun erklären sollte. Aktuell nutze ich dafür die Refresh(), denn das zeichnet bekanntlich die DGV neu.

    ErfinderDesRades schrieb:

    Was machbar ist, dass du einen Bereich selektierst, und dann per KontextMenü einen Dialog öffnest, wo du iwie ein Namens-Muster eingibst, und das Proggi macht dann was mit den Daten.

    Da hast du Recht, das wäre dann auch ein Lösungsansatz, wenn so ein Drag-Verhalten wirklich nicht zu schaffen bzw. unpraktikabel ist.
    "Wie in Excel".

    Aus 2.2.2010 macht Excel dann beim "runterziehen" 2.2.2011, 2.2.2012 usw.
    Bei Zahlen wird zb bei einer Zelle mit 1 einfach nur die 1 kopiert.
    Markierst du 2 Zellen mit 1 und 2, dann kannst es weiterziehen auf 10, auf -10 oder kopieren, je nachdem in welche Richtung man zieht.
    Es ist eine Art Extended Kopierfunktion die abhängig von den Werten (Und Typen) leicht anders funktioniert. Eine Formel mit Bezug auf Zellen zB "=M6+N6" wird zu "=M7+N7".
    2 Zellen mit "a" und "b" wird nur kopiert.

    Sicher ist es abhängig von den Daten und Datentypen, aber eigentlich nicht ob die Daten zB gebunden sind oder einfach manuell reingeschrieben wurden.
    Das ist meine Signatur und sie wird wunderbar sein!
    Ich denke, Excel hat für diese Funktionalität eine überaus listige Heuristik, das wird sehr advanced, vergleichbares für DGV zu coden, denn ein DGV ist numal kein Excel-Sheet.

    Mein Anliegen ist halt auch, dem TE eine Denkweise nahezubringen, die Daten und Oberfläche getrennt denkt - ich halte das für fundamental.

    Aber du kannst ihn gerne darin beraten, in DGV-Zellen zu grabschen - dann mussers vlt. bei anderen Problemen nochmal neu erlernen, Daten und Gui getrennt sehen.

    Edit: Ups! - ich sehe deine vorigen Posts erst jetzt - ist da was mittm Forum schief gelaufen?
    also ich sag dann erstmal nix mehr, und bringt euern Ansatz erstmal zuende, sonst simmer hier wieder zuviele Köche am Brei.

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

    Ja, ich weiß dass ich nicht an die Excel-Funktion rankomme, was den Umfang angeht. Ich will eigentlich lediglich die Funktion mit der Zahl am Ende eines Strings. Sodass diese erhöht wird mit dem "Ziehen" einer Zelle. Der Wert der ersten Zelle wird pro weiteren Zelle einfach kopiert, die Zahl hochgezählt und in die nächste Zelle geschrieben (und da die ja gebunden ist, auch in die zugrunde liegende Property). So jedenfalls theoretisch.

    Die Benutzer kommen hauptsächlich aus Excel und kennen das so, deswegen wollte ich ihnen eine solche Funktion bieten, dass sie sich dann nicht ganz fremd fühlen.
    Ansonsten wäre das ja auch mit einem Kontextmenü zu schaffen wie @ErfinderDesRades richtig vorgeschlagen hat. Trotzdem wollte ich hier einige Ideen sammeln ;)