Ich generiere alle meine Spalten in einer Unterklasse DataGridView
programmgesteuert. Visual Studio 2008 liest jedoch weiterhin meine Konstruktorklasse (die einen DataTable
mit leerem Inhalt füllt und an den DataGridView
bindet) und generiert Code für die Spalten in der InitializeComponent
-Methode - in der Prozesseinstellung AutoGenerateColumns
auf false
.
Dies verursacht Fehler bei der Entwurfszeitkompilierung, die nur gelöst werden, indem man manuell in den Entwurfscode geht und alle Verweise auf diese automatisch generierten Spalten löscht.
Wie kann ich damit aufhören?
Ich habe es versucht:
DataGridView
instanziierten Objekts protected
(vorgeschlagen in einem früheren Post, der sich auf diese Seite ) Es klingt, als würden Sie im Konstruktor Steuerelemente hinzufügen. Vielleicht fügen Sie die Spalten etwas später hinzu - vielleicht etwas wie das Überschreiben von OnParentChanged
; Sie können dann DesignMode
überprüfen, sodass Sie die Spalten nur während der Ausführung hinzufügen (nicht während des Entwurfs).
Ich habe dieses Verhalten zuvor bei ComboBox mit der Eigenschaft Items gesehen und es ist wirklich frustrierend. Hier ist, wie ich es mit ComboBox geschafft habe. Sie sollten dies auf das DataGridView anwenden können.
Ich habe eine "neue" Eigenschaft namens Items erstellt und diese so eingestellt, dass sie nicht durchsucht werden kann und explizit vor der Serialisierung verborgen werden muss. Unter der Haube greift es nur auf die Eigenschaft real Items zu.
%Vor%Mark hatte Recht. Der Designer betrachtet den Konstruktor für dieses automatisch generierende Verhalten. Hier ist, wie ich es geschafft habe.
Nimm den Code, der die DataTable zum DataGridView außerhalb des Konstruktors konstruiert / bindet und in eine Methode einfügt.
Verwenden Sie das Load
-Ereignis für das enthaltende Formular, das mehrere DataGridView
s enthält, rufen Sie die BindData()
-Methode für jede Instanz auf,
Dabei ist GetAllChildControls
eine Methode in einer Hilfsklasse
%Vor%
Tut mir leid, wenn das explizit ist, aber ich möchte nie vergessen, wie das geht!
Ich bin auf ein ähnliches Problem gestoßen und stelle meine Lösung hier her, seit ich meine Frage geschrieben habe, war dies die am häufigsten vorgeschlagene Frage. Jedes Mal, wenn ich meinen Code kompilierte, fügte der Designer automatisch jede der Spalten in der Datenquelle hinzu (und das nächste Mal, wenn ich meinen Code erstellte, würden sie in der laufenden App erscheinen), obwohl die automatisch generierten Spalten auf false gesetzt waren.
Schließlich konnte ich es stoppen, indem ich einer meiner Spalten denselben Namen gab wie die automatisch generierte Spalte (meine Spalten wurden ursprünglich manuell erstellt, bevor die Datenquelle verfügbar war).
Ich mache das häufig in meinen benutzerdefinierten Steuerelementen. Wenn Sie den Code, den Sie nicht im Designer ausführen möchten, in eine DesignMode-Überprüfung einbinden, sollte dies Ihre Probleme beheben.
%Vor%Dies ist jetzt eine alte Frage, aber es ist immer noch ein Problem in 2014 mit VS2013.
Ich hatte ein DataGridView
mit seinem DataSource
, das auf ein BindingSource
gesetzt wurde, das wiederum ein anderes BindingSource
als DataSource
hatte. Um mein Problem zu lösen, musste ich nichts anderes ändern, als die DataGridView.DataSource-Zuweisung in eine OnControlCreate
-Überschreibung für das Formular zu verschieben.
@ JaredPars Antwort brachte mir den größten Teil der Lösung, aber alle Steuerelemente, die meine DataGridView
Unterklasse enthielten würde die Spalten hinzufügen, wenn sich irgendetwas im Designer geändert hat.
Ich wollte die Spalten im Konstruktor behalten, damit sie im visuellen Designer angezeigt werden, also musste ich den Standard DataGridViewDesigner
deaktivieren, den meine Unterklasse von ihrer Basis erbte, d. Ich habe das Designer-Attribut für meine Klasse geändert ...
Es bedeutet, dass Designer die Elemente zum Bearbeiten von Elementen in den DataGridViewDesigner-Tasks nicht verwenden können, und sie konnten die Eigenschaften der Spalten nicht anpassen, wenn sie möchten, aber für meine Bedürfnisse war das nicht besonders nützlich also war es kein Verlust.
Wie auch immer, das behob das Problem und es bedeutete immer noch, dass die Spalten im Designer sichtbar waren, was mein primäres Ziel war.
Ich dachte nur, ich würde teilen.
Da dies für einige immer noch eine Frage zu sein scheint, einschließlich meiner selbst bis vor ein paar Tagen, dachte ich, ich würde meine Lösung posten und die, die ich den Schülern in meinen Klassen lehre von diesem Punkt an:
Zuerst erstelle ich ein DataGridView
(DGV) -Objekt und erstelle die Spalten in der Entwurfsansicht, wobei ich den Objektnamen für die bestimmte Spalte notiere.
Wenn ich jetzt Daten aus meiner Datenbank binden möchte (SQL Server für diesen Code). Ich ändere die Spaltenobjekte und binde jede Spalte direkt an die Daten von DataTable
.
Für den obigen Code ist die DBConnection eine öffentliche Eigenschaft für das Objekt, von dem ich diesen Code genommen habe, das das Objekt SqlConnection
gespeichert hat. Außerdem war colAddressType eine ComboBox-Spalte. Daten aus dem gebundenen DataTable
können nur Informationen entsprechen, die in der ComboBox aufgeführt sind. In ähnlicher Weise ist colState eine ComboBox-Spalte, aber die Standardwerte für dieses Feld werden hinzugefügt, indem eine andere Tabelle abgefragt wird, die alle Zustände enthält (in den Vereinigten Staaten für dieses Beispiel).
Der Punkt hier ist, dass Sie die Daten binden können, die Sie in eine DGV einbeziehen möchten, indem Sie die Spalten zur Entwurfszeit erstellen und dann Ihre Daten direkt von der DataTable an die Spalten binden. Auf diese Weise können Sie jede Art von Spalte verwenden und nicht nur die Standard-Textspalte, die Ihnen vom Standard-Bindungsmechanismus zugewiesen wird.
Es sollte beachtet werden, dass die DataTable in diesem Fall das Ergebnis einer gespeicherten Prozedur ist und dass die Bearbeitung in diesem Fall nicht wahrscheinlich ist. Ich habe versucht, sowohl eine Ansicht als auch eine gespeicherte Funktion zu verwenden. der erste erlaubte das Editieren nicht (zumindest nicht leicht ... ich vermute, dass ich irgendwo vor dem Trigger ein Insert brauchte, aber das ist eine Datenbankfrage), während das zweite die Tabelle aufgrund eines Problems mit dynamic nicht zurückgeben würde Tabellengenerierung.
Öffnen Sie das Formular im Designer erneut, so dass die Spalten automatisch generiert werden. Klicken Sie dann auf DataGridView, wählen Sie Spalten bearbeiten, gehen Sie durch die einzelnen problematischen Spalten und legen Sie die Eigenschaft "Sichtbar" auf False fest. Speichern und schließen / öffnen Sie das Formular erneut, um sicherzustellen, dass es nicht mehr passiert. Dies war die einzige nicht-kodierende Lösung, die tatsächlich für mich funktionierte, und ich wollte keinen Code hinzufügen, um das Problem eines Winforms-Designers zu lösen.
Tags und Links .net c# winforms visual-studio-2008 datagridview