【问题标题】:Initializing a StringCollection Setting初始化 StringCollection 设置
【发布时间】:2012-11-05 08:43:41
【问题描述】:

我正在编写一个应用程序,我想存储用户选择的文件列表。目前,我的一个设置是一个名为 filesToFetch 的 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 尚未初始化,但我不太确定。我可能是错的,但我认为一个对象在初始化时会获得一个名称,并且由于我的设置都是在设计时获得名称,我假设它们在程序运行时自动初始化,但现在我想我可能错了对这个。是这个问题,还是我遗漏了什么?

这是我的设置的屏幕截图以供参考。

【问题讨论】:

  • 你可以在该行放一个断点,看看null是什么,不是吗?
  • 是的,仅仅命名一个变量是不够的,你还需要在使用之前对其进行初始化:例如IList a = new List();

标签: c# settings stringcollection


【解决方案1】:

如果您想在设置 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 设置。

【讨论】:

  • OP 没有询问如何通过 Visual Studio GUI 添加设置。
  • OP 询问为什么他们得到一个空引用,错误,答案是,因为设置没有初始化。解决该问题的解决方案是在 GUI 中对其进行初始化。如果 OP 这样做了,他们的问题就会得到解决,因此这是一个合理且有用的答案。
  • 这正是我遇到这个问题时所寻找的。​​span>
【解决方案2】:

我可能应该进一步解释一下。假设您要使用字符串列表。你可以声明:

IList<string> a;

此时a = null 并且null 没有Add 方法。如果你初始化:

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

现在 a = 一个空的字符串列表。此时它将有一个 Add 方法用于将字符串添加到列表中。

【讨论】:

  • 好吧,这是有道理的;它可以在没有初始化的情况下声明。
  • @Kevin 是否可以将默认设置设置为空的但已实例化的字符串列表,而不是不声明它?如果你有很多这样的设置,你必须检查很多设置是否为空,然后实例化它们,这将是很多代码。你会认为框架以某种方式涵盖了这些.
【解决方案3】:

我在使用 add 方法时遇到了类似的问题,但使用 index 和 value 参数插入效果很好。

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();
}

【讨论】:

    【解决方案4】:

    虽然问题很棘手,但解决方案很简单。 像你一样创建一个设置。将以下代码复制并粘贴到 Default Value 的位置并继续按照您的方式工作。

    <?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" />
    

    解释Use a string collection setting in C#

    希望这会有所帮助。谢谢。

    【讨论】:

      猜你喜欢
      • 2012-12-15
      • 2015-04-16
      • 2014-02-20
      • 1970-01-01
      • 2016-11-29
      • 2014-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多