Laden...

Mögliche Datenverluste weil Variable nicht deklariert oder zugeordnet

Erstellt von tyarr vor 9 Jahren Letzter Beitrag vor 9 Jahren 10.293 Views
T
tyarr Themenstarter:in
26 Beiträge seit 2014
vor 9 Jahren
Mögliche Datenverluste weil Variable nicht deklariert oder zugeordnet

Ich habe ein Task Pane für Outlook erstellt welches 4 customListBox-Elemente (eigene Klasse, erbt von ListBox) beinhaltet. Bevor ich die Klasse erstellt hatte, beinhaltete das Task Pane 4 standard Task Panes die den selben Namen hatten wie die neuen customListBox-Elemente. Als ich die alten ListBoxen entfernen und durch die neuen ersetzen wollte habe ich manuell etwas in DetailsPane.Designer.cs geändert. Nun bekomme ich ab und zu beim Ausführen meines Programms die Fehlermeldung "Um mögliche Datenverluste zu verhindern, müssen vor dem Laden des Designers folgende Fehler behoben werden:" und darunter 4 Einträge zu den CustomListBox-Elementen mit der Meldung: " die variable listBox1" wurde nicht deklariert oder nicht zugeordnet.". Manchmal steht auch die Zeilennummer dabei in der der Fehler auftreten soll, diese beinhaltet je nach ausgewählter Fehlermeldung "this.Controls.Add(this.listBox1);". Der Fehler tritt wie bereits gesagt nicht immer auf und die Zeilennummer steht auch nicht immer dabei (im anderen Fall Zeile 0, Zeichen 0). Kann mir bei dem Problem jemand helfen ?

849 Beiträge seit 2006
vor 9 Jahren

Hallo tyarr,

ersteinmal solltest Du deine Beiträge ein wenig anders Formatieren.. Hin und wieder ein Enter an der richtigen Stelle erhöht die Lesbarkeit enorm.

Als zweites solltest Du die Designer.cs am besten nie anpacken. Wenn das doch mal passiert, und dein Anwendungsfall ist einer der wenigen wo ich das gut heisse, solltest Du den Designer vorher schliessen damit er neu laden kann und sich nichts "zwischenspeichert".
Zur Not das Studio einmal neu starten.

Gruß

T
tyarr Themenstarter:in
26 Beiträge seit 2014
vor 9 Jahren

Hallo unconnected,

okay werde ich.

Ja, das habe ich mittlerweile schon öfters gelesen. Habe auch VS schon oft neu gestartet aber es ändert sich nichts am Fehler. Hast du sonst noch irgendwelche Ideen ?

849 Beiträge seit 2006
vor 9 Jahren

Hallo,

könnte mir höchstens vorstellen das in der .suo Datei noch was Designer spezifisches abgespeichert wird.

Has Du wirklich nur die Klassen ausgetauscht?

T
tyarr Themenstarter:in
26 Beiträge seit 2014
vor 9 Jahren

Hallo,

würde dann aber nicht immer der Fehler auftreten beim Laden?

Ich glaube ja, es ist schon ein paar Tage her.

T
tyarr Themenstarter:in
26 Beiträge seit 2014
vor 9 Jahren

Ich habe gerade herausgefunden, dass ich den Fehler reproduzieren kann, wenn ich die Projektmappe neu erstelle. Wenn ich anschließend den designer schließe und neu öffne, kann ich die Form allerdings wieder sehen.

Gelöschter Account
vor 9 Jahren

Was immer du da in der Designer Datei geändert hast war offensichtlich nicht richtig.
Die Meldung die dir präsentiert wird kommt dadurch weil eine Exception ausgelöst wurde während der VS Designer die Einstellungen serialisiert und verarbeitet hat. (Vereinfacht gesagt während er die InitializeComponent() Methode abgearbeitet hat)

Was auch immer du da an Code in der Designer Datei geändert hast, er löst auf jeden Fall eine Exception aus und das scheinbar genau 4x.

Du siehst die Meldung nur beim ersten öffnen weil der Designer so schlau ist die Designer Form nur einmal zu erstellen, diese erstellte Instanz wird bei einem neuerlichen kompilieren allerdings immer verworfen. Daher siehst siehst du den Fehler nach jedem kompilieren immer nur genau 1x und beim nächsten öffnen/zum Tab wechseln kriegst du halt das was der Designer trotz Fehler daraus machen konnte.

Wenn es noch irgendwie geht dann mach deine Änderungen an der Designer Datei rückgängig und hör auf am Designer Code rumzufummeln. Du kannst im ctor deiner Pane nach dem InitializeComponent() doch die Dinge noch immer noch nach deinen Wünschen regeln. Und wenn du glaubst das dass nicht geht, auf myCSharp.de gerne nachfragen.

