Eigenes Control - Eigene Eigenschaften in eine eigene Gruppe packen

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

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Eigenes Control - Eigene Eigenschaften in eine eigene Gruppe packen

    Hallo zusammen,

    ich habe mir eine neue Checkbox gebastelt und das Ganze als Steuerelement-Projekt aufgebaut.

    Das mit neuen Eigenschaften und dessen Umsetzung im Steuerelement habe ich alles soweit hinbekommen und es funktioniert auch soweit.

    Jetzt möchte ich aber, das meine eigenen Eigenschaften in eine eigene Gruppe stehen. Aktuell stehen Sie alle in der Gruppe "Sonstige".

    Oder kann man auch auf bestehende Gruppen zurückgreifen und die neuen Eigenschaften dort hin packen.

    Den Namen der neuen Gruppe bzw. Gruppen sollte man natürlich selbst festlegen können.

    Wäre echt nett, wenn Ihr mir einen Tipp geben könntet.

    Gruß

    Volker
    Hallo zusammen,

    vielen Dank für die schnelle und für mich richtige Antwort. Klappt supper.

    Habe haben noch eine kleine Frage: Zwei Eigenschaften sollen Dateipfade aufnehmen. Per String und das reinkopieren des Dateipfades klappt auch schon alles. Wie muss ich den Code umschreiben, damit ich ein Filedialog öffnen kann?

    Hier mal mein Gerüst.

    Spoiler anzeigen

    Quellcode

    1. Private _EigeneDatei_Aus_Property As String
    2. Private _EigeneDatei_Ein_Property As String
    3. Public Event EigeneDatei_Aus_Changed As EventHandler
    4. Public Event EigeneDatei_Ein_Changed As EventHandler
    5. <Category("Alternative Eigenschaften")>
    6. Public Property EigeneDatei_Aus As String
    7. Get
    8. Return _EigeneDatei_Aus_Property
    9. End Get
    10. Set(value As String)
    11. _EigeneDatei_Aus_Property = value
    12. RaiseEvent EigeneDatei_Aus_Changed(Me, EventArgs.Empty)
    13. End Set
    14. End Property
    15. <Category("Alternative Eigenschaften")>
    16. Public Property EigeneDatei_Ein As String
    17. Get
    18. Return _EigeneDatei_Ein_Property
    19. End Get
    20. Set(value As String)
    21. _EigeneDatei_Ein_Property = value
    22. RaiseEvent EigeneDatei_Ein_Changed(Me, EventArgs.Empty)
    23. End Set
    24. End Property
    25. Private Sub HandleEigeneDatei_Aus_Changed(sender As Object, e As EventArgs) Handles Me.EigeneDatei_Aus_Changed
    26. ' ****************************************************************
    27. ' Hier kannst du auf Änderungen der Eigenschaft reagieren
    28. ' ****************************************************************
    29. Call Umschaltbilder_aktualisieren()
    30. End Sub
    31. Private Sub HandleEigeneDatei_Ein_Changed(sender As Object, e As EventArgs) Handles Me.EigeneDatei_Ein_Changed
    32. ' ****************************************************************
    33. ' Hier kannst du auf Änderungen der Eigenschaft reagieren
    34. ' ****************************************************************
    35. Call Umschaltbilder_aktualisieren()
    36. End Sub


    String gegen Filedialog zu tauschen habe ich schon ausprobiert. Klappt leider nicht. Da kommt eine Fehlermeldung, dass die Filedialog nicht in String umgewandelt werden kann.

    Vielen Dank schon einmal im Voraus.

    Volker

    P.S. Habe gerade selbst die Lösung für meine Frage gefunden.

    Einfach so

    <Category("Alternative Eigenschaften")>
    <Editor("System.Windows.Forms.Design.FileNameEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")>
    Public Property EigeneDatei_Ein As String

    Die <Editor...> Zeile über die Public Property Zeile kopieren und schon klappt es,

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

    Hallo zusammen,

    ich habe da doch noch ein kleines Problem.

    Wenn ich den Pfad über die Eigenschaft ausgewählt habe, bleibt der Focus nicht auf dem Control sondern wechselt in die Hauptform.

    Der Dateipfad wird zwar richtig eingetragen, aber das Focuswechseln ist nicht so schön.

    Könnt Ihr mir da kurz helfen?

    Vielen Dank

    Volker

    Volker Bunge schrieb:

    Könnt Ihr mir da kurz helfen?
    Mach ein kleines Testprojekt, das den Effekt reproduziert.
    Bereinige das und hänge es gezippt (ohne bin, obj, vs-Ordner) an einen Post.
    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!
    Hallo RodFromGermany,

    ich hole den alten Beitrag mal wieder nach oben.

    In dem Anhang habe ich jetzt einmal zwei Projekte reingepackt. Einmal das Control selbst und dann ein kleines Testprogramm mit 3 dieser Controls.

    Jetzt kommt aber das für mich komische: Dieses Projekt funktioniert, aber mein eigentliches funktioniert immer noch nicht.
    In meinem Projekt habe ich dann mal in den beiden Eigenschaften alles nach _Eigene_Datei_fuer_False =value bzw. ...True im SET-Bereich deaktiviert. Somit kann keine weitere Aktion hier gestartet werden. Und trotzdem springt der Focus auf die Form meines Testprojektes. Im Anhang funktioniert alles so, wie es soll.

    Also muss doch bei mir hier noch eine Aktion gefeuert werden, die dann zu diesem Problem führt.

    Muss ich jetzt wirklich alle eigenen Properties ohne Handler-Aufruf durchprobieren oder gibt es hier noch andere Fehlersuchmöglichkeiten?

    Es gibt bei mir noch eine Eigenschaft, in der ich ein Verzeichnisauswahl-Dialogfenster mit
    <Editor("System.Windows.Forms.Design.SelectedPathEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", GetType(UITypeEditor))>
    aufrufe. Diese Eigenschaft funktioniert so wie gewünscht.

    Kann es evtl. an dieser Zeile liegen?
    Mein "fehlerhafter" Aufruf sieht so aus

    <Editor("System.Windows.Forms.Design.FileNameEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a",
    "System.Drawing.Design.UITypeEditor, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")>

    Die Zeile findet man ja so im Internet. Hoffentlich bin ich hier nicht der C&P-Bremse auf dem Leim gegangen.
    Kann aber auch irgendwie nicht sein, da sie ja auch in meinem Anhang so steht und funktioniert.

    Wäre schön, wenn Ihr mir helfen könnten, den blöden Fehler zu finden.

    Gruß

    Volker
    Dateien
    @Volker Bunge Pack zunächst das Projekt des UserControls in die Projektmappe des Hauptprogramms und verweise auf das Projekt, nicht aber auf die DLL.
    So kannst Du in das DLL-Projekt hinein debuggen.
    Was muss ich tun, um Deinen Effekt zu reproduzieren?
    Und:
    Wenn Du mich gezielt ansprechen willst, mach das mit @ ' RodFromGermany ' (ohne Leerzeichen).
    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!

    Volker Bunge schrieb:

    Dieses Projekt funktioniert, aber mein eigentliches funktioniert immer noch nicht.
    Hast Du das Nichtfunktionierende irgendwo hier hochgeladen? Ansonsten wird es schwierig, nach einem Fehler zu suchen, wenn das Hochgeladene funktioniert wie gewünscht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo zusammen,

    sorry, dass ich mich erst jetzt wieder melde, hatte aber leider erst heute wieder Zeit weiterzumachen.

    Habe jetzt den Fehler gefunden. Es war kein Programmierfehler sondern ein "Bedienfehler" oder so etwas ähnliches.

    Folgendes:
    @'Fakiz hat mit seiner unscheinbar aussehenden Antwort voll ins Schwarze getroffen. Fakiz hier noch einmal vielen Dank.
    Ich habe den Hinweis am Anfang gar nicht so für voll genommen, da ich mir gedacht habe, ein Doppelklick auf die gewünschte Datei ist doch das Gleiche, wie ein Klick auf die Grafik und ein Klick auf Öffnen. Der Dateipfad wurde ja immer schon richtig übernommen.
    Blöd war leider nur, dass mein Fenster genau über der Testform lag und somit mein Doppelklick im Hintergrund gleich das Wechseln auf ein Control bzw. die Form bewirkte.
    Wenn man mit Öffnen aus der Anzeige raus geht, dann ist nicht der Fall. Natürlich kann man auch das Fenster so verschieben, dass man nicht auf einem Control/einer Form liegt. Aber das macht man ja kaum bis gar nicht.

    Somit ist mein Problem erst einmal hier behoben und ich kann endlich weiter machen.

    Vielen Dank noch einmal für Euren Support.

    Gruß

    Volker
    Hallo zusammen,

    bin jetzt erst wieder dazu gekommen, mit meinem Projekt weiter zumachen.

    Habe leider für mich ein komisches Verhalten festgestellt.

    In den Eigenschaften gibt es eine neue Eigenschaft "Checked" die mit einer internen Variable "_Checked_Eigenschaft" verwaltet wird.

    Wenn ich nun das neue Steuerelement mit F5 starte, bekommt man ja diese Vorschaumaske angezeigt (links als das neue Steuerelement und rechts die Eigenschaften). Wenn ich nun links auf das neue Steuerelement klicke bzw. mit der Tastatur den Checked-Wert ändere, dann ändert sich wie gewünscht auch der Anzeigetext. Über F9 habe ich mir dann auch mal an den neuralgischen Stellen das Ändern der _Checked_Eigenschaften angesehen. Die neue Zuweisung des nächst möglichen Wertes erfolgt hier so wie gewünscht.

    Was sich leider nicht für mich in den Eigenschaften ändert ist der Checked Wert. Da ich auch noch eine neue Eigenschaft eingebaut habe, die mir passend zu meinen Anzeigetexten auch den aktuellen Rückgabetext anzeigen soll, passiert hier leider auch nichts. Erst wenn ich die Eigenschaft "Checked" selbst per Doppelklick ändere, dann wird alles korrekt geändert. Gehe ich aber nur mit einem Links-Klick auf die Checked-Eigenschaft, dann wird mir auch der Rest richtig dargestellt.

    Für mich sieht es so aus, als ob zwar meine interne Variablenzuweisung soweit funktioniert, aber die Rückmeldung bzw. Aktualisierung der neuen Eigenschaften nicht richtig funktioniert.

    In einem Testprojekt kann ich dies ja so nicht testen, da ich ja die Eigenschaften nach dem F5 drücken nicht sehe. Ich habe mir daher mal ein Button zusätzlich eingebaut, der mir den Checked-Wert zurück liefert. Dort klappt alles.

    Daher meine Fragen:
    Ist es also vielleicht nur ein "Fehler" der Vorschau oder liegt doch noch ein Fehler bei mir vor?
    Gibt es irgend einen "Refresh-Befehl", der mir den internen Wert auch nach außen hin richtig anzeigt?

    Vielen Dank schon einmal im Voraus.

    Volker

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

    Moin moin

    Ich hatte mal etwas ähnliches, wenn ich dein Text richtig verstanden habe.
    Fehlt evtl ein: ​Invalidate()

    Sowas in der Art:

    VB.NET-Quellcode

    1. Protected Overrides Sub OnEnabledChanged(e As EventArgs)
    2. MyBase.OnEnabledChanged(e)
    3. Invalidate()
    4. Update()
    5. End Sub


    Vielleicht hilft dir das weiter.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Hallo Amelie,

    vielen Dank für die Rückmeldung.

    Ich habe mal Deine Sub ausprobiert.

    Da meine Änderungen alle bei Click-Ereignissen ausgelöst werden, habe ich die Änderung des Checked-Wertes in eine separaten Sub gepackt und sie beim Klicken mit einem Call - Befehl aufgerufen (dies hatte ich aber schon vorher so angelegt, damit ich nur eine Stelle ändern muss). Da ich für Deine Sub das E as EventArgs benötige, habe ich mir das E vom Click-Ereignis mit in meine Sub weitergeleitet und konnte so das E an Deine Sub übergeben.

    Wenn ich dies aber so mache, dann passiert leider gar nichts. Also wollte ich dann wissen, ob durch die drei Befehle irgend etwas intern passiert. Daher habe ich in Deiner Sub mal die F9 Taste gedrückt und dann mit F11 jede Zeile durchlaufen. Leider konnte ich keinen Absprung in meine Checked-Property oder ähnliches feststellen. Die drei Zeilen werden zwar ordnungsgemäß durchlaufen, aber sonst passiert leider bei mir nichts weiter.

    Wenn ich das anhand der Hilfetexte richtig verstehe, sind das drei Methoden, die einen Neuaufbau bzw. Refresh aller Ereignisse bewirken sollen.

    Hast Du bzw. jemand anderes noch einen Tipp für mich?

    Freundliche Grüße

    Volker
    Hast Du uns ein Testprojekt?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo noch einmal zur später Stunde,

    ich habe gerade noch einmal ein bisschen an einer anderen Stelle gewerkelt. Das Control soll ja später auf ein Feld aus einer Datenquelle reagieren können. Also muss ich es ja einem Tabellenfeld zuweisen, welches ein Boolean - Wert entspricht.

    Hier zu noch ein paar Fragen.

    1. Welcher Datentyp ist hier für die Property richtig (Integer, Variantype, Boolean)? Ich muss ja hier das Tabellenfeld angeben, also wäre eines der genannten Typen im ersten Augenblick ja nicht richtig, da das Tabellenfeld ehr einem String gleich kommt.
    2. Da mein Control auf einen Dreifachstatus bekommen soll (also True, False und Null oder Nothing) möchte ich hier später auch bei Null/Nothing die Möglichkeit haben, ein Control einzusetzen, welches mir dann bei Null/Nothing alle meine Boolean-Datensätze anzeigt. Ist hier Null bzw. Nothing richtig? Also in meinem Testprojekt habe ich mit Null leider keine Datensätze. Bei True und False bekomme ich das richtige Ergebnis angezeigt. Diese Art der Filterung habe in einem Accessdatenbank schon erfolgreich angewendet. Dort kann ich pro Boolean-Wert ein darüberliegende Checkbox dazu verwenden, einen Filter so zu steuern, dass dieser mir entweder nur True, False oder alle Datensätze anzeigt. Diesen Effekt will ich natürlich auch nutzen können.
    3. Wenn ich im Testprojekt auf das Control klicke, ändert sich ja wie gewünscht auch der Text bzw. die Checked-Grafik. Da ich aber nun auch auf diese Veränderung im Testprojekt reagieren möchte, habe ich mal mit MouseClick was probiert. Grundsätzlich funktioniert das auch, aber es ist nur ein sehr kleiner Bereich unterhalb des Textes, der auf diesen Click reagiert. Daher suche ich auch noch eine Möglichkeit, entweder auf den Checked-Changed zu reagieren oder auf einen besseren Mouseklick der dann das gesamte Control beinhalten.

    So, dass waren jetzt erst einmal meine späten Anmerkungen bzw. Fragen.

    Morgen setze ich mich mal ein Testprojekt, welches dann hoffentlich auch die Fehler beinhaltet.

    Gute Nacht, Volker
    Hallo zusammen,

    ich habe gerade mal ein kleines Testprojekt erstellt. Projektvorlage: Windows Forms-Steuerelementbibliothek (.Net Framework) mit VS 2022. Sonst keine weiteren Einstellungen vorgenommen.

    Es besitzt drei Buttons, mit denen ich den Checked-Value-Wert zwischen True, False und Leer schnell einstellen kann.

    Dann gibt es noch zwei Textboxen, die mir den Checked-Wert und den Checked_Value-Wert anzeigen (und 2 passende Labels dazu).

    Wenn man also das Projekt mit F5 startet, dann kommt ja das Testfenster hoch. Links das Control und Rechts die Eigenschaften. Klickt man nun auf einen Button, so wird True, False oder Leer im obersten Textboxfeld angezeigt. Der zweite bleibt erst einmal leer. Erst wenn man das zweite Mal auf den gleichen Button klickt, erscheint auch im zweiten Textfeld der richtige Wert. Nimmt man beim zweiten Klicken aber einen anderen Button, so erscheint im zweiten Textfeld der Wert vom ersten geklickten Button.

    Was aber auch auffällt ist, dass sich weder die Eigenschaft Checked noch Checked_Value ändern. Dies passiert erst dann, wenn man mit der Maus EINMAL auf die jeweilige Eigenschaft klickt. Gibt man nun manuell bei Checked_Value True, False oder Leer ein, so ändert sich zwar die zweite Textbox, aber sonst passiert leider nichts mehr.

    Die Property Checked_Value ist jetzt erst einmal ein schneller Versuch, eine Möglichkeit zu schaffen, ein Tabellenfeld und dessen Inhalt hier zu übergeben. Siehe hier auch mein gestrigen Nachtpost.

    Falls das mit dem Zippen nicht klappt bzw. sich das jemand nicht traut zu öffnen, hier einmal der Code, so wie er im Anhang zu finden ist.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. ' Projektvorlage: Windows Forms-Steuerelementbibliothek (.Net Framework)
    2. Imports System.ComponentModel
    3. Public Class UserControl1
    4. Enum Checked_ENUM
    5. ' *************************************************************************
    6. ' Welche Möglichkeiten habe ich bei dem Checked-Prüfstatus
    7. ' *************************************************************************
    8. Ja = True ' True
    9. Nein = False ' False
    10. Leer = vbNull ' Checked ist hier auch False
    11. End Enum
    12. Dim _Checked_Eigenschaft As Checked_ENUM
    13. Dim _Checked_Value_Eigenschaft As String
    14. Public Event Standard_Aktion_ausfuehren As EventHandler
    15. ' ************************** Checked_Value **************************
    16. <Category("Alternative Eigenschaften"),
    17. System.Runtime.InteropServices.ComVisible(True),
    18. Browsable(True),
    19. EditorBrowsable(EditorBrowsableState.Always),
    20. DefaultValue(False),
    21. Description("Hierüber steuern Sie das Umschalten der Anzeige. Intern steht 0 für FALSE und -1 für TRUE.")>', DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)>
    22. Public Property Checked_Value As String
    23. Get
    24. ' Den aktuellen Wert zurück geben
    25. Return _Checked_Value_Eigenschaft
    26. End Get
    27. Set(value As String)
    28. Try
    29. ' _Checked_Value_Eigenschaft = Val(value)
    30. If LCase(value) = "leer" Then
    31. _Checked_Eigenschaft = Checked_ENUM.Leer
    32. Else
    33. If LCase(value) = "true" Or value = "-1" Then
    34. _Checked_Eigenschaft = Checked_ENUM.Ja
    35. Else
    36. If LCase(value) = "false" Or value = "0" Then
    37. _Checked_Eigenschaft = Checked_ENUM.Nein
    38. Else
    39. MsgBox("Fehler in der Eigenschaft Checked_Value. Sie haben leider einen nicht gültigen Wert übergeben. Erlaubt sind: True, False, Leer, 0, -1")
    40. End If
    41. End If
    42. End If
    43. ' Dann die Aktion ausführen
    44. RaiseEvent Standard_Aktion_ausfuehren(Me, EventArgs.Empty)
    45. _Checked_Value_Eigenschaft = value
    46. Catch ex As Exception
    47. MsgBox("Fehler in der Eigenschaft Checked_Value. " & ex.Message)
    48. End Try
    49. End Set
    50. End Property
    51. ' ************************** Checked **************************
    52. <Category("Alternative Eigenschaften"),
    53. System.Runtime.InteropServices.ComVisible(True),
    54. Browsable(True),
    55. EditorBrowsable(EditorBrowsableState.Always),
    56. DefaultValue(False),
    57. Description("Hierüber steuern Sie das Umschalten der Anzeige. Intern steht 0 für FALSE und -1 für TRUE.")>', DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)>
    58. Public Property Checked As Checked_ENUM
    59. Get
    60. ' Den aktuellen Wert zurück geben
    61. Return _Checked_Eigenschaft
    62. End Get
    63. Set(value As Checked_ENUM)
    64. _Checked_Eigenschaft = value
    65. ' Dann die Aktion ausführen
    66. RaiseEvent Standard_Aktion_ausfuehren(Me, EventArgs.Empty)
    67. End Set
    68. End Property
    69. Private Sub HandleStandard_Aktion_ausfuehren(sender As Object, e As EventArgs) Handles Me.Standard_Aktion_ausfuehren
    70. ' ****************************************************************
    71. ' Hier wird auf Änderungen der neuen Eigenschaften reagiert und die Checkbox optisch den aktuellen Einstellungen angepasst
    72. ' ****************************************************************
    73. ' Aufgrund der neuen Einstellung wird die Anzeige der Grafik bzw. der Textbox neu durchgeführt
    74. Call Anzeige_aktualisieren() ' Muss sein
    75. End Sub
    76. Sub Anzeige_aktualisieren()
    77. If _Checked_Eigenschaft = Checked_ENUM.Ja Then
    78. TextBox1.Text = "True"
    79. End If
    80. If _Checked_Eigenschaft = Checked_ENUM.Nein Then
    81. TextBox1.Text = "False"
    82. End If
    83. If _Checked_Eigenschaft = Checked_ENUM.Leer Then
    84. TextBox1.Text = "Leer"
    85. End If
    86. TextBox2.Text = _Checked_Value_Eigenschaft
    87. End Sub
    88. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    89. Checked_Value = "True"
    90. End Sub
    91. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    92. Checked_Value = "False"
    93. End Sub
    94. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    95. Checked_Value = "Leer"
    96. End Sub
    97. End Class


    Ich hoffe, dass reicht und Ihr habt eine Idee, warum die Eigenschaften nicht so übernommen und angezeigt werden.

    Vielen Dank schon einmal im Voraus, für Eure Mühe und Antworten.

    Volker
    Dateien