Что происходит, когда вы пытаетесь получить доступ к TreeView winforms по ключевому слову, а ключевое слово отсутствует? - PullRequest
0 голосов
/ 08 ноября 2010

Я пишу приложение, в котором заполняю TreeView со схемой базы данных. Я делаю это путем перебора каждого имени таблицы и типа в GetSchema. Затем, в зависимости от типа данных и имени, я выбираю родительский узел, в который я хочу добавить новый элемент. Иногда этот элемент не существует в treenode (в зависимости от пользовательских настроек определенные таблицы могут быть добавлены или не добавлены в качестве узлов дерева), что хорошо, в этом случае я хочу либо:

A) Исключение, которое будет выдано, поэтому я ЗНАЮ, что ему не удалось найти узел, как было запрошено. Или B) null, который должен быть возвращен для отказавшего метода доступа.

(сильно модифицированный) фрагмент моего кода:

TreeNode parent = null;
if( tableName.StartsWith("prefix") )
{
    parent = tablesNode.Nodes["Node Name which might not exist"];
}

if (parent == null && IgnorePrefixedTables)
{
    continue;
}
else if (parent == null)
{
    throw Exception();
}
....<More Code For Filling Out that node>...

Проблема в том, что, когда я прохожу этот код (или, скорее, реальный код), когда я достигаю tablesNode.Nodes ["Имя узла, которое может не существовать"] для имени узла, который не существует, я не могу поймать исключение, потому что никто не брошен. Если я вхожу в эту строку кода или пересекаю ее, весь метод возвращает меня на самый высокий уровень (моя форма сразу отображается, а пользовательский интерфейс частично завершен). Что с этим?

[EDIT]

Вот ОЧЕНЬ упрощенная версия моей проблемы:

namespace TestZone
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            treeView1.Nodes.Add("Hello", "Hello");
            var x = treeView1.Nodes["Hello"];
            x.Nodes.Add("World-PL", "Swiat");
            x.Nodes.Add("World-EN", "World");
            var y = treeView1.Nodes["World-EN"];
            MessageBox.Show(y.Text);
            y = treeView1.Nodes["World-SP"];
            MessageBox.Show(y.Text);
            y = treeView1.Nodes["World-PL"];
            MessageBox.Show(y.Text);
        }
    }
}

Код полагается на то, что textBox1 находится в Form1. (P.S. PL - польский). Очевидно, treeView1 также не может найти World-EN, что заставляет меня думать, что я действительно не понимаю, как работает treeView. Первый MessageBox никогда не отображается и точки останова на y = treeView1.Nodes ["World-SP"]; не может сломаться (так как эта строка кода никогда не вызывается).

1 Ответ

2 голосов
/ 08 ноября 2010

Избегайте использования исключений для управления потоком программ.Используйте метод TreeViewCollection.IndexOfKey ().

В 64-разрядной операционной системе возникает странная ошибка, когда возникает исключение в методе OnLoad () формы или событии Load и присоединяется отладчик.Проглатывается без уведомления.Звучит как спичка.Обходной путь - установить целевую платформу на x86.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...