[KURIOS] Buttons funktionieren nicht mehr!

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von FloMZ.

    [KURIOS] Buttons funktionieren nicht mehr!

    Hallo allerseits,

    ich habe ein Chart aus der Toolbox in meine Form gezogen und do manuell formatiert so wie es mir gefällt. Dabei habe ich auch die Eigenschaften der Series (Datenreihen) festgelegt, bzw. alle dich ich benötige angelegt. Die Daten die das Diagramm darstellen soll, stammen von einem Messplatz. Zur Beurteilung der Daten, sollen diese live im Diagramm eingetragen werden. Bislang habe ich folgende Prozedur zusammengestellt, um die neuen Daten in einem Array unterzubringen und gleichzeitig im Diagramm darzustellen. Leider macht das Diagramm jedoch garnichts. Es werden keine Linien etc. dargestellt. Fehlt noch ein entscheidender Schritt? Muss vielleicht das Diagramm nach dem hinzufügen von jedem neuen Datenpunkt aktualisiert werden (manuell) oder etwas ähnliches in dieser Richtung? Vielen Dank !


    VB.NET-Quellcode

    1. Private Sub SpeichernDiagramm()
    2. AnzDaten = AnzDaten + 1
    3. ReDim Daten(AnzDaten)
    4. Daten(AnzDaten).Ort_mm = Counter / 60.937
    5. Daten(AnzDaten).Wert1 = CDbl(w1)
    6. Daten(AnzDaten).Wert2 = CDbl(w2)
    7. Daten(AnzDaten).Wert3 = CDbl(w3)
    8. Chart1.Series(0).Points.AddXY(Daten(AnzDaten).Ort_mm, Daten(AnzDaten).Wert1)
    9. Chart1.Series(1).Points.AddXY(Daten(AnzDaten).Ort_mm, Daten(AnzDaten).Wert2)
    10. Chart1.Series(2).Points.AddXY(Daten(AnzDaten).Ort_mm, Daten(AnzDaten).Wert3)
    11. Chart1.Series(3).Points.AddXY(Daten(AnzDaten).Ort_mm, Tolmax)
    12. Chart1.Series(4).Points.AddXY(Daten(AnzDaten).Ort_mm, Tolmin)
    13. End Sub


    UPDATE: Ich habe nun versucht ein neues Chart mit den Daten zu füllen, um zu sehen ob es an meinen bisherigen Einstellungen lag, dass nichts lief. Während das Chart noch ganz normal aussieht, wenn ich es in meiner Form platziere, ist es bis auf die Schrift, durchsichtig wenn ich das Programm "starte". So war das auch leider schon mit dem ersten Diagramm, welches ich nun versuche mit Daten zu füllen. Ich kann die Durchsichtigkeit verhindern, indem ich bestimmte Farben vermeide, in diesem Fall zum Beispiel weiß. Die Standard-Grautöne werden dargestellt... Kann sich jemand erklären, welches Preset daran schuld sein könnte? Bewusst habe ich das jedenfalls nicht herbeiführen wollen. :huh: Vielleicht hat das auch mit meinem ursprünglichen Problem zu tun. Vielleicht sind ja in meinem ersten Diagramm die Datenlinien unsichtbar .... :whistling:
    Bilder
    • Nachher.PNG

      18,41 kB, 434×433, 36 mal angesehen
    • Vorher.PNG

      11,55 kB, 423×450, 35 mal angesehen

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

    Da mir Deine Daten fehlen, habe ich mal ein leeres Chart auf mein Form mit 5 Serien gezogen. Dann den Code mit DummyMaterial gefüllt.

    VB.NET-Quellcode

    1. Private AnzDaten As Integer = 0
    2. Private Structure sDaten
    3. Dim Ort_mm, Wert1, Wert2, Wert3 As Double
    4. End Structure
    5. Private Daten As sDaten() = Nothing
    6. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    7. SpeichernDiagramm()
    8. End Sub
    9. Private Sub SpeichernDiagramm()
    10. AnzDaten = AnzDaten + 1
    11. ReDim Daten(AnzDaten)
    12. Daten(AnzDaten).Ort_mm = AnzDaten / 60.937
    13. Daten(AnzDaten).Wert1 = AnzDaten
    14. Daten(AnzDaten).Wert2 = 2 * AnzDaten
    15. Daten(AnzDaten).Wert3 = AnzDaten * AnzDaten
    16. Chart1.Series(0).Points.AddXY(Daten(AnzDaten).Ort_mm, Daten(AnzDaten).Wert1)
    17. Chart1.Series(1).Points.AddXY(Daten(AnzDaten).Ort_mm, Daten(AnzDaten).Wert2)
    18. Chart1.Series(2).Points.AddXY(Daten(AnzDaten).Ort_mm, Daten(AnzDaten).Wert3)
    19. Chart1.Series(3).Points.AddXY(Daten(AnzDaten).Ort_mm, 1)
    20. Chart1.Series(4).Points.AddXY(Daten(AnzDaten).Ort_mm, 2)
    21. End Sub
    Läuft.
    Ich frag mich nur, ob Du die Daten in Deiner Daten-Struktur behalten willst. Denn mit jedem ReDim Daten(AnzDaten) löschst Du das bisherige Feld und legst ein neues an. Wenn der Inhalt "bleiben soll" (was aber unter der Haube nicht passiert, aber wurscht), verwende ReDim Preserve. Oder besser gleich stattdessen sowas wie List(Of DeineDatenStruktur).
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @VaporiZed : Vielen Dank für den Tipp. Also muss es so aussehen, damit alle Arrays gespeichert bleiben?:

    VB.NET-Quellcode

    1. ​ReDim Preserve Daten(AnzDaten)


    Wie du nämlich schon ganz recht vermutest, möchte ich die Daten am Ende der Messung abspeichern (StreamWriter).

    Ich werde den Titel dieses Threads mal anpassen, da sich ein anderes kurioses Problem als Wurzel allen Übels identifizieren ließ. Und zwar wurden keine Daten dargestellt, da der Button nicht funktioniert. Handler ist korrekt, Button ist enabled. Keine Reaktion. Das fiel mir auf, als ich dem Button gegenüber misstrauisch wurde, da sich nicht mal mehr als Event wenn man ihn drückt, der Text eines Labels ändern ließ. Hatte jemand schon einmal ein solches Problem? Es funktionieren keinerlei Buttons mehr. Auch die nicht, die ich direkt aus der Toolbox auf die Form ziehe!... Ich steuere mein Programm zur Zeit über das Klicken auf Labels, das funktioniert nämlich noch. Was auch nicht funktioniert, ist das beenden des Programms im Debugger über das rote Kreuz von Form 1. Ich muss es immer über das rote Rechteck von Visual Studio beenden.

    Ich habe erst vermutet es wäre der sehr schnell getaktete Timer (1ms) -> er ist es nicht. Auch ein Wert von 5000 (ms) brachte keinen Unterschied.

    Hat es eventuell mit der DatenBindingSource zu tun?

    VB.NET-Quellcode

    1. 'Diese Codezeile lädt Daten in die Tabelle "MeasureFSTDataSet.Daten". Sie können sie bei Bedarf verschieben oder entfernen.
    2. Me.DatenTableAdapter.Fill(Me.MeasureFSTDataSet.Daten)
    3. Private Sub DatenBindingNavigatorSaveItem_Click(sender As Object, e As EventArgs)
    4. Me.Validate()
    5. Me.DatenBindingSource.EndEdit()
    6. Me.TableAdapterManager.UpdateAll(Me.MeasureFSTDataSet)
    7. End Sub


    -> Die Auslastung ist jedoch sehr gering und Klicks auf Label funktionieren ja auch wunderbar und ohne zu mucken.

    Was ist mit meinen Buttons los? Gibt es irgendeine verborgene Eigenschaft / Einstellung, die verändert worden sein könnte? Bin am verzweifeln und will mein Programm nicht über Labels steuern müssen :/ Vielen Dank allen die helfen wollen :)
    Kannst Du das Projekt mal bereinigt, also ohne Obj/Bin/vs-Ordner gezippt hochladen?
    Funktioniert alles, wenn Du ein neues Projekt erstellst?

    Eh ... stop. In Zeile#5 fehlt am Ende die Handles-Klausel. Ich vermute, dass das ganze richtig heißen müsste:

    VB.NET-Quellcode

    1. Private Sub DatenBindingNavigatorSaveItem_Click(sender As Object, e As EventArgs) Handles DatenBindingNavigatorSaveItem.Click

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Wenn ich ein neues Projekt erstelle funktioniert alles top!

    Zur Anmerkung mit dem fehlenden Teil "Handles...". Das funktioniert so leider nicht. Diese Zeilen wurden auch automatische gereriert von Visual Studio, nachdem ich die Datenquelle verknüpft habe. Ich habe da nichts mehr bewusst nachträglich dran verändert. Daher gehe ich davon aus, dass das stimmen sollte.

    Kann man das irgendwie eingrenzen, woran es liegen könnte? Ich kann nämlich leider nicht alles frei zugänglich hier hochladen. Wenn nur bestimmte Teile von Interesse wären, könnte ich diese leichter extrahieren.

    Ich habe mal die Code Analyse durchgeführt. Und zwar bekomme ich unter anderem zwei Fehlermeldungen für die Verbindung zu der Access-Datenbank:
    "Fehlercode: CA2240 / Fügen Sie Typ "DataSet / DataSet.DatenDataTable" eine Implementierung von GetObjectData bei."

    Damit kann ich leider nichts anfangen, ebenso wenig mit der Erklärung auf der Microsoft Support Seite. Kann jemand etwas damit anfangen?

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

    Die Fehlermeldungen würde ich erstmal hinten anstellen. Viel wichtiger ist, wie debuggst du deinen Code? Benutzt du Haltepunkte? Weil es wirkt so, als hättest du nicht die geringste Ahnung, was bei deinem Programm im Hintergrund überhaupt passiert.

    Solche Haltepunkte sind extrem praktisch, weil man Schritt für Schritt nachverfolgen kann, welche Funktionen aufgerufen werden. Zusätzlich kann man jederzeit alle lokalen Werte aller Variablen überprüfen. Damit lassen sich eher triviale Fehler, wie Buttons ohne funktionierende Handler ruckzuck finden.
    Option strict = on

    If it's stupid and it works it ain't stupid.
    Bislang habe ich Haltepunkte nur wenn notwendig eingesetzt. Tatsächlich schlägt ein Haltepunkt, den ich direkt nach dem Button-Klick positioniere nicht an. Also sorgt das Klicken des Buttons nicht dafür, dass das zugehörige Event ausgelöst wird.

    Wie rücke ich das nun zurecht? ?( Kann ich da mit Haltepunkten noch mehr rausfinden?

    FloMZ schrieb:

    Kann ich da mit Haltepunkten noch mehr rausfinden?
    Gugst Du Debuggen, Fehler finden und beseitigen
    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).
    VB-Fragen über PN / Konversation werden ignoriert!

    FloMZ schrieb:

    Wie rücke ich das nun zurecht? Kann ich da mit Haltepunkten noch mehr rausfinden?

    Probier es doch einfach mal aus !

    Setze mal alle möglichen Haltepunkte, aller relevanten Methoden und steppe dich komplett durch.
    Mach das am besten auch immer dann, wenn du Methoden aus dem netz kopierst, dabei kann man viel lernen.

    FormFollowsFunction schrieb:


    Probier es doch einfach mal aus !

    Setze mal alle möglichen Haltepunkte, aller relevanten Methoden und steppe dich komplett durch.
    Mach das am…


    Ok, das habe ich nun getan. Es ist wirklich praktisch, um genau nachvollziehen zu können, was genau wann aufgerufen wird. (Danke auch für den Link @RodFromGermany) Bei mir hilft es leider noch nicht. Form-Load wird ohne Fehlermeldungen ausgeführt. (Den Timer habe ich auch getestet, der läuft in seiner Schleife auch sauber durch und startet immer wieder von vorne...) Leider komme ich nicht bis zu dem Haltepunkt den ich auf den Beginn der Prozedur gelegt habe, die durch den ersten Button ausgelöst werden soll (da der Button ja nicht funktioniert). Also habe ich das hintenrum wieder über ein Label ausgelöst... :rolleyes:

    VB.NET-Quellcode

    1. Private Sub Label12_DoubleClick(sender As Object, e As EventArgs) Handles Label12.DoubleClick
    2. BtnStartMessung_Click(sender, e)


    Daraufhin funktioniert die Prozedur die eigentlich durch den (Start-)Button ausgelöst werden soll einwandfrei. Ebenso alle anderen Prozeduren. Es gab keine Fehlermeldungen, als ich Schritt für Schritt jede Zeile durchgegangen bin. Hätte es welche gegeben, hätten diese doch entweder im Fehler-Fenster oder direkt im Quelltext in der markierten Zeile angezeigt werden müssen, oder? (Meine Version: Visual Studio 2017) Habe ich einen Fehler bei der Untersuchung mit den Haltepunkten gemacht? Leider bin ich nämlich immer noch nicht schlauer, ich weiß nur, dass die Buttons den Dienst verweigern.

    @petaod : Was meinst du genau? Den Schnipsel der in Post Nr.4 erwähnt wurde, habe ich als unnötigen Code identifizieren können. Da ich das zugehörige Steuerlement gelöscht habe, kann es nicht mehr zu dem Save-Klick kommen. Dieser Code wird im laufenden Programm also nicht aufgerufen. Ich habe ihn nun auskommentiert, was jedoch leider auch zu keiner normalen Funktion der Buttons führt :(

    Gerade bemerkt, Checkboxen kann ich auch nicht mehr mit einem Haken versehen, also aktivieren. Ebenso kann ich nichts in Textfelder eintragen. ?(

    Kann vielleicht jemand etwas mit dem Problem anfangen, dass man das Programm nicht mehr über das rote Kreuz im Testbetrieb beenden kann? Vielleicht kommen wir dem Fehler auf diesem Weg auf die Schliche.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „FloMZ“ ()

    FloMZ schrieb:

    Form-Load wird ohne Fehlermeldungen ausgeführt.

    Die Form_Load wird bei einer Exception verlassen und dann geht es munter ohne Meldung weiter, das ist leider so. :(
    Pack den Code mal in die Form_Shown.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:


    Die Form_Load wird bei einer Exception verlassen und dann geht es munter ohne Meldung weiter, das ist leider so. :(
    Pack den Code mal in die Form_Shown.


    Das war schon mal hilfreich! Wenn ich in Form_Shown folgende Zeile auskommentiere, funktionieren alle Steuerelemente wieder!!! :thumbsup:

    VB.NET-Quellcode

    1. Me.DatenTableAdapter.Fill(Me.MeasureFSTDataSet.Daten)


    Das freut mich schon mal riesig. Leider wird ohne die Zeile nichts an Daten aus meiner Access Tabelle abgerufen. Wie kann ich verhindern, dass diese Zeile die Funktion der Steuerelemente unterbindet? :huh: Ich habe versucht über ".Close" die Verbindung danach zu beenden. Hilft leider nichts... Was kann man noch probieren?

    Beim Schritt für Schritt durchgehen wurde kein Fehler bei dieser Zeile angezeigt. Sie wurde einfach sauber durchgegangen, seltsam.

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

    Hier der Screenshot.

    Noch eine Info zum Verhalten des Table Adapters:

    Wenn ich ihn nicht in der Form_Load oder Form_Shown Prozedur aufrufe, sondern nach Programmstart manuell per Button, dann funktionieren alle Button so lange wunderbar, bis ich über die ComboBox (womit man ja den TableAdapter bedient -> Verknüpfung) eine neue Auswahl treffe. Tue ich das, funktioniert wieder kein Button etc...
    Bilder
    • Unbenannt.png

      94,79 kB, 1.653×821, 17 mal angesehen

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

    @FloMZ Kannst Du ein kleines Testprojekt machen, das den Effekt reproduziert?
    Kopiere Dein Projekt und schmeiß raus, was nicht benötigt wird. Teste, dass es läuft und lösch dann das bin- und obj-Verzeichnis.
    Alles in eine ZIP und anhängen.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Ich bin nun zu einer manuellen Lösung übergegangen, nachdem auch eine intensive Suche mit Leuten, die besser programmieren können als ich, zu keinerlei Ergebnissen führte. Trotzdem vielen Dank für eure Tipps, ich habe wieder etwas gelernt! Das Projekt möchte ich nicht online stellen. Die ComboBox fülle ich auf folgendem Weg:

    VB.NET-Quellcode

    1. Private Sub ComboBoxFuellen()
    2. Dim con As New OleDbConnection
    3. Dim cmd As New OleDbCommand
    4. Dim reader As OleDbDataReader
    5. con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=C:\Users\[...]"
    6. cmd.Connection = con
    7. cmd.CommandText = "SELECT Daten.Materialnummer FROM Daten ORDER BY Daten.Materialnummer"
    8. Try
    9. con.Open()
    10. reader = cmd.ExecuteReader
    11. MaterialnummerComboBox.Items.Clear()
    12. Do While reader.Read()
    13. MaterialnummerComboBox.Items.Add(reader("Materialnummer"))
    14. Loop
    15. reader.Close()
    16. con.Close()
    17. Catch ex As Exception
    18. MessageBox.Show(ex.Message)
    19. End Try
    20. End Sub