Eigenes Star-Rating Control über Designer in Datagridview einbinden

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von flightgear91.

    Eigenes Star-Rating Control über Designer in Datagridview einbinden

    Hallo zusammen,

    ich bin am Verzweifeln, und hoffe Ihr könnt mir helfen! Ich programmiere eine kleine Karaoke Datenbank und wollte ein Ranking in Form von Sternen in einem DGV darstellen. Hierfür wollte ich ein Control erstellen.

    Ich habe bei VBForums (LINK) eine Grundlage für ein StarRate (ähnlich Winamp) Control gefunden und weiterentwickelt. Ich verstehe wie das Control funktioniert.

    Nach monatelangem Suchen und Lesen habe ich blöderweise immer noch Probleme:

    1. Ich möchte das Control gerne über den Designer in ein bestehendes Datagridview integrieren. Den nötigen Code habe ich bei Mircosofts TimepickerControl gefunden (LINK). Diesen Code verstehe ich nicht wirklich X( , aber ich kann nach einigen Änderungen zumindest 'mein' Control als DatagridviewStarRateColumn über den Designer als ColumnType auswählen.
      Wenn ich das Programm starte, steht anstelle der Sterne eine 0 in der DGV Zelle. Über einen Klick in die Zelle kann ich dann tatsächlich die Sterne Auswählen, bekomme aber beim Verlassen des Feldes "Der formatierte Wert der Zelle hat einen falschen Typ". Vermutlich nur ein kleiner Fehler, aber ich komme einfach nicht weiter. Ich will statt 0 immer die Sterte (ohne Wertung) und natürlich die Werte übergeben und bei Änderung auch zurückliefern.

    2. Außerdem habe ich leider auch noch Probleme mit dem DataBinding über den Designer (bin da leider im VBForums nicht weitergekommen). Außerhalb eines DGV verhält sich das Control eigentlich wie gewünscht und zeigt sogar die Werte aus der Datenbank (-1 bis 5) an, speichert diese aber nicht automatisch ins Dataset zurück?!
    Ich habe zum besseren Verständniss das Control und die Testanwendung (VB2010) angehängt. Es könnte sein, dass Ihr bei der Testanwendung noch die "StarRateControl.dll" einbinden müßt. Im Beispiel ist kein Databinding enthalten :huh:.

    Vielen Dank im Voraus... bin echt Verzweifelt!

    Gruß

    VincentVega
    Dateien
    • StarRate.zip

      (444,35 kB, 82 mal heruntergeladen, zuletzt: )
    • TestAnwendung2.zip

      (143,66 kB, 72 mal heruntergeladen, zuletzt: )
    Hi,
    in dem Beispiel vom MSDN aus deinem Link wird der DatetimePicker nur dargestellt, wenn das Feld editiert wird. Gehst du da wieder raus, ist das Feld wieder eine Textboxcell. Das gleiche Verhalten hast du jetzt natürlich auch.
    Ich bin jetzt nicht so der Kenner aber vermute die folgenden Zeilen als Ursache für dieses Verhalten:

    VB.NET-Quellcode

    1. Public Overrides ReadOnly Property EditType() As Type
    2. Get
    3. ' Return the type of the editing control that CalendarCell uses.
    4. Return GetType(CalendarEditingControl)
    5. End Get
    6. End Property

    Hier wird der zurückgegebene Celltype beim Editieren angegeben. Wird nicht editiert, isses halt ne TextboxCell (weil von der abgeleitert)
    Du müsstest dir also ne eigene DatagridviewCell entwerfen, die grundsätzlich die Werte als Sterne darstellt (GDI) und Integer enthält.

    Fiel Fergnügen

    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Vielen Dank schonmal für die Antworten!

    @flightgear91:
    Ich wollte gerne ein Control erstellen das ich dann über den Designer in anderen Projekten benutzen kann. Und wenn ich das so richtig verstehe, würde ich bei der Image Lösung vermuten, dass der User im DGV nicht in der Lage wäre das Rating zu ändern?! Meine Lösung funktioniert ja schon fast wie gewünscht, irgendwo ist halt nur noch ein 'kleiner' Fehler ;(

    @Vatter:
    Ich habe leider schon alles ausprobiert, was mir einfällt. Unabhängig von dem Anzeigeproblem der Sterne, speichert er den Wert (nur im DGV) nicht in der Zelle...es steht immer 0 drin?! Außerhalb des DGV funktioniert alles wunderbar. Ich würde mich ja schon freuen, wenn nach dem anklicken der Sterne der entsprechende Wert in der DGC-Cell als Int angezeigt würde.

    Habe es z.B. z.Zt. so...

    VB.NET-Quellcode

    1. Public Overrides ReadOnly Property EditType() As Type
    2. Get
    3. ' Return the type of the editing control that StarRateCell uses.
    4. Return GetType(StarRateControl)
    5. End Get
    6. End Property
    7. Public Overrides ReadOnly Property ValueType() As Type
    8. Get
    9. ' Return the type of the value that StarRate contains.
    10. Return GetType(Decimal)
    11. 'Return GetType(StarRateControl)
    12. End Get
    13. End Property

    Ergebnis: Angezeigt wird eine 0, beim Ändern wird das StarRateControl angezeigt. Beim Verlassen der Zelle ehalte ich eine DGV Ausnahme: "Der formatierte Wert der Zelle hat einen falschen Typ".

    Ich wäre echt dankbar wenn einer sich das mal anschauen würde und mir hilft das oder ggf. sogar alle Probleme zu lösen ?( .
    Um es für evtl. Helfer einfacher zu machen habe ich die Testanwendung und das Control mal zusammengeführt.

    Gruß

    VincentVega
    Dateien
    Hallo,

    ich habe das Userrating über eine Trackbar gemacht mit 5 Positionen ^^
    Wenn sich der SelectedValue der Trackbar ändert, ändert sich auch die Sternenanzeige im DGV für den entsprechenden Datensatz und gleichzeitig wird der neue Wert in die Datenbank geschrieben.

    Ist aber relativ umständlich...