Une exception non gérée du type 'System.NullReferenceException' que l'on trouve en cliquant sur TreeNode
Je reçois ce message d'erreur à chaque fois qu'un treenode est cliqué sur:
Une exception non gérée du type 'System.NullReferenceException'
s'est produite dans Picture-Resize.exe informations Supplémentaires: Objet
de référence non définie à une instance d'un objet.
Mon code est comme suit:
public Form1()
{
InitializeComponent();
this.treeView1.NodeMouseClick += new TreeNodeMouseClickEventHandler (this.treeView1_NodeMouseClick);
PopulateTreeView();
}
private void PopulateTreeView()
{
TreeNode rootNode;
DirectoryInfo info = new DirectoryInfo(@"c:\\");
if (info.Exists)
{
rootNode = new TreeNode(info.Name);
rootNode.Tag = info;
GetDirectories(info.GetDirectories(), rootNode);
treeView1.Nodes.Add(rootNode);
}
}
private void GetDirectories(DirectoryInfo[] subDirs, TreeNode nodeToAddTo)
{
TreeNode aNode;
DirectoryInfo[] subSubDirs;
foreach (DirectoryInfo subDir in subDirs)
{
aNode = new TreeNode(subDir.Name, 0, 0);
aNode.Tag = subDir;
aNode.ImageKey = "folder";
try
{
/* subSubDirs = subDir.GetDirectories();
if (subSubDirs.Length != 0)
{
GetDirectories2(subSubDirs, aNode);
}*/
}
catch (System.UnauthorizedAccessException)
{
subSubDirs = new DirectoryInfo[0];
}
nodeToAddTo.Nodes.Add(aNode);
}
}
void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
//if (treeView1.SelectedNode.Nodes.Count > 0) { MessageBox.Show("Child node exists"); } else { MessageBox.Show("Child Node does not exist"); }
try
{
TreeNode newSelected = e.Node;
// treeView1.SelectedNode.Nodes.Add("test");
listView1.Items.Clear();
DirectoryInfo nodeDirInfo = (DirectoryInfo)newSelected.Tag;
ListViewItem.ListViewSubItem[] subItems;
ListViewItem item = null;
foreach (DirectoryInfo dir in nodeDirInfo.GetDirectories())
{
item = new ListViewItem(dir.Name, 0);
subItems = new ListViewItem.ListViewSubItem[]
{new ListViewItem.ListViewSubItem(item, "Directory"),
new ListViewItem.ListViewSubItem(item,
dir.LastAccessTime.ToShortDateString())};
item.SubItems.AddRange(subItems);
listView1.Items.Add(item);
}
foreach (FileInfo file in nodeDirInfo.GetFiles())
{
item = new ListViewItem(file.Name, 1);
subItems = new ListViewItem.ListViewSubItem[]
{ new ListViewItem.ListViewSubItem(item, "File"),
new ListViewItem.ListViewSubItem(item,
file.LastAccessTime.ToShortDateString())};
item.SubItems.AddRange(subItems);
listView1.Items.Add(item);
}
listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
}
catch (Exception ex)
{
if (ex is System.NullReferenceException || ex is System.UnauthorizedAccessException)
{
}
}
}
Ce qui se passe est le gestionnaire d'exception attrape, mais parce qu'une exception a été levée il oblige l'utilisateur à cliquer deux fois pour le gestionnaire de clic à prendre effet.
Pourquoi j'obtiens cette erreur, et comment puis-je l'éviter?
À la ligne de code qui est l'exception levée
ce type d'exception est très facile à déboguer et résoudre, vous devriez remarquer (mettez en surbrillance) la ligne de code où l'exception est levée. Sans connaître le code de la ligne je ne pense pas que quelqu'un ici peut (n'hésitez pas à) la piste vers le bas tout du début à la fin de votre NodeMouseClick gestionnaire d'événement pour vous aider.
J'ai copié le code, il fonctionne sans exceptions!
L'exception est lancée à la ligne que j'ai commenté: (désolé pour la confusion)
ce type d'exception est très facile à déboguer et résoudre, vous devriez remarquer (mettez en surbrillance) la ligne de code où l'exception est levée. Sans connaître le code de la ligne je ne pense pas que quelqu'un ici peut (n'hésitez pas à) la piste vers le bas tout du début à la fin de votre NodeMouseClick gestionnaire d'événement pour vous aider.
J'ai copié le code, il fonctionne sans exceptions!
L'exception est lancée à la ligne que j'ai commenté: (désolé pour la confusion)
//if (treeView1.SelectedNode.Nodes.Count > 0) { MessageBox.Show("Child node exists"); } else { MessageBox.Show("Child Node does not exist"); }
OriginalL'auteur TK421 | 2013-06-22
Vous devez vous connecter pour publier un commentaire.
Qui est en fait faux. Un nœud n'est pas sélectionné jusqu'à ce que après la NodeMouseClick événement se déclenche. Si ce code est susceptible de bombe avec NRE si il n'y avait pas de sélection mais. Et nécessite en cliquant deux fois depuis le premier clic donne précédemment nœud sélectionné.
Vous devriez plutôt utiliser la
e.Node
propriété, il vous donne le nœud qui a été cliqué. L'intention de ce code est un peu floues, de fortes chances que vous devriez être en utilisant laAfterSelect
événement à la place. De sorte qu'il fonctionne encore lorsque l'utilisateur utilise le clavier pour sélectionner des nœuds.OriginalL'auteur Hans Passant
Vous avez besoin de déboguer votre code.
Je suppose que vous êtes à l'aide de Visual Studio, si oui, alors fais ceci:
Note le Common Language Runtime Exceptions case est cochée.
Après avoir cliqué sur OK, maintenant, quand vous déboguer votre code à tout moment une exception est levée par le code ou la .NET Framework, le débogueur s'arrête sur la ligne qui a déclenché l'exception. Cela rend la recherche où quelque chose est "casser" beaucoup plus facile.
OriginalL'auteur Karl Anderson