2012-11-16 140 views
4

我正在編寫一個應用程序,並且我想存儲用戶選擇的文件列表。目前,我的一個設置是一個名爲filesToFetch的StringCollection,它是User範圍的,包含程序應該讀取的所有文件的路徑。我有一個按鈕,允許用戶將新文件添加到列表中。這是按鈕單擊事件初始化StringCollection設置

private void button1_Click(object sender, EventArgs e) 
{ 
    DialogResult result = openFileDialog1.ShowDialog(); 
    if (result == DialogResult.OK) 
    { 
     Properties.Settings.Default.filesToFetch.Add(openFileDialog1.FileName); 
     Properties.Settings.Default.Save(); 
    } 
} 

當我嘗試一個新的文件添加到StringCollection,我得到

NullReference例外是未處理

對象引用未設置爲一個錯誤的代碼對象的實例。

我認爲這可能是因爲filesToFetch尚未初始化,但我不確定。我可能是錯的,但我認爲一個對象在初始化時會得到一個名稱,並且由於我的設置在設計時都會得到名稱,我假設它們在程序運行時會自動初始化,但現在我認爲我可能是錯的對這個。這是問題,還是我缺少別的東西?

這是我的設置的屏幕截圖供參考。

Properties Settings

+0

你可以把一個斷點上線,看看是什麼'null',不是嗎? –

+0

是的,僅僅命名一個變量還不夠,您還需要在使用之前對其進行初始化:例如IList a =新列表(); – Kevin

回答

2

我也許應該進一步解釋了一下。假設您要使用字符串列表。您可以聲明:

IList<string> a; 

此時a = null並且null沒有Add方法。如果初始化:

IList<string> a = new List<string>(); 

現在a =空的字符串列表。此時將有一個Add方法用於向列表中添加字符串。

+0

好吧,這是有道理的;它可以被聲明而不被初始化。 – Eric

+1

@Kevin是否可以將默認設置設置爲一個空的,但實例化的字符串列表,而不是聲明它?如果你有很多像這樣的設置,你必須檢查很多設置,如果它們是空的,然後實例化它們,這將是很多代碼。你會認爲框架以某種方式覆蓋。 –

9

如果您想在設置GUI中輸入數值,在最右邊會有一個「...」按鈕,它允許您輸入每行分隔的初始字符串值。然後,它轉換到這一點XML這樣:

<?xml version="1.0" encoding="utf-16"?> 
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <string>String1</string> 
    <string>String2</string> 
</ArrayOfString> 

編輯:是的,你需要初始化StringCollection和我上面的回答是使用GUI來做到這一點。認爲它會幫助像我這樣的人找到一種方法來初始化像OP這樣的StringCollection設置。

+1

OP不詢問如何通過Visual Studio GUI添加設置。 – dcarson

+1

OP詢問他們爲什麼得到空引用,錯誤,答案是,因爲該設置未初始化。解決該問題的解決方案是,在GUI中對其進行初始化。如果OP做到了這一點,他們將解決問題,因此這是一個合理而有用的答案。 –

+2

這正是我遇到這個問題時所尋找的。 –

0

我有一個類似的問題,使用add方法,但插入索引和值參數工作正常。

https://msdn.microsoft.com/en-us/library/system.collections.specialized.stringcollection.insert%28v=vs.110%29.aspx

像這樣的東西可能會奏效:

private void button1_Click(object sender, EventArgs e) 
{ 
    DialogResult result = openFileDialog1.ShowDialog(); 
    if (openFileDialog1.ShowDialog(this) != DialogResult.OK) 
     return; 
    int x = 0; 
    foreach (String file in openFileDialog1.FileNames) 
    { 
     Properties.Settings.Default.activeFiles.Insert(x, openFileDialog1.Filename); 
     x++; 
    } 

    Properties.Settings.Default.Save(); 
}