Habe folgendes Problem dafür zeige ich euch mal erst den Code
void frm_FormClosed(object sender, FormClosedEventArgs e)
{
List<string> newDataList = new List<string>();
try
{
Form frm = ((newAdress)sender);
frm.FormClosed -= frm_FormClosed;
newDataList = newDatas();
DataRow workRow = kundendaten.NewRow();
string[] array = newDataList.ToArray(); // Hier Tritt das Problem auf
for (int i = 0; i <= newDataList.Count; i++)
{
workRow[i] = array[i];
}
kundendaten.Rows.Add(workRow);
newDataList.Clear();
}
catch (Exception)
{
MessageBox.Show("Message" + e);
}
}
an der gekennzeichneten Stelle tritt folgender Fehler auf > Fehlermeldung:
Eine Ausnahme (erste Chance) des Typs "System.NullReferenceException" ist in IPChanger.exe aufgetreten.
Zusätzliche Informationen: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
Hallo Kuehter,
ja, weil newDataList = null ist. Darauf ein ToArray() aufrufen und dann knallts 😉
dein
newDatas();
gibt also null zurück.
[FAQ] NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt
[Artikel] Debugger: Wie verwende ich den von Visual Studio?
Wieso machst du dir erst eine Liste, überschreibst sie dann mit was auch immer und rufst dann ein ToArray() drauf auf? Das Erstellen der Liste kannst du dir sparen, lass die Methode newDatas() ein Array zurückgeben und du sparst dir die Aufrufe.
Gruss
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
eine gute Idee 😁
war ich auch schon am überlegen aber dachte mit ein wenig Schreibfaulheit kann man das auch schaffen 😉
falsch gedacht.
Habe es gekürzt kann mal den ganzen Quellcode zeigen vllt kommt da bei euch was rum ich habe immer noch nullexeption.
Form1:
private void button6_Click_1(object sender, EventArgs e)
{
newAdress frm = new newAdress();
frm.FormClosed += frm_FormClosed;
frm.Show();
}
private string[] newDatas()
{
newAdress frm = new newAdress();
return frm.getneueDaten();
}
void frm_FormClosed(object sender, FormClosedEventArgs e)
{
try
{
Form frm = ((newAdress)sender);
frm.FormClosed -= frm_FormClosed;
DataRow workRow = kundendaten.NewRow();
for (int i = 0; i <= newDatas().Length; i++)
{
workRow[i] = newDatas()[i];
}
kundendaten.Rows.Add(workRow);
}
catch (Exception)
{
throw;
}
}
Form 2(newAdress):
private void button1_Click(object sender, EventArgs e)
{
Close();
}
private void newAdress_FormClosed(object sender, FormClosedEventArgs e)
{
string[] array = new string[8];
if (textBox1.Text == "")
MessageBox.Show("Kundenname fehlt.");
else
array[0] = textBox1.Text;
if (textBox2.Text == "")
MessageBox.Show("Adaptername fehlt.");
else
array[1] = textBox2.Text;
if (textBox3.Text == "")
MessageBox.Show("IP-Adresse fehlt.");
else
array[2] = textBox3.Text;
if (textBox7.Visible == false)
{
textBox7.Text = " ";
array[3] = textBox7.Text;
}
else
array[3] = textBox7.Text;
if (textBox4.Text == "")
MessageBox.Show("Subnetzmaske fehlt.");
else
array[4] = textBox4.Text;
if (textBox8.Visible == false)
{
textBox8.Text = " ";
array[5] = textBox8.Text;
}
else
array[5] = textBox8.Text;
if (textBox5.Text == "")
{
textBox5.Text = " ";
array[6] = textBox5.Text;
}
else
array[6] = textBox5.Text;
if (textBox6.Text == "")
{
textBox6.Text = " ";
array[7] = textBox6.Text;
}
else
array[7] = textBox6.Text;
setneueDaten(array);
}
Wahrscheinlich gibt:
frm.getneueDaten();
null zurück.
Bitte benutze den oben verlinkten Debugger!
[Hinweis] Wie poste ich richtig? Punkt 8
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
... und bitte beachte [Tipp] Anfängerfehler == true / == false
**:::
Hallo,
mit diesem Schleifenkopf
for (int i = 0; i <= newDatas().Length; i++)
kracht es übrigens auch noch mit IndexOutOfRangeException, sobald Du das NullReference-Problem gelöst hast...
Warum nicht foreach
?
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Habe das ganze ding jetzt abgespeckt und neu überdacht die der lösungsansatz ist noch mal ganz anders
void frm_ClosedWithArgs(object sender, newAdress.ClosedWithArgsEventArgs e)
{
newAdress frm = ((newAdress)sender);
frm.ClosedWithArgs -= frm_ClosedWithArgs;
DataRow workRow = kundendaten.NewRow();
try
{
for (int i = 0; i < e.ReturnValue.Length; i++)
{
workRow[i] = e.ReturnValue[i].ToString();
}
kundendaten.Rows.Add(workRow);
}
catch (Exception)
{
MessageBox.Show("Die Daten wurden nicht eingetragen");
}
}
Du solltest nicht erwarten, dass wenn ein x beliebiger Fehler auftritt, dass dann gilt "Die Daten wurden nicht eingetragen". Prüfe, ob "e.ReturnValue" bzw. "e.ReturnValue[ i ]" einen Wert enthält. Bei "workRow[ i ] = e.ReturnValue[ i ]" musst Du sicherstellen, dass die Längen beider Arrays identisch sind. Ansonsten erhälst Du ggf. die Fehlermeldung "Die Daten wurden nicht eingetragen".
Falls Du es vermeiden kannst bzw. der Aufwand nicht zu groß ist, solltest Du immer statt "catch (Exception)" einen bestimmten Fehlertyp verwenden wie z.B. "catch (ArgumentException)", da Du mit "catch (Exception)" auch alle Systemfehler abfängst wie z.B. OutOfMemoryException.
OutOfMemoryException, sofern sie aus der aktuell rennenden Anwendung stammt, kann nicht abgefangen werden.
Soviel aber nur als Hinweis.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Etwas, das Du Dir vielleicht noch frühzeitig angewöhnen solltest: verwende sprechende Controlnamen. Wenn Du mal 20 Textboxen auf einer Form hast: weißt Du dann noch auf die Schnelle, dass "textBox2" für den Adapternamen sein soll? Ich würde sie txtAdapter nennen.
Ähnliches bei "private void button6_Click_1"... da würd ich wahnsinnig werden. Bei einem "private void btnCancel_Click" weiß ich schon beim ersten Hingucken, wofür der Code ist... bei "button6" dagegen wird das schwer.
Aber ist vielleicht auch Geschmackssache, ich bin eher der ordnungsliebende Typ :evil: