Wie verhindern Sie, dass der Visual Studio-Designer Spalten in einem DataGridView automatisch generiert?

8

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:

  • Das Steuerelement wird "eingefroren"
  • Festlegen des DataGridView instanziierten Objekts protected (vorgeschlagen in einem früheren Post, der sich auf diese Seite )
Brendan 09.02.2009, 21:55
quelle

10 Antworten

5

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).

    
Marc Gravell 09.02.2009, 22:02
quelle
5

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%     
JaredPar 09.02.2009 22:03
quelle
1

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,

%Vor%

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!

    
Brendan 10.02.2009 22:47
quelle
1

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).

    
Dan Neely 02.09.2010 13:47
quelle
1

JaredPars Vorschlag funktionierte für mich:

%Vor%     
ArildF 04.10.2010 12:08
quelle
0

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%     
robby valles 10.02.2009 08:44
quelle
0

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.

    
kjbartel 28.08.2014 00:34
quelle
0

@ 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 ...

%Vor%

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.

    
Stuart Wood 09.08.2015 16:47
quelle
0

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 .

%Vor%

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.

    
Stanley Jointer II 09.05.2016 15:41
quelle
0

Ö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.

    
coalvilledave 30.06.2017 08:27
quelle