Datagridview zeigt ausgeblendete Spalten an

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

Es gibt 38 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    @PSJ
    Mit Me.Close arbeite ich ja, das "verbirgt" aber nur die Form und lässt die Steuerelemente so, wie ich sie "verlassen" habe.

    @WhitePage
    Genau, im Entwurfsmodus und beim ersten öffnen passt es.
    Und zur zweiten Frage, ich habe eine sehr umfangreiche Anwendung in Access, welche ich nun in VB (mit MySQL Backend) umsetzen will. Hier kommt es wirklich oft vor, das man Formulare schließt und wieder öffnet. Vielleicht nicht direkt hintereinander, zwischendurch macht man noch andere Sachen in anderen Formularen, aber letztendlich ist es so.
    Die Frage war nicht, warum der User das gleiche Formular öffnet, sondern warum es dasselbe OBJEKT sein soll? Warum erzeugst du nicht jedes Mal ein neues Objekt der Formularklasse, wenn die Daten vom ersten Öffnen nicht übernommen werden sollen?

    Für mich hat es nur einen Sinn, das Objekt nicht zu zerstören, wenn die Daten für später gebraucht werden.

    Ansonsten:

    VB.NET-Quellcode

    1. Using frmRegion as New FormRegion 'oder wie deine Klasse heißt
    2. frmRegion.ShowDialog()
    3. End Using


    EDIT: Mal eine blöde Frage, erzeugst du überhaupt ein Objekt oder verwendest du die Klasse? Das würde natürlich das Problem dann erklären.
    Dann habe ich dich falsch verstanden und werde deinen Vorschlag umsetzen.
    Ich war der Meinung, das Me.Hide die Version war, um die Form nicht zu "zerstören" und Me. Close eigentlich das richtige ist. Vielleicht hält der TableAdapter die Form auch im Hintergrund am Leben.

    Zu deinem Edit. Wenn ich dich richtig verstehe verwende ich bisher die Klasse. Ich rufe also direkt die Form auf und nicht wie bei deinem Vorschlag als neues Objekt. Scheinbar ist VB doch eine größere Umstellung für mich als gedacht.

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

    Bisher habe ich sie mit .ShowDialog(Me) geöffnet. Das hatte zur Folge, dass das Formular beim schließen nicht entladen wurde und dadurch irgendwie mein ursprünglich beschriebenes Problem verursacht wurde. Öffne ich es mit .Show(Me) klappt alles soweit wie gewünscht, mit dem Nachteil das ich die dahinter liegende Form anklicken kann. Und das will ich eigentlich auch nicht. Ein Teufelskreis X(
    Ich kann dir gerade nicht folgen. Mehr als frmRegion.Show(Me) bzw frmRegion.ShowDialog(Me) habe ich nicht um die Form zu öffnen. Der oben vorgeschlagene Code von dir mit Using bewirkt zwar, das .ShowDialog(Me) so funktioniert wie ich es will und die Form wirklich beim schließen entläd, allerdings bewirkt es wohl auch, das eine weitere Form, welche ich in der frmRegion öffne, nicht mehr auf diese zugreifen kann.
    Ich kann ja nochmal zusammen fassen: in frmStart öffne ich die Form frmRegion. Diese ist mittels TableAdapter an eine Datenbank gebunden. Nutze ich zum öffnen frmRegion.ShowDialog(Me) wird die Form beim schließen nicht entladen, die Steuerelemente sind also beim erneuten öffnen noch sie wie ich sie beim schließen verlassen habe und nicht wie beim ersten öffnen z.B. gesperrt. Dadurch kommt es wohl auch zu meinem ursprünglichen Problem. Erzeuge ich mittels Using ein neues Objekt und öffne es klappt das erneute öffnen auch problemlos. Allerdings kann ich dann wohl nicht von der Form frmRegionAnschrift, welche ich in frmRegion öffne, auf diese zugreifen. Öffne ich frmRegion mit .Show(me) klappt alles wie gewünscht, ich kann dann allerdings auf die dahinterliegende Form klicken. Und das will ich auch verhindern. Hoffe ich habe das nochmal richtig und halbwegs verständlich zusammen gefasst.
    Hallo AndPod,

    ich kenne das Phänomen der nicht unsichtbaren (ID-)Spalten und habe bei meinen Projekten meist eine Region mit solchem Code, nachdem ich das Problem und die Lösung in dem u.g. Posting gefunden hatte (hier für ein "BlaDGV"):

    VB.NET-Quellcode

    1. ' VS-Bug ausbügeln: Das Ausblenden von Columns geht nicht (immer) zur Designzeit, erst wenn die Datenbindung fertig ist
    2. ' (http://forums.codeguru.com/showthread.php?372142-Hiding-a-DataGridView-column)
    3. Private Sub BlaDGV_DataBindingComplete(sender As Object, e As DataGridViewBindingCompleteEventArgs) Handles BlaDGV.DataBindingComplete
    4. BlaDGV.Columns("BlaDGVIDColumn").Visible = False
    5. End Sub

    Ist nur ein Workaround, aber führt zum Ziel. Mache ich für die DGV's, bei denen das Problem auftritt, meist sind das nur sehr wenige. Hope that helps.
    Ich glaube, du hast immer noch das Problem nicht verstanden.
    Mit frmRegion als Klasse kannst du zwar eine Form öffnet, allerdings nicht objektorientiert, weil im Hintergrund zwar ein Objekt erzeugt wird, es aber Probleme auftreten, wenn man ein zweites Mal öffnen will.

    Du musst kein Using nutzen. Dann deklariere halt das Objekt der Form einfach so:

    VB.NET-Quellcode

    1. Dim frmRegion As New frmRegion

    Jetzt hast du ein Objekt und die Probleme treten nicht mehr auf.
    @WhitePage
    Ich denke ich habe es soweit schon verstanden. Wenn ich eine Form mehrmals parallel öffnen will muss ich sie entsprechend als neues Objekt deklarieren. Habe ja auch oben geschrieben, das dieser Weg durchaus funktioniert. Ich öffne die Form aber nicht mehrmals parallel, sondern öffnen -> schließen -> öffnen -> schließen. Mit .Show funktioniert das auch wie gewünscht, ich kann allerdings die dahinter liegende Form anklicken was ich nicht will. Mit .ShowDialog kann ich zwar wie gewünscht nicht mehr die dahinter liegende Form anklicken, sie entläd allerdings nicht beim schließen sondern behält ihren letzten Zustand.

    Wenn ich jetzt Dim statt Using nehme funktioniert auch der Zugriff. Danke dafür.

    Trotzdem interessiert mich, ob das beschriebene Verhalten normal ist, das eine mit ShowDialog geöffnete Form (ohne sie als neues Objekt zu deklarieren) beim schließen nicht entladen wird, eine mit. Show geöffnete allerdings schon.

    AndPod schrieb:

    Wenn ich eine Form mehrmals parallel öffnen will muss ich sie entsprechend als neues Objekt deklarieren

    Nein nein, du musst IMMER ein neues Objekt deklarieren. VB ermöglicht es dir, eine Form ohne Instanziierung zu öffnen, allerdings ist es eine ganz schlechte Art zu programmieren, weil du immer ein Objekt in einer objektorientierten Programmierung brauchst (wie der Name schon sagt).


    AndPod schrieb:

    das eine mit ShowDialog geöffnete Form (ohne sie als neues Objekt zu deklarieren)

    Deswegen kann man die Frage so nicht stellen, ob es ein Normalverhalten ist. Weil das, was du machst, ist schon kein Normalverhalten.

    AndPod schrieb:

    ob das beschriebene Verhalten normal ist, das eine mit ShowDialog geöffnete Form (ohne sie als neues Objekt zu deklarieren) beim schließen nicht entladen wird, eine mit. Show geöffnete allerdings schon.
    Ja, das ist normales Verhalten.
    Vmtl. geht MS bei mit ShowDialog geöffneten Forms davon aus, dass da noch iwas von abgerufen werden soll - denn .ShowDialog() ist ja für Dialoge gedacht, also womit ein User was eingibt.

    AndPod schrieb:

    dann war .ShowDialog die falsche Wah
    Gugst Du hier.
    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!

    AndPod schrieb:

    Wenn es von MS so gewollt ist, dann war .ShowDialog die falsche Wah
    ich denke eher, es war die richtige Wahl, denn du willst ja verhindern, dass der User während der Eingabe in den Dialog gleichzeitig im Hauptform noch iwas ganz anneres anfängt.

    Aber wenn du sagst, es war die falsche Wahl - ich hab wohl nicht richtig verstanden, was du erreichen willst.