(Optional kannst du noch deinen InitializeComponent Code posten aber ohne Garantie. Meterlangen Code zu diagnostizieren ist nicht so unbedingt eine Community Aufgabe)

T
tyarr Themenstarter:in
26 Beiträge seit 2014
vor 9 Jahren

Ich kann die Änderungen leider nicht mehr rückgängig machen. Ich hatte gedacht wenn ich es da direkt ändere geht das schneller..
Hier möglicherweise relevante Teile von InitializeComponent:

private void InitializeComponent()
{
  this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
  this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
  this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
  this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
  this.listBoxTasks = new PluginTest.CustomListBox();
  this.listBoxEvents = new PluginTest.CustomListBox();
  this.listBoxContactComments = new PluginTest.CustomListBox();
  this.listBoxCompanyComments = new PluginTest.CustomListBox();
  this.SuspendLayout();

//
// listBoxTasks
//
  this.listBoxTasks.BorderStyle = System.Windows.Forms.BorderStyle.None;
  this.listBoxTasks.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable;
  this.listBoxTasks.FormattingEnabled = true;
  this.listBoxTasks.ItemHeight = 66;
  this.listBoxTasks.Location = new System.Drawing.Point(18, 223);
  this.listBoxTasks.Name = "listBoxTasks";
  this.listBoxTasks.Size = new System.Drawing.Size(338, 70);
  this.listBoxTasks.TabIndex = 36;
  this.listBoxTasks.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.CustomListBox_DrawItem);
  this.listBoxTasks.SelectedIndexChanged += new System.EventHandler(this.listBoxTasks_SelectedIndexChanged);
// 
// listBoxEvents
// 
  this.listBoxEvents.BorderStyle = System.Windows.Forms.BorderStyle.None;
  this.listBoxEvents.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable;
  this.listBoxEvents.FormattingEnabled = true;
  this.listBoxEvents.ItemHeight = 66;
  this.listBoxEvents.Location = new System.Drawing.Point(18, 320);
  this.listBoxEvents.Name = "listBoxEvents";
  this.listBoxEvents.Size = new System.Drawing.Size(338, 70);
  this.listBoxEvents.TabIndex = 37;
  this.listBoxEvents.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.CustomListBox_DrawItem);
  this.listBoxEvents.SelectedIndexChanged += new System.EventHandler(this.listBoxEvents_SelectedIndexChanged);
// 
// listBoxContactComments
// 
  this.listBoxContactComments.BorderStyle = System.Windows.Forms.BorderStyle.None;
  this.listBoxContactComments.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable;
  this.listBoxContactComments.FormattingEnabled = true;
  this.listBoxContactComments.ItemHeight = 66;
  this.listBoxContactComments.Location = new System.Drawing.Point(18, 415);
  this.listBoxContactComments.Name = "listBoxContactComments";
  this.listBoxContactComments.Size = new System.Drawing.Size(338, 70);
  this.listBoxContactComments.TabIndex = 38;
  this.listBoxContactComments.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.CustomListBox_DrawItem);
   this.listBoxContactComments.SelectedIndexChanged += new System.EventHandler(this.listBoxContactComments_SelectedIndexChanged);
// 
// listBoxCompanyComments
// 
  this.listBoxCompanyComments.BorderStyle = System.Windows.Forms.BorderStyle.None;
  this.listBoxCompanyComments.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable;
  this.listBoxCompanyComments.FormattingEnabled = true;
  this.listBoxCompanyComments.ItemHeight = 66;
  this.listBoxCompanyComments.Location = new System.Drawing.Point(18, 515);
  this.listBoxCompanyComments.Name = "listBoxCompanyComments";
  this.listBoxCompanyComments.Size = new System.Drawing.Size(335, 70);
  this.listBoxCompanyComments.TabIndex = 39;
  this.listBoxCompanyComments.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.CustomListBox_DrawItem);
  this.listBoxCompanyComments.SelectedIndexChanged += new System.EventHandler(this.listBoxCompanyComments_SelectedIndexChanged);
// In den nächsten 4 Zeilen wird mir immer der Fehler angezeigt
  this.Controls.Add(this.listBoxCompanyComments);
  this.Controls.Add(this.listBoxContactComments);
  this.Controls.Add(this.listBoxEvents);
  this.Controls.Add(this.listBoxTasks);
  this.ResumeLayout(false);
  this.PerformLayout();
}

Nachtrag:
Mir ist gerade aufgefallen, dass für alle Komponenten ein

((System.ComponentModel.ISupportInitialize)(this.komponente)).BeginInit(); 

vorhanden ist, ausser für die listBoxen, kann es damit was zu tun haben ?

4.221 Beiträge seit 2005
vor 9 Jahren

Wie sind die Variablen definiert in der Designer-Datei ?

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

T
tyarr Themenstarter:in
26 Beiträge seit 2014
vor 9 Jahren

