Alle Beiträge von Tician
-
c# InvalidCastException
Huch das artet ja aus hier. Also, ich habe mir Head First C# geholt (bzw holen lassen), extra mit viel veranschaulichung. Das Buch hat auch über 1000 Seiten, ist englisch, aber dafür ausgelegt den Leser am Ball zu halten. Ich wusste allerdings nichts das es hauptsächlich auf Windows 8 ausgelegt ist und da ein neues Programm als "windows app" erstellt wird, während ich nur Windows Forms oder WPF-anwendung zur Auswahl habe... erstmal lesen was der Unterschied ist und welches Projekt dem neuen "windows app" entspricht... mal schauen wie viel "wie schreibe ich ordentlichen Code" darin enthalten ist Ich würde mich vertrauensvoll nochmal an euch wenden wenn ich irgendwo hängen bleibe^^
-
Suche Prüfungen / Lösungen: Der Altthread.
Hallöööchen mit 3 öchen, um mich langsam auf die Zwischenprüfung vorzubereiten (auch wenn sie nicht zählt) suche ich nach den Zwischenprüfungen der letzten Jahre (BaWü?) um ein Gespür für die Fragen und Themen zu bekommen Danke! Bitte per PN, da aus Erfahrung nur Malware rumgesendet wird
-
c# InvalidCastException
Was wäre denn dann etwas "kleineres"? In der Schule haben wir jetzt eine Klasse erstellt in der wir einen Button und einen Timer "verbunden haben", sodass man diese Buttons einfügen kann und die dann im viereck springen sobald man drauf klickt. Dann noch ein "Sitzplatz-Reservierungs-Programm" bei dem 100 Buttons sich gründ/rot färben wenn man drauf klickt. Damit habe ich mal verstanden wie ich eine andere Klasse schreibe und benutze und das ich für ein SpaceInvader keine 1000 Zeilen Code brauche Aber in diesen Beispielen befindet sich der komplette Code auch nur in einer Klasse und die wird nur als Objekt aufgerufen, ich weiß nicht ob sich das groß von dem unterscheidet was ich hier fabriziert habe.
-
c# InvalidCastException
Habe ich verstanden, aber in den Grundlagen ist nie von sowas die Rede gewesen und dann heißt es "such dir ein Projekt, so lernt man am Besten" und ich finde ich habe schon einiges gelernt nur wende ich es falsch bzw nicht programmier-freundlich an? Im Vergleich zur Schule wo wir jetzt zum ersten mal eine neue Datei als Klasse erstellt haben und einen Button machen der im viereck im Fenster umher springt sobald man drauf klickt. Da habe ich verstanden das ich die Werkzeuge mit etwas (in dem Beispiel den Timer) verknüpfen kann und dann im Hauptcode soviele Buttons wie ich will aufrufen kann, aber ich bekomme das nicht auf das übertragen was ich hier mache, vorallem nicht nur nach diesem einen Beispiel. Mal schauen wie bald ich meinen Code dann überarbeiten kann Edit: Huch die Posts sind nach oben gewandert, jetzt sieht das aus als würde ich Selbstgespräche führen >.<
-
c# InvalidCastException
Das ist doch mal eine Ansage, mein Betrieb bestellt mir Head First C# 3rd edition Mein englisch ist ziemlich gut (ich mach auch das freiwillige Englisch-Zertifikat dieses Schuljahr) von daher kein Problem^^ Danke! Mal schauen wie gut ich damit zurecht komme, ich habe mich jetzt voll auf deine Einschätzung und dem verlassen was ich so auf ein paar Blicke gesehen habe
-
c# InvalidCastException
Ich hatte doch extra gesagt es gibt keine direkte Kommunikation zwischen Client und "Server" weswegen ich es auch nicht Server genannt habe. Das Admin-Tool ist dazu da um Dinge auf die Datenbank zu schieben und zu verändern, während der Client die Datenbank abruft und je nach Inhalt reagiert. Die 10 Sekunden lassen sich bei Bedarf ja ändern, es gibt sowieso noch ein paar andere Wünsche an Änderungen an denen ich noch arbeiten muss. Das mit dem Weiterbilden ist schwierig du willst das ich ein Pferd zeichne ohne je eines gesehen zu haben, sprich ich soll meinen Code in etwas umwandeln das ich noch nie gesehen habe und unter dem ich mir gerade nichts vorstellen kann und gar nicht weiß wo ich ansetzen soll. Das nächste ist das ich weder heute noch gestern groß weitergekommen bin, die Client UND die "Server"-Seite standen Code-mäßig auch schon am Montag fest bevor mir hier Tipps gegeben wurden, ich programmiere nicht 100% meiner Arbeitszeit. Produktiv im EInsatz ist nur eines meiner Programme, das jetzige und 2 andere sind in Arbeit. Ich bin Azubi, mir macht programmieren Spaß, es ist nicht geplant irgendwann jemanden einzustellen der programmieren kann geschweige denn das irgendjemand meine winzigen Programme auch nur mit einem Auge anschaut. Es ist schade aber verständlich für mich das du mir da nicht helfen willst, ich bin anfänger, mir fehlt Grundwissen, ich habe niemanden den ich fragen kann, noch NIE einen anderen Code gesehen und über ein Forum ist es massiv zeitaufwendig etwas zu erklären, während man den Wissensstand des anderen nicht kennt, gleichzeitig (das ist meine persönliche Meinung) bist du nicht gut darin etwas Anfänger-freundlich zu erklären, allerdings versuchst du mir in jedem Thread zu helfen, das rechne ich dir wirklich hoch an. Gleichzeitig bin ich aber ein Typ der etwas nur sehr langsam versteht und auch nur dann wenn es quasi kindergerecht und anschaulich erklärt wird. Es gibt andere Leute hier, andere Foren und morgen schmeiße ich mich auch mal auf einen Programmier-Stammtisch, irgendwo hoffe ich hilfe zu finden.
-
c# InvalidCastException
Client (jaja ich weiß der sieht auch grausam aus) namespace Message_Client { public partial class Form1 : Form { //allgemein string hostname; string user; string names; string text; MySqlConnection connection; MySqlCommand sqlcommand; MySqlDataReader reader; //ini-Inhalt string iniText; string iniServer; string iniDatabase; string iniUser; string iniPassword; string iniPort; string iniTable; public Form1() { InitializeComponent(); try { ReadIniFile(); this.FormBorderStyle = FormBorderStyle.None; this.ShowInTaskbar = false; this.Load += new EventHandler(Form1_Load); System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer(); timer.Tick += Timer_Tick; timer.Interval = 10000; timer.Start(); hostname = Environment.MachineName; user = Environment.UserName; Microsoft.Win32.SystemEvents.SessionEnding += SystemEvents_SessionEnding; //SQL Zeug string connectionString = "SERVER="+iniServer+";" + "DATABASE=" + iniDatabase + ";" + "UID=" + iniUser +";" + "PASSWORD=" + iniPassword +";" + "Port=" + iniPort +";"; string command = "SELECT hostname FROM " + iniTable + ";"; connection = new MySqlConnection(connectionString); sqlcommand = new MySqlCommand(command, connection); //open connection and execute command connection.Open(); reader = sqlcommand.ExecuteReader(); while (reader.Read()) { var name = reader["hostname"]; names += " "+name; } reader.Close(); //find own hostname with Regex Regex reg1 = new Regex(hostname); Match match1 = reg1.Match(names); //create hostname in DB if not found if (!match1.Success) { sqlcommand.CommandText = "insert into " + iniTable +" (hostname, message, user, block) values ('" + hostname+"', '0','"+user+"', '0');"; sqlcommand.ExecuteNonQuery(); } sqlcommand.CommandText = "update " + iniTable + " set status=1 where hostname='" + hostname + "';"; sqlcommand.ExecuteNonQuery(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void Timer_Tick(object sender, EventArgs e) { try { sqlcommand.CommandText = "select message from " + iniTable + " where hostname='" + hostname + "';"; reader = sqlcommand.ExecuteReader(); while (reader.Read()) { var vartext = reader["message"]; text = Convert.ToString(vartext); } reader.Close(); if (text != "0") { MessageBox.Show(text, "IT Abteilung sagt:", MessageBoxButtons.OK, MessageBoxIcon.Warning,MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly); sqlcommand.CommandText = "update " + iniTable + " set message='0' where hostname='" + hostname + "';"; sqlcommand.ExecuteNonQuery(); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void Form1_Load(object sender, EventArgs e) { this.Size = new Size(0, 0); } public void ReadIniFile() { try { //ini lesen iniText = File.ReadAllText("settings.ini"); //Werte auslesen Regex regServer = new Regex("(?<=Server\\=).+"); Regex regDatabase = new Regex("(?<=Database\\=).+"); Regex regUID = new Regex("(?<=UID\\=).+"); Regex regPassword = new Regex("(?<=Password\\=).+"); Regex regPort = new Regex("(?<=Port\\=).+"); Regex regMainTable = new Regex("(?<=MainTable\\=).+"); Match matchServer = regServer.Match(iniText); Match matchDatabase = regDatabase.Match(iniText); Match matchUID = regUID.Match(iniText); Match matchPassword = regPassword.Match(iniText); Match matchPort = regPort.Match(iniText); Match matchMainTable = regMainTable.Match(iniText); iniServer = Convert.ToString(matchServer); iniDatabase = Convert.ToString(matchDatabase); iniUser = Convert.ToString(matchUID); iniPassword = Convert.ToString(matchPassword); iniPort = Convert.ToString(matchPort); iniTable = Convert.ToString(matchMainTable); } catch { MessageBox.Show("Initialisierung der ini-Datei fehlgeschlagen"); } } //when program is closed private void Form1_FormClosing(object sender, FormClosingEventArgs e) { sqlcommand.CommandText = "update " + iniTable + " set status=0 where hostname='" + hostname+"';"; sqlcommand.ExecuteNonQuery(); connection.Close(); } private void SystemEvents_SessionEnding(object sender, Microsoft.Win32.SessionEndingEventArgs e) { sqlcommand.CommandText = "update " + iniTable + " set status=0 where hostname='" + hostname + "';"; sqlcommand.ExecuteNonQuery(); connection.Close(); } } public partial class NativeMethods { [System.Runtime.InteropServices.DllImportAttribute("user32.dll", EntryPoint="BlockInput")] [return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)] public static extern bool BlockInput([System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)] bool fBlockIt); public static void BlockInput(TimeSpan span) { try { NativeMethods.BlockInput(true); Thread.Sleep(span); } finally { NativeMethods.BlockInput(false); } } } } Achja das FormClosing und SessionEnding funktionieren auch nicht, da muss ich mir noch was überlegen wie ich das testen kann, schätzungsweise mal als Admin ausführen.
-
c# InvalidCastException
Ist das wichtig? Ich arbeite in einem Logistik-Betrieb, jeden Tag muss jemand von unserer Abteilung (IT und Projektmanagement) drüben in unserem Logistik-Gebäude anrufen und dort muss dann jemand rumrennen und an 10 Plätzen bescheid geben das nicht mehr gearbeitet werden darf weil wir dann einen Abschluss von wasauchimmer (UPS, DHL, irgendwie sowas ich hab den Überblick noch nicht ganz) machen. Ich mache also eine Software die aus Client-Software und "Admin"-Software besteht (ich habe es nicht Server genannt weil ich keine Ahnung von Netzwerkprogrammierung habe und alles über eine Datenbank schleife). Im Admin-Programm (das was ihr jetzt gesehen habt) wird in einer DataGrid die DB-Tabelle gelistet. Mit Haken kann man anwählen welche Clients man auswählen möchte um einen Text in die Datenbank zu setzen - und einen 2. Haken um einen bool-wert in die Datenbank zu setzen der das blockieren der Tastatur und Maus für eine gewissen Zeit ankündigt. Das Client-Programm hat ein unsichtbares Fenster, beim ersten Ausführen schreibt sich der Computer mit PC-Name und Benutzername in die Datenbank. Anschließend wird im 10-sekunden takt die Datenbank überprüft, wenn dann ein Text drin steht wird dieser als Vordergrund-MessageBox angezeigt und bei Bestätigung wieder auf "nix" gesetzt. Das funktioniert alles, aber der Block-Befehl ist eben noch gewünscht und fehlt. Das ganze läuft Domänen-intern, kein Virus und auch sonst kein Unsinn falls du das gedacht hast. Klar, es würde bestimmt etwas im internet geben und unsere interne Fernwartungssoftware hat auch einen Button um Tastatur und Maus zu blockieren, aber eben nur an einem PC und ich programmiere gerne und dann würde der Lerneffekt ausfallen
-
c# InvalidCastException
Oke, das muss ich irgendwann mal machen, dann kommt auch schon das nächste Thema: Wenn ich separate Klassen und Methoden habe wie rufe ich das auf? Im Prinzip weiß ich wie ich eine Methode einer anderen Klasse aufrufe und auch wie ich Parameter mit übergebe, aber jetzt sitze ich vor dem hier: namespace BlockTest { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //??? NativeMethods.BlockInput(true) ??? } } public partial class NativeMethods { [System.Runtime.InteropServices.DllImportAttribute("user32.dll", EntryPoint = "BlockInput")] [return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)] public static extern bool BlockInput([System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)] bool fBlockIt); public static void BlockInput(TimeSpan span) { try { NativeMethods.BlockInput(true); Thread.Sleep(span); } finally { NativeMethods.BlockInput(false); } } } } Das soll später noch mit in das andere Programm rein und einen Benutzer daran hinder Eingaben zu machen während wir am System arbeiten, aber ich weiß nicht wie ich das (jetzt zum testen mit dem Button) benutzen kann. Ich habe BlockInput() mit einem bool-Wert und hoffe das so aufrufen zu können aber wo kann ich dann die Zeitspanne festlegen?
-
c# InvalidCastException
Ich habe meinen Fehler gefunden, der durch die Feste größe des Fensters nicht aufgefallen ist. Jedesmal wenn ich Button1 drücke setzt er eine Spalte mit CheckBoxen rechts ran anstatt zu "aktualisieren" wie ich es eigentlich wollte. dataGridView1.Columns.Clear(); Im Gegensatz zu den 100 Vorschlägen im internet Rows.Clear() zu benutzen (funktioniert null komma null) funktioniert es jetzt mit dem kleinen Zusatz. Das sagt mir leider auch wenig, noch nie gemacht, noch nie mit zu tun gehabt. Außer stumpfes Code kopieren weiß ich absolut nicht was gemeint ist. Ich weiß´nicht wie ich ein Stück Code in einem späteren Projekt verwenden kann ohne es even wie gehabt stumpf zu kopieren (falls das damit gemeint ist).
-
c# InvalidCastException
Ihr habt glaube ich beide etwas missverstanden. Die Datenbank die ausgelesen wird geht nur bis Cell[4], während Cell[5] die Reihe ist die ich manuell mit CheckBoxen eingefügt habe. Das DataGrid ist NICHT mit der Datenbank verknüpft, es ließt sie nur aus und setzt eine checkBox-Spalte mit dran die nichts mit der Datenbank zu tun hat und die ich nur benutze um Reihen auszuwählen in denen ich etwas verändern möchte. //add CheckBox Column DataGridViewCheckBoxColumn chk = new DataGridViewCheckBoxColumn(); dataGridView1.Columns.Add(chk); chk.HeaderText = "Choose"; chk.Name = "chk"; @Whiz-zarD Ich bin kein Programmierer, ich habe (außer in der Schule) nie einen richtigen Code zu einem Programm gesehen und hier im Betrieb bin ich auch die einzige die mehr als nur batch-skripte schreibt. Die Programme zur Optimierung von Prozessen schreibe ich alle weil ich gerne programmiere, deswegen bin ich auch für Vorschläge offen, deswegen Danke für deine Tipps! Alles was ich mehr als 1 mal brauch packe ich normalerweise auch in eine Methode, aber meine Programme sind alle so klein das es für mich einfacher ist das von oben nach unten zu lesen. Keine Ahnung was damit gemeint ist, sorry. Ich versuche mich mal an arlegermi's Vorschlag zur Problemlösung
-
c# InvalidCastException
Moin moin ich wieder^^ Ich habe ein Programm das Daten in eine Datenbank schreibt, aber sobald ich die Tabelle in der ich die Datenbank veranschauliche erneuer funktioniert es nicht mehr und ich bekomme einige Exceptions. Code: using System.Windows.Forms; using System.IO; using System.Text.RegularExpressions; using MySql.Data.MySqlClient; using System.Data; using System; namespace Message_Admin { public partial class Form1 : Form { //allgemein MySqlConnection connection; MySqlDataAdapter adapter; string command = ""; MySqlCommand sqlcommand; //ini-Inhalt string iniText; string iniServer; string iniDatabase; string iniUser; string iniPassword; string iniPort; string iniTable; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { try { ReadIniFile(); //SQL Zeug string connectionString = "SERVER=" + iniServer + ";" + "DATABASE=" + iniDatabase + ";" + "UID=" + iniUser + ";" + "PASSWORD=" + iniPassword + ";" + "Port=" + iniPort + ";"; string command = "SELECT * FROM " + iniTable + ";"; connection = new MySqlConnection(connectionString); connection.Open(); adapter = new MySqlDataAdapter(command, connection); DataSet ds = new DataSet(); adapter.Fill(ds); dataGridView1.DataSource = ds.Tables[0]; //add CheckBox Column DataGridViewCheckBoxColumn chk = new DataGridViewCheckBoxColumn(); dataGridView1.Columns.Add(chk); chk.HeaderText = "Choose"; chk.Name = "chk"; } catch (Exception ex) { MessageBox.Show(ex.Message); } } public void ReadIniFile() { try { //ini lesen iniText = File.ReadAllText("settings.ini"); //Werte auslesen Regex regServer = new Regex("(?<=Server\\=).+"); Regex regDatabase = new Regex("(?<=Database\\=).+"); Regex regUID = new Regex("(?<=UID\\=).+"); Regex regPassword = new Regex("(?<=Password\\=).+"); Regex regPort = new Regex("(?<=Port\\=).+"); Regex regMainTable = new Regex("(?<=MainTable\\=).+"); Match matchServer = regServer.Match(iniText); Match matchDatabase = regDatabase.Match(iniText); Match matchUID = regUID.Match(iniText); Match matchPassword = regPassword.Match(iniText); Match matchPort = regPort.Match(iniText); Match matchMainTable = regMainTable.Match(iniText); iniServer = Convert.ToString(matchServer); iniDatabase = Convert.ToString(matchDatabase); iniUser = Convert.ToString(matchUID); iniPassword = Convert.ToString(matchPassword); iniPort = Convert.ToString(matchPort); iniTable = Convert.ToString(matchMainTable); } catch { MessageBox.Show("Initialisierung der ini-Datei fehlgeschlagen"); } } private void button2_Click(object sender, EventArgs e) { sqlcommand = new MySqlCommand(command, connection); string textbox = richTextBox1.Text; foreach (DataGridViewRow row in dataGridView1.Rows) { try { if (Convert.ToBoolean(row.Cells[5].Value) == true) { sqlcommand.CommandText = "update " + iniTable + " set message = '" + textbox + "' where id = " + row.Cells[0].Value + ";"; sqlcommand.ExecuteNonQuery(); } else if (row.Cells[5].Value == null) { } } catch (Exception ex) { MessageBox.Show(ex.Message); } } richTextBox1.Clear(); } } } Kurz erklärt: Das Programm ließt ein paar Daten aus einer ini-Datei um sich zur mysql-db zu verbinden. Mit Button 1 wird die Tabelle der Datenbank in das DataGridView eingelesen und ich habe auch noch eine weitere Reihe (row[5]) hinzugefügt die check-Boxen enthält. Soweit funktioniert es auch ohne Probleme. Wenn ich jetzt aber Button2 ausgeführt habe, dann Button1 klicke um das DataGrid zu aktualisieren und erneut Button2 ausführe bekomme ich eine Exception hier: if (Convert.ToBoolean(row.Cells[5].Value) == true) System.InvalidCastException "Ein Objekt kann nicht von DBnull in andere Typen umgewandelt werden" Dann folgen noch einige andere SQL-Exceptions die wohl einfach nur daraus resultieren. Ich weiß nicht auf welche Variable ich achten muss oder wie man die Checkboxen die gecheckt sind noch afragen könnte außer es in boolean umzuwandeln (das hatte ich auf Stack Overflow gefunden) Kann das jemand nachvollziehen oder mir einen Hinweis geben was ich da falsch mache?
-
Einstieg ins 2. Lehrjahr
Jupp das IT-Handbuch von Westermann hat mir mein AUsbilder vom Betrieb aus besorgt, ansonsten hab ich alles nur selbst in kurzform in Word-Dateien aufgeschrieben und viele verschiedene Quellen im Internet gesucht. Die Dateien sind aber stark unvollständig weil vieles auch noch handschriftlich auf Papier existiert^^
-
Einstieg ins 2. Lehrjahr
Also was wir gemacht haben in BaWü: IT: Grundlagen der Hardware (aus welchen Teilen besteht es, wofür sind die zuständig), Grundbefehle Linux, Umrechnung dezimale- binäre und Hexadezimale Zahlen. Cisco IT Essentials. Programmieren: Grundlagen (Struktogramme, Datentypen, Klassen und Methoden erstellen, Grundbegriffe lernen) BWL: Projektmanagement, Netzplan, Prozessablaufdiagramm (da war mehr, aber die sind Prüfungsrelevant) WICOMM: Inhalt des Ausbildungsvertrages, Rechte von Pflichten von AUsbilder und Azubi, JuSchG, Einflüsse auf die Arbeitsleistung, Technischer Wandel, Technischer Arbeitsschutz, Sozialer Artbeitsschutz, Sozialversicherung/Privatversicherung, Rechtsfähigkeit, Geschäftsfähigkeit, Entstehung Rechtsgeschäfte D und GGK sind Allgemeinkunde, bei uns gibt es in deutsch 6 Themen die in der Prüfung drankommen können, GGK ist Arbeitslosigkeit, Klimawandel, Armut,... Und Gott sei Dank haben wir keine anderen Fächer wie Sport oder Religion.. igittigitt Ich übernehme keine Haftung auf Vollständigkeit und ob du das auch so brauchst.
-
Was in einer VM mal ausprobieren ?
Du meine Güte wenn ich das lese krieg ich Kopfschmerzen, der Azubi ist doch erst seit 2 Monaten tätig dann erklärt ihm doch in einfachen Worten was er machen muss um sich abzuschotten. @Nico M. Was du brauchst ist ein Programm um die virtuelle Maschine zu erstellen, das wirst du wohl wissen, ich z.B. benutze Virtual Box von Oracle. Aber egal was du benutzt, es muss in den Netzwerkeinstellungen für deine virtuelle Maschine (mindestens) 2 EInstellungen geben (hoffe ich): Netzwerkbrücke und NAT NAT würde die IP deines Rechners auf die deiner virtuellen Maschine übertragen, damit wärst du quasi im Firmennetz, genau das willst du nicht. Du brauchst also die Einstellung Netzwerkbrücke, damit kannst du deinerm Server eine ganz eigene IP geben. Wenn du komplett in Richtung Netzwerk gehen möchtest dann lade dir doch den Cisco Packet Tracer runter und dazu noch Tutorial-Aufgaben um es kennen zu lernen, damit kannst du dir Netzwerke virtuell erstellen. Einmal verstanden macht es doch recht Spaß da zu experimentieren
-
C# ObjectDisposedException
Das wäre jetzt natürlich die Schönste (und dämlichste), am einfachsten zu behebende Variante, aber nein hatte ich nicht^^ Ich hab den ganzen PC mal neu gestartet und jetzt scheint es zu funktionieren Edit: Oder auch nicht, jetzt müsste ich wissen welche Datei gemeint ist in der Fehlermeldung weil das steht nirgendwo.
-
C# ObjectDisposedException
Gibt es eine Möglichkeit herauszufinden warum ich jedes mal wenn ich das Programm kompilieren möchte die Meldung bekomme das der Prozess nicht abgeschlossen werden kann weil der Prozess nicht auf eine Datei zugreifen kann weil ein anderer Prozess darauf zugreift? Nachdem die Meldung einmal weg geklickt wurde kompiliert das Programm einmal und beim nächsten mal kommt wieder die Meldung. Hat das nicht auch mit dem GC zu tun? Müsste wenn ich das im Taskmanager richtig sehe ein "Programmname.vshost.exe *32" sein das da hängen bleibt. Edit: Die Datei (der Prozess) ist es nicht, die Datei ist auch da wenn ich nur VS starte, muss also was anderes sein
-
C# StackOverflowException
Kann ich nochmal etwas zum Verständnis fragen? Ich dachte immer wenn ich ein Objekt (?) anlege wie zum Beispiel hier Settings form2 = new Settings(); Was passiert dann genau? Ich dachte das ist wie wenn ich eine Variable anlege, quasi eine leere Hülle. Wenn ich also von der Form ein Objekt erstelle dann wird was genau gemacht? Alle Objekte und Variablen angelegt/eingelesen hier zwischen den Klammern stehen? public partial class Settings : Form { }
- C# ObjectDisposedException
-
C# ObjectDisposedException
Im Anhang and das Problem: funktioniert mein Programm und lässt sich kompilieren, aber der GC macht mir Striche durch die Rechnung (ich benutze kein Dospose und auch kein Multithreading). Wie gehabt (ich wiederhole es kurz) habe ich 2 Klassen (Forms), wobei Form1 eine Menüleiste hat die Form2 (genannt Settings) aufruft. Das funktioniert einmal - aber sobald jemand Settings schließt und erneut aufruft wird die Exception an diesem Punkt geworfen: public partial class Form1 : Form { Settings form2 = new Settings(); public Form1() { InitializeComponent(); try { ReadIniFile(); //create Event for Settings-Close form2.FormClosed += Form2_FormClosed; } catch { MessageBox.Show("Initialisierung der ini-Datei fehlgeschlagen"); } } private void settingsToolStripMenuItem1_Click(object sender, EventArgs e) { form2.iniText = iniText; form2.Show(); //hier Exception } Weiß jemand wie ich das verhindern kann und trotzdem sicher sein kann das beim Beenden des kompletten Programs auch wirklich nichts mehr den RAM belegt? Ich weiß das eine Lösung wäre jedesmal eine neue Instanz zu erstellen, aber dann sind die labels (meine ich zumindest) leer die ich zu Beginn des Programs an Settings übergebe und auch mein Form-Closed Event würde nicht mehr funktionieren. Ideen wie ich dem Programm sagen kann das Form2 nicht weg geworfen werden soll wenn ich es schließe?
- C# StackOverflowException
- C# StackOverflowException
-
C# StackOverflowException
@Whiz-zarD Deine 2. Möglichkeit fand ich bis jetzt am Besten, ich hab versucht sie etwas umzuändern und bin soweit das es gerade so aussieht: Settings: public partial class Settings : Form { //string iniText; public Settings() { InitializeComponent(); //Form1 form1 = new Form1(); //iniText = form1.GetIniText(); } //get ini when being called public string iniText { get; } //Method for Form1 public void WriteIniToLabels(string text1, string text2, string text3) { label1.Text = text1; label2.Text = text2; label3.Text = text3; } Form1: public partial class Form1 : Form { //string iniText; string iniPathToPDF; string iniPathToCSV; string iniPathToPCL; string iniPrintPDF; string iniPrinter; string iniPrintserver; string iniText; Settings form2 = new Settings(); public Form1() { InitializeComponent(); try { ReadIniFile(); //create Event for Settings-Close form2.FormClosed += Form2_FormClosed; } } private void Form2_FormClosed(object sender, FormClosedEventArgs e) { ReadIniFile(); } Ich habe denke ich verstanden wie ich meine notwendige Variable iniFile von Form1 and Settings übergebe, aber ich wie schiebe ich sie wieder zurück sobald "Settings" geschlossen wird? Was ich jetzt gemacht habe ist quasi die Hälfte übernommen, allerdings sagt mein Programm das Settings.iniText schreibgeschützt ist? "Für die Eigenschaft oder den Indexer "Settings.iniText" ist eine Zuweisung nicht möglich. Sie sind schreibgeschützt."
- C# StackOverflowException
-
C# StackOverflowException
Das ist etwas komplizierter, ich versuche mal meinen Gedankengang und etwas mehr Code dazu zu veröffentlichen: Wenn das Programm gestartet wird läd Form1 Einstellungen aus einer ini-Datei, speichert diese in Variablen und schreibt diese in labels von Form2 (Settings-Fenster) mit der WriteIniToLabels() Methode. Wenn jetzt aber Form2 über das Menü aufgerufen wird gibt es dort Möglichkeiten die EInstellungen zu ändern. Wenn Form2 geschlossen wird muss Form1 die Einstellungen neu auslesen. Form1 relevante Ausschnitte: public partial class Form1 : Form { //string iniText; string iniPathToPDF; string iniPathToCSV; string iniPathToPCL; string iniPrintPDF; string iniPrinter; string iniPrintserver; string iniText; Settings form2 = new Settings(); public Form1() { InitializeComponent(); try { ReadIniFile(); //create Event for Seetings-Close form2.FormClosed += Form2_FormClosed; } catch { MessageBox.Show("Initialisierung der ini-Datei fehlgeschlagen"); } } private void Form2_FormClosed(object sender, FormClosedEventArgs e) { ReadIniFile(); } public void ReadIniFile() { //ini-Datei lesen iniText = File.ReadAllText("settings.ini"); SetIniText(iniText); //PDF und CSV und PCL Pfad lesen und ausgeben Regex reg1 = new Regex("(?<=PathToPDF\\=).+"); Regex reg2 = new Regex("(?<=PathToCSV\\=).+"); Regex reg4 = new Regex("(?<=PathToPCL\\=).+"); Match pdfPath = reg1.Match(iniText); Match csvPath = reg2.Match(iniText); Match pclPath = reg4.Match(iniText); iniPathToPDF = Convert.ToString(pdfPath); iniPathToCSV = Convert.ToString(csvPath); iniPathToPCL = Convert.ToString(pclPath); //Write ini-Settings to Form2-Labels form2.WriteIniToLabels(iniPathToPDF, iniPathToCSV, iniPathToPCL); //Drucker auslesen Regex reg5 = new Regex("(?<=Printer\\=).+"); Regex reg6 = new Regex("(?<=Printserver\\=).+"); Match printer = reg5.Match(iniText); Match printserver = reg6.Match(iniText); iniPrinter = Convert.ToString(printer); iniPrintserver = Convert.ToString(printserver); //Checkbox-status lesen und aktualisieren Regex reg3 = new Regex("(?<=PrintPDF\\=).+"); Match pdfCheck = reg3.Match(iniText); iniPrintPDF = Convert.ToString(pdfCheck); if (iniPrintPDF == "0") { checkBox1.Checked = false; } else { checkBox1.Checked = true; } } string newIniText; public void SetIniText(string iniText) { newIniText = iniText; } //To get ini from Settings public string GetIniText() { return newIniText; } Form2 relevante Ausschnitte: public partial class Settings : Form { string iniText; public Settings() { InitializeComponent(); Form1 form1 = new Form1(); iniText = form1.GetIniText(); } //Method for Form1 public void WriteIniToLabels(string text1, string text2, string text3) { label1.Text = text1; label2.Text = text2; label3.Text = text3; } Das ist alles nur Idee und zusammengeschrieben wie es mir in den Sinn kam, ich glaube ein paar Dinge brauch ich gar nicht mehr also sucht da nicht unnötig nach Fehlern die finde ich selbst sobald ich es kompilieren kann (hoffe ich^^). Erstmal muss der StackOverflow raus und ich weiß nicht wie ich es anders machen kann, dazu fehlt mir die Erfahrung.