Feld in DataGridView dynamisch ausblenden

  • VB.NET

Es gibt 34 Antworten in diesem Thema. Der letzte Beitrag () ist von frankseipferd.

    Feld in DataGridView dynamisch ausblenden

    Hallo,

    ich habe eine Form mit einer DataGridView, die ich für drei unterschiedliche Arbeitsprozesse benutze.
    Je nachdem, welcher Arbeitsprozess gerade dran ist, soll das Feld Rechnungsdatum ausgeblendet werden.

    Ich habe diesen Code beim Load-Ereignis eingebaut:

    VB.NET-Quellcode

    1. Me.DataGridView.Columns("Rechnungsdatum").Visible = False


    Auch da wird die zugehörige DataTable per TableAdapter befüllt.
    Alles weitere läuft über den Designer.

    Wenn ich den Code vor die Befüllung der DataTable setze, erhalte ich überhaupt keine Daten und kann auch nichts eingeben und das Feld ist nach wie vor sichtbar.
    Setze ich ihn nach der Befüllung, bekomme ich Fehlermeldung bezüglich ungültigen Cell-Werten in meinen ComboBoxen und das Feld wird ebenfalls nicht ausgeblendet.

    Ich versteh weder die eine Logik noch die andere...

    Kann mir jemand helfen?
    @frankseipferd Natürlich kannst Du die Sichtbarkeit einer Spalte schalten, die auch existiert.
    Wenn Du das DGV per DataBinding befüllst, ist es vorher völlig leer, es kennt auch keine Spalten. Die werdfen ihm erst bei Befüllung kund getan.
    Das einzige, was Du machen kannst, ist, zu überprüfen, ob die betreffende Spalte existiert. Wenn nein, machst Du nix, wenn ja, machst Du sie unsichtbar:

    VB.NET-Quellcode

    1. If Me.DataGridView2.Columns("Value") Is Nothing Then
    2. Return
    3. End If
    4. Me.DataGridView2.Columns("Value").Visible = Not Me.DataGridView2.Columns("Value").Visible
    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!
    Danke für die Info.

    Leider funktioniert es auch mit deinem aufgeführten Code nicht. Ich bekomme nach wie vor dieselben Fehler wie oben beschrieben :(

    Es muss irgendwie mit den ComboBoxen zu tun haben, die ich per Designer der DGV hinzugefügt habe. Denn da kommt dann der ungültige Cell-Wert zustande. Ohne das Ausblenden der Spalte, funktioniert es einwandfrei.

    frankseipferd schrieb:

    Es muss irgendwie mit den ComboBoxen zu tun haben
    Nö.
    Ich hab Deine Spalten im DGV-Designer erzeugt und es funktioniert problemlos.
    Kann es sein, dass Du das DGV mit unterschiedlichen Mehtoden bestückst (die DGV-Zellen als solche / Zellen einer DataTable)?
    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!
    Versteh nicht ganz wie du es meinst...

    ich habe meine DGV erstellt und an eine BindingSource gekoppelt, welche eine DataTable aus einem DataSet bindet.

    Dann habe ich mehrere Spalten als ComboBoxen hinzugefügt. Der PobertyName kommt aus der dem Feld der BindingSource des DGV. Für die Display- und ValueMember habe ich eine weitere BindingSource, die auf die entsprechende DataTable zugreift, die mir die Inhalte für die DropDownListe liefert.
    @frankseipferd Erstell ein kleines Testprojekt, das Deinen Fehler reproduziert und hänge das als ZIP an Deinen Post an.
    Entweder findest Du beim Erstellen des Testprojektes Deinen Fehler oder wir finden ihn. :thumbsup:
    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!
    Dann ersetz Deine SQL-Tabelle durch eine DataTable, die Du im Code mit Testdaten befüllst.
    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!

    frankseipferd schrieb:

    VB.NET-Quellcode

    1. Me.DataGridView.Columns("Rechnungsdatum").Visible = False
    Wenn ich den Code vor die Befüllung der DataTable setze, erhalte ich überhaupt keine Daten und kann auch nichts eingeben und das Feld ist nach wie vor sichtbar.
    Ich könnte mir vorstellen, das Prob ist ganz anders:
    Nämlich dass du das im FormLoad aufrufst, eine Exception auftritt, die im Form_Load ja leider nicht den Debugger aktiviert.

    Änder das mal so, dass du die Spalte erst auf ButtonClick hin versteckst.
    Dann bekomme ich diese Felhermeldung:
    {"Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."}

    Code sieht so aus:

    VB.NET-Quellcode

    1. Private Sub btnBuchen_Click(sender As Object, e As EventArgs) Handles btnBuchen.Click
    2. Me.DataGridView.Columns("Rechnungsdatum").Visible = False
    3. End Sub


    Der Button ist in der Form wo auch das DGV ist.
    @ErfinderDesRades Den Test hab ich doch in Post #2 bereits drinne.
    @frankseipferd Hast Du den ignoriert?
    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!

    frankseipferd schrieb:

    Ne aber
    Testen musst Du jede einzelne geschriebene Zeile Code!
    Egel, ob Projekt oder Testprojekt.
    Die meisten Posts hier im Forum kommen ja daher, dass die jungen Kollegen meinen, sie würden fehlerfreien Code schreiben (gibt es nicht), und dann wundern sie sich, dass der Code das macht, was sie geschrieben haben, nicht aber das, was sie gedacht haben. 8o
    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!
    Also irgendetwas ist an meinem Programm jetzt verkorkst...

    Normalerweise bzw. bis vor Kurzem hat das DataSet auch noch die Schemainformationen der DB übernommen und ich konnte in der DataGridView z.B. keine Schlüsselverletzungen o. Ä. konsturieren.
    Jetzt kann ich das, ohne dass er einen Fehler bringt.

    Dann steigt die FormLoad-Prozedur nach dem Befehl an Zeile 19 aus, da beim Eingeben neuer Datensätze keine Defaultwerte mehr vorbelegt werden, was ebenfalls vor Kurzem noch funktoniert hat :(

    Weis jemand von Euch, woran das liegen könnte... Ich weis leider nimmer wirklich, was ich zwischenzeitlich alles geändert habe...

    Hier der FormLoad-Code:

    VB.NET-Quellcode

    1. Private Sub frmUmsaetzeBearbeiten_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. ' Formularinhalt abhängig von Umsatzbasis und Land initialisieren
    3. Select Case pblintUmsatzbasisID
    4. Case 1
    5. Text = "Rebate Lieferantenumsätze"
    6. TblUmsaetzePNTableAdapter.FillBy(DataSet.tblUmsaetzePN, 1, pblintJahr)
    7. Case 2
    8. Text = "Rebate ZR-Umsätze"
    9. TblUmsaetzePNTableAdapter.FillBy(DataSet.tblUmsaetzePN, 2, pblintJahr)
    10. Case 3
    11. Text = "Rebate ZRR-Umsätze"
    12. TblUmsaetzePNTableAdapter.FillBy(DataSet.tblUmsaetzePN, 3, pblintJahr)
    13. End Select
    14. TblWaehrungenTableAdapter.Fill(DataSet.tblWaehrungen)
    15. TblUmsatzartenTableAdapter.Fill(DataSet.tblUmsatzarten)
    16. TblUmsatzzyklenTableAdapter.Fill(DataSet.tblUmsatzzyklen)
    17. TblMehrwertsteuerTableAdapter.FillBy(DataSet.tblMehrwertsteuer, pblintVerbundgruppennummer)
    18. ' Defaultwerte initialisieren
    19. DataSet.tblUmsaetzePN.Columns("Jahr").DefaultValue = pblintJahr
    20. DataSet.tblUmsaetzePN.Columns("UmsatzartID").DefaultValue = 1
    21. DataSet.tblUmsaetzePN.Columns("UmsatzzyklusID").DefaultValue = 1
    22. DataSet.tblUmsaetzePN.Columns("WaehrungID").DefaultValue = 1
    23. DataSet.tblUmsaetzePN.Columns("MwStSatz").DefaultValue = 0.19
    24. End Sub

    frankseipferd schrieb:

    Hier der FormLoad-Code
    Weg mit der Form_Load. Pack den Code in die Form_Shown oder zum Test in eine Button_Click.
    Da wird dann eine ordentliche Exception geworfen, auf die wir reagieren können.
    So ist das nur Stochern im Nebel.
    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!

    frankseipferd schrieb:

    Also irgendetwas ist an meinem Programm jetzt verkorkst...
    Normalerweise bzw. bis vor Kurzem hat das DataSet auch noch die Schemainformationen der DB übernommen und ich konnte in der DataGridView z.B. keine Schlüsselverletzungen o. Ä. konsturieren.
    Jetzt kann ich das, ohne dass er einen Fehler bringt.
    Dann steigt die FormLoad-Prozedur nach dem Befehl an Zeile 19 aus, da beim Eingeben neuer Datensätze keine Defaultwerte mehr vorbelegt werden, was ebenfalls vor Kurzem noch funktoniert hat :(
    Weis jemand von Euch, woran das liegen könnte... Ich weis leider nimmer wirklich, was ich zwischenzeitlich alles geändert habe...
    Du bist ja lustig! Blickst selbst nicht mehr durch, und wir sollen dir sagen, was du geändert hast?

    Aber tatsächlich habe ich eine Idee. Weil nämlich neulich hab ich ja einen Herzkasper gekriegt, als du folgende "Lösung" eines anderen Problems präsentiertetest:

    frankseipferd schrieb:

    Ich hab mittlerweile eine Lösung gefunden...
    Für diejenigen, dies interessiert wie man Feldeigenschaften und Constraints etc. in DataTables per Code ändert:

    VB.NET-Quellcode

    1. DataSet.DataTable.Columns("Feldname").AllowDBNull = True ' --> Lässt Nullwerte in der Spalte zu
    2. DataSet.DataTable.PrimaryKey = Nothing ' --> Setzt den Primärschlüssel zurück
    Also wenn man seine Datasets dermassen auf-hackt, da kann man glaub nicht mehr für viel garantieren ;)

    Also nur eine Vermutung/Assoziation - ob das wirklich die Ursache ist, kann ich natürlich nicht wissen.



    Was ist eiglich aus den DGV-Columns geworden? Ich finde Threads eiglich ziemlich unbefriedigend, wenn ein Thema nicht zuende gebracht wird.