2012-11-16 137 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(); 
}