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.

    Datagridview zeigt ausgeblendete Spalten an

    Hallo,

    ich habe in einem Formular ein gebundenes Datagridview. Dort lasse ich mir aus der entsprechenden Table zwei Spalten "anzeigen", die ID und einen Anzeigewert. Die ID-Spalte ist ausgeblendet (visible=false) da ich diese nur für spätere Zwecke brauche. Öffne ich das Formular, wird mir richtigerweise nur die Anzeige-Spalte angezeigt. Schließe ich jetzt das Formular und öffne es erneut wird mir auch plötzlich die ID-Spalte angezeigt.
    Zur Laufzeit/beim öffnen der Form aktualisiere ich nur die Daten im TableAdapter, ich weiße die Datenquelle nicht neu zu oder mache sonstwas damit.

    Hat jemand eine Idee woran es liegen könnte? Ich kann den Zugriff auf die ID auch anderweitig lösen und die Spalte im DGV entfernen, mich interessiert aber, warum das so auftritt.

    Gruß, André
    Damit ich es richtig verstehe, dein Problem ist das die "ID" Spalte wieder angezeigt wird obwohl sie Unsichtbar sein sollte richtig ?

    Du kannst mal durch debuggen und immer wieder Prüfen ob sie auf Visible = True steht. Irgendwo muss es ja passieren.

    Würde es nicht reichen die Column Width auf 0 zu setzen ?

    AndPod schrieb:

    Die ID-Spalte ist ausgeblendet
    Wo / zu welchem Zeitpunkt wird dieser Code aufgerufen?
    Wie wird die zweite Form aufgerufen (modal / nicht modal)?
    Form, DGV, Spalte im Designer .Visible = False.
    Ich kann die Form modal / nicht modal beliebig oft aufrufen, die Spalte bleibt unsichtbar.
    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!
    Da brauche ich ehrlich gesagt nicht viel debuggen, da die einzige Zeile Code die ich noch übrig gelassen habe die ist, die VS automatisch anlegt um den TA zu befüllen. Ich habe mir jetzt mal davor und danach den Visible Status der Spalte 0 anzeigen lassen; beim ersten öffnen davor und danach false, beim zweiten davor false, danach true.

    Die Form wird per Showdialog geöffnet, die Eigenschaften des DGV sind alle im Entwurfsmodus festgelegt. Zur Laufzeit verändere ich da nichts mehr.

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

    @AndPod Ich ignoriere auch immer die Posts, in denen Fragen gestellt werden, an statt das Problem zu lösen. X(
    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!
    Als ich meine Antwort geschrieben habe war deine noch nicht da. Nach dem absenden habe ich dann deine gesehen, konnte aber keine weitere Antwort geben, musste meine erste also erst editieren, was ich auch getan habe.
    Ich schreibe es aber auch gerne nochmal:
    - Sämtliche Eingeschaften des DGV werden im Entwurfsmodus gesetzt, zur Laufzeit wird nichts verändert
    - Form wird mit Showdialog geöfnet
    - im Load-Event wird der TA befüllt (Me.TableAdapterRegion.Fill(Me.DataSet.Region))
    - die Daten werden wie gewünscht angezeigt
    - Form wird geschlossen (Me.Close)
    - Form wird wieder geöffnet (Showdialog)
    - ID-Spalte wird plötzlich angezeigt
    @AndPod OK, das macht offensichtlich der TableAdapter.
    Du kannst ja ein leeres DGV mit einer Tabelle befüllen, da kommen die Spaltendefinitionen aus der Tabelle.
    Mach die spalte unsichtbar, nachdem Du dem DGV die DataSource zugewiesen hast.
    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!
    @RodFromGermany
    Ja, der ist als einziges im Quellcode übrig geblieben. Warum er aber erst beim zweiten Start des Formulars die 0. Spalte einblendet ist mir unverständlich. Hängt das vielleicht mit der "ClearBeforeFill" Option zusammen? Die steht auf True. Beim ersten Start leert er vielleicht nichts weil noch nichts drin ist, beim zweiten dann schon.
    Die Datasource weiße ich ja nicht zur Laufzeit zu. Im Entwurfsmodus habe ich den DGV die entsprechende Ressource zugewiesen und die automatisch angelegten Spalten so bearbeitet wie es mir passt. Und Spalte 0 auf Visible = False.

    Ich blende jetzt die 0. Spalte nochmal zur Laufzeit aus, damit klappt es. Aber komisch finde ich es schon.
    Ich hatte sowas auch, das lag am Entwurf. Bei der Bindung hatte ich ein paar Felder manuell verbunden und später die Bindung der DataSource hinzugefügt. Weißt jetzt nicht mehr, warum genau.
    Auf jeden Fall war es genau so, dass plötzlich beim nächsten Mal alle Spalten eingeblendet wurden, allerdings schon im Entwurfmodus, wenn man das Projekt zweites Mal aufgemacht hat. Ist es bei dir auch so? Ich würde das DGV komplett löschen und neu anlegen, darauf achten, dass zuerst die DataSource gesetzt wird und die Spalten automatisch erzeugt werden und dann die Visible setzen.

    WhitePage schrieb:

    Ich würde das DGV komplett löschen und neu anlegen, darauf achten, dass zuerst die DataSource gesetzt wird und die Spalten automatisch erzeugt werden und dann die Visible setzen.

    Habe das eigentlich genauso gemacht. DGV eingefügt, an die Quelle angebunden und dann Eigenschaften angepasst. Keine Spalte manuell hinzugefügt. Trotzdem Danke für den Hinweis.

    PSJ schrieb:


    Würde es nicht reichen die Column Width auf 0 zu setzen ?


    Wenn ich im Entwurfsmodus die Spalten bearbeite ist der kleinste Wert für "MinimumWidth" 2 bzw "FillWidth" muss auch größer 0 sein. Aber hier bleibt dann zumindest die Spaltenbreite auch bei mehrmaligen öffnen. Von daher ist das durchaus auch eine Alternative, danke.
    Ich vermute das Problem jetzt eher bei der Form. Ich öffne diese ja mit

    Quellcode

    1. frmRegion.ShowDialog(Me)
    und schließe sie mit

    Quellcode

    1. Me.Close

    Letzteres scheint die Form aber nicht wirklich zu schließen sondern nur auszublenden, denn wenn ich sie wieder öffne sind die Felder aktiv, die beim schließen aktiv waren. Kurz zur Erklärung:
    In der Form sind einige Steuerelemente in einer GroupBox, da sie nur bei Bedarf bearbeitet werden dürfen. Die Groupbox ist per default enabled=false. Setze ich diese nun zur Laufzeit auf Enabled=True und schließe das Formular, ist der Status beim erneuten öffnen auch auf True. Das ist mir bei meinen bisherigen Projekten so nicht aufgefallen bzw. war nicht nötig. Ist das normal unter VB oder mache ich da gerade was falsch?
    Ich vermute mal, dadurch das die Form beim schließen trotzdem noch da ist wird durch das erneute öffnen und aktualisieren des TableAdapters das DGV neu aufgebaut. Warum sich der Wert von Visible=False auf Visible=True ändert, aber nicht die Breite der Spalte welche ich jetzt auch noch im Entwurfsmodus festgelegt habe ist mir weiterhin ein Rätsel.
    Wenn ich das DGV nur an ein Dataset binde tritt das Problem nicht auf, scheinbar nur wenn dahinter noch eine Datenbank hängt.
    Wie kann ich denn die Form komplett entladen bzw. in den Ursprungszustand beim öffne versetzen?
    @PSJ
    In Visual Studio scheint es kein Unload Me zu geben. Ich kannte das auch noch von früher.
    Das Form_Load Event wird ja beim erneuten öffnen ausgeführt, ich regele da aber nicht, welche Steuerlemente beim Start gesperrt sind, das stelle ich ja im Entwurfsmodus ein ein. Wäre ärgerlich wenn ich es da nochmal machen muss.

    @WhitePage
    Das Verhalten tritt ab dem zweiten öffnen auf. Das DGV kann ich sicherlich zur Laufzeit entsprechend anpassen, bzw. reicht es ja wie oben erwähnt das ich die 0. Spalte einfach nochmal ausblende. Das ist auch nicht der immense Programmieraufwand gewesen. Mir ging es letztendlich darum zu verstehen ob es normal ist oder wo das Problem liegen könnte.