2013-04-22 64 views
0

我的DataTable對象似乎爲空,但我不明白爲什麼。我試圖向它添加三個變量,但它仍然表示它爲空。這裏是我的代碼:似乎無法解決對象在C#中的空情況(對象引用未設置爲對象的實例。)

DataTable dt; 

    DataSet ds = new DataSet(); 

    private void InitDataTable() 
    { 

     if (!File.Exists("gjesteInfo.xml")) 
     { 
      dt = new DataTable("Gjester"); 

      ds.ReadXml("gjesteInfo.xml"); 
      ds.Tables.Add(dt); 

      DataColumn dc1 = new DataColumn("Fullt navn"); 
      DataColumn dc2 = new DataColumn("Start dato"); 
      DataColumn dc3 = new DataColumn("Antall dager"); 

      dt.Columns.Add(dc1); 
      dt.Columns.Add(dc2); 
      dt.Columns.Add(dc3); 

      dt.Rows.Add(gjestenavnInput.Text, datoInnsjekk.Text, antallDager.Text); 
      ds.Merge(dt); 

      ds.WriteXml("gjesteInfo.xml"); 
     } 

     else 
     { 

      dt.Rows.Add(gjestenavnInput.Text, datoInnsjekk.Text, antallDager.Text); 
      ds.Merge(dt); <- This is where I want to add information to the dataTable, and this is where the error shows up. 

      ds.WriteXml("gjesteInfo.xml"); 
     } 



    } 

任何建議如何避免着名的「對象引用未設置爲對象的實例」錯誤?

回答

1

在你的if語句DataTable的其他部分沒有初始化
但主要的問題是,如果該文件不存在,你不能試着去讀一下.....

if(!File.Exists("gjesteInfo.xml")) 
{ 
    // The file doesn't exist, create the table to receive initial data here 
    dt = new DataTable("Gjester"); 
    DataColumn dc1 = new DataColumn("Fullt navn"); 
    DataColumn dc2 = new DataColumn("Start dato"); 
    DataColumn dc3 = new DataColumn("Antall dager"); 
    dt.Columns.Add(dc1); 
    dt.Columns.Add(dc2); 
    dt.Columns.Add(dc3); 
    dt.Rows.Add(gjestenavnInput.Text, datoInnsjekk.Text, antallDager.Text); 
    ds.Tables.Add(dt); 
} 
else 
{ 
    // The file exist, read the data and use the first table in the dataset to add new info 
    ds.ReadXml("gjesteInfo.xml"); 
    dt = ds.Tables[0]; 
    dt.Rows.Add(gjestenavnInput.Text, datoInnsjekk.Text, antallDager.Text); 
} 
ds.Merge(dt); 
ds.WriteXml("gjesteInfo.xml"); 

編輯看到您的評論如下,似乎你的文本框包含了所有輸入的數據。如果是這種情況,那麼xml文件需要從頭

if(File.Exists("gjesteInfo.xml")) 
    File.Delete("gjesteInfo.xml") 

dt = new DataTable("Gjester"); 
DataColumn dc1 = new DataColumn("Fullt navn"); 
DataColumn dc2 = new DataColumn("Start dato"); 
DataColumn dc3 = new DataColumn("Antall dager"); 
dt.Columns.Add(dc1); 
dt.Columns.Add(dc2); 
dt.Columns.Add(dc3); 
dt.Rows.Add(gjestenavnInput.Text, datoInnsjekk.Text, antallDager.Text); 
ds.Tables.Add(dt); 
ds.Merge(dt); 
ds.WriteXml("gjesteInfo.xml"); 
+0

我的整個問題是,我只希望它創建一個新的表,如果文件/表不存在,如果它確實存在,我希望它只是從文本框中添加新的信息。每次對象實例化時都不要創建一個新表。 – Praise 2013-04-22 17:58:18

+0

是的,重新加載頁面,我已經更新了答案 – Steve 2013-04-22 17:59:49

+0

這工作! :)但由於某種原因,現在它再次存儲舊信息。我將嘗試解釋:我有三個文本框,當它們全部填充並單擊按鈕時,信息將轉到XML。因此,如果我存儲:史蒂夫,男,23歲。它轉到XML。但現在,如果我想補充一下:Marius,男,29歲。它存儲史蒂夫,男,23歲和馬呂斯,男,29歲。如果我想補充:超級馬里奧,男,45歲。它存儲史蒂夫,男,23歲,馬呂斯,男,29歲,超級馬里奧,男,45歲。你明白嗎? – Praise 2013-04-22 18:14:57

1

如果您運行改寫爲else部分 - 你永遠創建dt DataTable對象!你永遠只能實例化的if塊內....你需要有dt = new DataTable()呼叫if語句,以便它是有效的,對於兩種情況....

DataTable dt; 
DataSet ds = new DataSet(); 

private void InitDataTable() 
{ 
    dt = new DataTable("Gjester"); <<=== this **BEFORE** the if! 

    if (!File.Exists("gjesteInfo.xml")) 
    { 
     ....... 
    } 
    else 
    { 
     // now, in this case, "dt" has been created, and **NOW** you can operate on it! 
     dt.Rows.Add(gjestenavnInput.Text, datoInnsjekk.Text, antallDager.Text); 
     ds.Merge(dt); 
     ds.WriteXml("gjesteInfo.xml"); 
    } 
+0

我的整個問題是,我只希望它創建一個新的表,如果文件/表不存在,如果它確實存在,我想它只是從文本框中添加新的信息。每次對象實例化時都不要創建一個新表。 – Praise 2013-04-22 17:57:07

+0

@MariusMathisen:好的,但是你必須以某種方式在你的'else'中使用**存在**的東西 - 你沒有使用任何東西,因此'dt'爲空,試圖向它添加行導致該異常 – 2013-04-22 17:58:01

0

它應該是:

else 
    { 
     dt = new DataTable("Gjester"); 
     dt.Rows.Add(gjestenavnInput.Text, datoInnsjekk.Text, antallDager.Text); 
     ds.Merge(dt); 
     ds.WriteXml("gjesteInfo.xml"); 
    } 
相關問題