Nach #endregion (anfang ist #region Vom Komponenten-Designer generierter Code)

private PluginTest.CustomListBox listBoxTasks;
private PluginTest.CustomListBox listBoxEvents;
private PluginTest.CustomListBox listBoxContactComments;
private PluginTest.CustomListBox listBoxCompanyComments;
4.221 Beiträge seit 2005
vor 9 Jahren

Wenn der Designer offen ist und alles angezeigt wird.
Dann zieh einen Button auf das Form.
Speichern
Button entfernen
Speichern
Alle Fenster schliessen
Solution bereinigen
VS schliessen
VS öffnen
Neu kompilieren
VS schliessen

So was hilft bei mir meistens (es erzwingt, dass der DesignerCode von VS neu geschrieben wird)... und die Bereinigung löscht ungültigen Schrott in Obj.

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

T
tyarr Themenstarter:in
26 Beiträge seit 2014
vor 9 Jahren

hat leider nicht geholfen. nach erneutem erstellen erscheint der fehler wieder.

4.221 Beiträge seit 2005
vor 9 Jahren

Lade mal einen PrintScreen rauf

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

T
tyarr Themenstarter:in
26 Beiträge seit 2014
vor 9 Jahren

Im Anhang der screenshot

4.221 Beiträge seit 2005
vor 9 Jahren

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

T
tyarr Themenstarter:in
26 Beiträge seit 2014
vor 9 Jahren

Mach mal das hier:


>

Wie öffne ich denn das .dll Projekt?

T
tyarr Themenstarter:in
26 Beiträge seit 2014
vor 9 Jahren

Habe mal

private PluginTest.CustomListBox listBoxTasks;
private PluginTest.CustomListBox listBoxEvents;
private PluginTest.CustomListBox listBoxContactComments;
private PluginTest.CustomListBox listBoxCompanyComments;

auskommentiert, und debugging gestartet. Da kommt ein anderer Fehler, siehe Anhang.

J
251 Beiträge seit 2012
vor 9 Jahren

Wenn die Zeilen

private PluginTest.CustomListBox listBoxTasks;  
private PluginTest.CustomListBox listBoxEvents;  
private PluginTest.CustomListBox listBoxContactComments;  
private PluginTest.CustomListBox listBoxCompanyComments;    

aus kommentiert sind.

Dann müssen auch alle weitere Zeilen aus kommentiert werden, die sich auf diese Objekte beziehen.
Die Zeilen enthielten die Deklaration der Objekte.

Ich würde dir eher raten das Projekt neu aufzusetzen und diesmal nichts im Designer manuell zu ändern.

T
tyarr Themenstarter:in
26 Beiträge seit 2014
vor 9 Jahren

Habe das Problem gelöst. Bei

private PluginTest.CustomListBox listBoxTasks;
private PluginTest.CustomListBox listBoxEvents;
private PluginTest.CustomListBox listBoxContactComments;
private PluginTest.CustomListBox listBoxCompanyComments;

habe ich den Namespace vor CustomListBox entfernt, jetzt tritt der Fehler nicht mehr auf.

F
10.010 Beiträge seit 2004
vor 9 Jahren

Den wird dir der Designer aber wieder einbauen.

Das bedeutet aber das du etwas unsauber bei deinen namespaces warst.
Es gibt wahrscheinlich auch noch einebn Namespave xyz.PluginTest

T
tyarr Themenstarter:in
26 Beiträge seit 2014
vor 9 Jahren

Den wird dir der Designer aber wieder einbauen.

Das bedeutet aber das du etwas unsauber bei deinen namespaces warst.
Es gibt wahrscheinlich auch noch einebn Namespave xyz.PluginTest

Trotz mehrmaligem kompilieren, neu erstellen und bereinigen hat er nichts wieder eingebaut und den fehler habe ich auch nicht mehr zu gesicht bekommen.

Inwiefern unsauber?
Nein gibt es nicht.

F
10.010 Beiträge seit 2004
vor 9 Jahren

Sobald du irgendwas an der Form im Designer machst, wird er dir alle Controls "neu" in den Code einschreiben.
Und dann wird da wieder der volle Namespace stehen.

Unsauber bedeutet,das man manchmal einen Namespace hat, der schon in einem anderen vorhanden ist ( beliebt das man den default namespace nicht beachtet der in den einstellungen steht).

Gelöschter Account
vor 9 Jahren

( Okay Thema beendet, aber für mich sieht es eher so als hat der ctor deiner PluginTest.CustomListBox eine Exception ausgelöst was er jetzt nicht mehr tut. Oder aber ein abhängiges Assembly wurde tatsächlich nicht gefunden. An die Namespace Story glaube ich jedenfalls auch nicht.

4.221 Beiträge seit 2005
vor 9 Jahren

@Sebastian.Lange

Sehe ich auch so... deshalb auch mein Vorschlag zu Debuggen was im Designer abgeht... aber dem wollte er ja nicht folgen...

Ich klinke mich hier auch aus.

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

T
tyarr Themenstarter:in
26 Beiträge seit 2014
vor 9 Jahren

@Sebastian.Lange

Sehe ich auch so... deshalb auch mein Vorschlag zu Debuggen was im Designer abgeht... aber dem wollte er ja nicht folgen...

Ich klinke mich hier auch aus.

Ich wollte schon, ich wusste nur nicht wie das geht.

709 Beiträge seit 2008
vor 9 Jahren

Ich wollte schon, ich wusste nur nicht wie das geht.

Visual Studio Designer debuggen

T
tyarr Themenstarter:in
26 Beiträge seit 2014
vor 9 Jahren

Uuuuund das Problem ist wieder da. Habe mittlerweile herausgefunden dass es an der Klasse liegt, vermutlich wie Sebastian.Lange gemeint hat am Konstruktor. Ich habe die Klasse von codeproject, vielleicht kann sich jemand das Projekt mal anschauen.

T
tyarr Themenstarter:in
26 Beiträge seit 2014
vor 9 Jahren

Uuuuund das Problem ist wieder da. Habe mittlerweile herausgefunden dass es an der Klasse liegt, vermutlich wie Sebastian.Lange gemeint hat am Konstruktor. Ich habe die Klasse von codeproject, vielleicht kann sich jemand das Projekt mal anschauen.

J
251 Beiträge seit 2012
vor 9 Jahren

Was wurde denn genau an der Klasse festgestellt?
Wie sieht der Konstruktor aus?

Ich weiß nichts, ob es was bringt sich das Projekt anzuschauen, weil es auf den ersten Blick eine relative gute Bewertung hat.
Somit könnte dein Problem evtl. sein, dass du das Wissen, welches dort schlummert, nicht so einsetzt, wie es der Autor beabsichtigt hat.

T
tyarr Themenstarter:in
26 Beiträge seit 2014
vor 9 Jahren

Wenn ich den Konstruktor ohne Argumente benutze

public CustomListBox()
        {
            
            InitializeComponent();
            _imageSize = new Size(80, 60);
            this.ItemHeight = _imageSize.Height + this.Margin.Vertical;
            _fmt = new StringFormat();
            _fmt.Alignment = StringAlignment.Near;
            _fmt.LineAlignment = StringAlignment.Near;
            _titleFont = new Font(this.Font, FontStyle.Bold);
            _detailsFont = new Font(this.Font, FontStyle.Regular);
        }

tritt der Fehler auf, weil ich dafür den standard Konstruktor auskommentieren/entfernen muss.
Wenn ich den standard Konstruktor

public CustomListBox(IContainer container)
        {
            container.Add(this);

            InitializeComponent();
        }

benutze, krieg ich nur den Klassennamen als Item angezeigt.

Gelöschter Account
vor 9 Jahren

Hallo tyarr,

Ich hab leider überhaupt nicht verstanden was du mit

Ich krieg den Klassennamen als Item angezeigt

sagen wolltest und was heisst hier wenn ich den Konstruktor ohne Argumente benutze? Das ist der einzige Konstruktor der in diesem Szenario überhaupt eine Rolle spielt.

So oder so:

public CustomListBox(IContainer container)

(und container.Add(this) wird hier vermutlich 2x ausgeführt weil das in der InitializeComponent Methode auch noch mal so steht, also hier ist eine Exception eh schon mal garantiert)

Das ist nicht der Standard Konstruktor. Der Standard Konstruktor ist ohne Parameter und der Visual Studio Designer generiert auch nur Code um den Konstruktor ohne Parameter aufzurufen.(Ist streng genommen nicht richtig aber Ausflüge in den System.ComponentModel namespace würden zu weit führen) Diesen parameterlosen Konstruktir muss es geben und der sollte öffentlich sein. Alle anderen Konstruktoren kannst du gleich mal entfernen wenn du nicht vor hast irgendwelche CustomListBox Instanzen von Hand zu erstellen.

Im nächsten Schritt baue dir einen try/catch Block in diesen Ctor der im Catch den Fehler mit ner MessageBox anzeigt oder in eine Datei schreibt oder was auch immer.
So kriegst du den Fehler zumindest auch zur Design-Time erstmal mit und mit der Fehlermeldung kann dir dann hier zumindest auch geholfen werden.

Ich habe den Eindruck, das du deswegen in der Designer Datei rumgefummelt hast weil du in deiner CustomListBox einen Konstruktor mit Parametern hast die der Code in der Designer Datei aber einfach nicht aufrufen wollte. Also hast du das geändert damit er den Konstruktor mit Parametern aufruft. Kann das sein?