【发布时间】:2010-02-18 12:57:13
【问题描述】:
我在我的 C# 2.0 WinForms 应用程序中遇到了一个非常奇怪的问题,我什至不确定它是否值得这样问,因为问题发生在一个奇怪的设置中,我不认为你可以在没有我的情况下重现它来源,但我完全没有想法。
我有一个表单,左边是 TreeView,右边是 ListView。 TreeView 显示来自特定文件夹的所有可用文件和子文件夹(其中包含我的应用程序所需的文档)。如果选择了文件夹,ListView 将显示所选文件夹中的所有文件和子文件夹。在启动时,我从文件夹中填充 TreeView,然后通过代码选择第一个 TreeNode(在我的情况下,它是一个文件夹)。之后 TreeView 的内容如下所示:
-folder
-file1
-file2
选择文件夹会触发TreeView 的AfterSelecedEvent。因为选择了一个文件夹,所以我使用以下方法填充 ListView:
private void fillOverview(FAFolder folder)
{
lv_overview.Items.Clear();
ListViewItem item;
foreach (FAFile file in folder.sortedContent)
{
if (file is FAFolder)
{
item = new ListViewItem(file.Name, "Folder"); //exception got thrown here
}
else
{
item = new ListViewItem(file.Name, file.Name);
}
item.Tag = file;
lv_overview.Items.Add(item);
}
}
正如您所见,没有子文件夹,因此在此设置中不应触及 item = new ListViewItem(file.Name, "Folder"); 行,但时不时会抛出 NullReferenceException。如果我用 try/catch 包装这一行,异常就会被抛出到 catch 块中。我尝试检查所有内容是否为null,但没有空引用。或者,如果我在此行之前添加一个MessageBox,仍然会抛出异常并且不会弹出MessageBox。这使我得出结论,execption stacktrace 错误和/或此异常来自其他 Thread 或类似的东西。
我是一个非常乐观的人,我知道 SO 社区有多么聪明,但我认为没有人能指出问题所在。所以我实际上正在寻找的是提示和建议,我如何找到和调试这种奇怪行为的原因。
编辑:
internal abstract class FAFile
{
internal string Name;
internal readonly FAFolder Parent;
internal FAFile(FAFolder parent)
{
this.Parent = parent;
}
}
internal sealed class FAFolder : FAFile
{
internal readonly IDictionary<string, FAFile> Content = new Dictionary<string, FAFile>();
internal FAFolder(FAFolder parent, string name) : base(parent)
{
this.Name = name;
}
}
internal sealed class FADocument : FAFile
{
public readonly string Path;
public FADocument(FAFolder parent, string path): base(parent)
{
this.Path = path;
this.Name = System.IO.Path.GetFileNameWithoutExtension(path);
}
}
【问题讨论】:
-
如果我们能看到FAFolder和FAFile的代码会容易很多
-
发布堆栈跟踪也很有用
-
您是否检查过 folder.sortedContent 的结果以确保您获得了预期的结果?
-
你能显示排序的内容吗?我认为这是一个 ICompareable 或类似的?