Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 02.03.2010
Сообщений: 46
1

Работа с делегатами

30.04.2013, 12:17. Показов 1146. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день всем.
Столкнулся с необходимостью использовать делегаты, и, похоже, что-то не так делаю. Помогите разобраться.
Для начала код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
public delegate TreeNode TreeViewSelectedNodeDel(TreeView tv);
private TreeNode GetSelectedNode(TreeView tv)
{
    return tv.SelectedNode;
}
 
public delegate void ColoringNodeDelegate(TreeNode tn);
private void ColoringNode(TreeNode tn)
{
    tn.ForeColor = Color.FromName("Blue");
}
 
public delegate void AddReportToExportDelegate(BackgroundWorker worker, DoWorkEventArgs e);
public void AddReportToExport(BackgroundWorker worker, DoWorkEventArgs e)
{
    TreeView tv = (TreeView)ReportsContextMenu.SourceControl;
    //Если узел пустой - т.е. его еще не раскрывали,
    //то заполням узел. Копия ReportsTree_BeforeExpand
    TreeNode tn = new TreeNode();
    if (tv.InvokeRequired)
    {
        tn = (TreeNode)Invoke(new TreeViewSelectedNodeDel(GetSelectedNode), new object[] {tv});
    }
    else
    {
        tn = tv.SelectedNode;
    }
    //Чтобы не проверять все входящие под-под-узлы на открытость/закрытость,
    //принудительно открываем всё.
    if (tn.Nodes.Count > 0)
    {
        Cursor curs = Cursor.Current;
        Cursor.Current = Cursors.WaitCursor;
        {
             if (tv.Name == "ReportsTree")
             {
                   NodeOpen(tn, true);
              }
              else if (tv.Name == "tvWellsFiles")
              {
                   wellsPage.NodeOpen(tn, true);
              }
        }
        Cursor.Current = curs;
    }
    TreeNode tnClone = (TreeNode)tn.Clone();
    if (setShow == "Wells" && tv.Name == "ReportsTree" && tn.Parent == null)
    {
        tnClone.Text = "Дело скважины №" + tn.Text + ", " + PlaceTree.SelectedNode.Text;
        tnClone.Name = "skv";
    }
    int x = 0;
    foreach (TreeNode tr in ExportTree.Nodes)
    {
        if (tr.Text == tnClone.Text && tr.Name == tnClone.Name)
        {
            x++;
        }
    }
    if (x == 0)
    {
        ExportTree.Nodes.Insert(ExportTree.Nodes.Count, tnClone);
    }
    //TODO: ??? При повторном добавлении валится. Такое ощущение, что нужно проверять InvokeRequired для самого InvokeRequired :)
    if (tv.InvokeRequired)
    {
        Invoke(new ColoringNodeDelegate(ColoringNode), new object[] { tn });
    }
    else
    {
        tn.ForeColor = Color.FromName("Blue");//Красим узел
    }
}
Так вот, при одинарном запуске AddReportToExport всё работает нормально. Но если его запустить еще раз для того же TreeView и с тем же набором Nodes, то на строке
if (tv.InvokeRequired)
я получаю ошибку InvalidOperationException. Соответственно, вопрос - что я делаю не правильно, и как это исправить?
Миниатюры
Работа с делегатами  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.04.2013, 12:17
Ответы с готовыми решениями:

Работа с делегатами ,объявление переменной
Здравствуйте, и так сразу к делу: Работаю с делегатами, есть 4 формы : основная ,подчиненная(её...

Работа с делегатами
Я ещё новичок в C#, поэтому.. Задача может показаться легкой, но я ума не приложу, как её...

Проблема с делегатами
Добрый день , нужна помощь в решение задачи по книге Васильева . Условия задачи: Напишите...

Неоднозначность с делегатами
почему не компилится код? array.Select(Enumerable.Last).Where('а'.Equals).Count() Неоднозначный...

1
0 / 0 / 1
Регистрация: 02.03.2010
Сообщений: 46
30.04.2013, 12:31  [ТС] 2
Отбой. Нашел проблему. Несмотря на подсветку строки с tv.InvokeRequred, проблема была на строку выше - в ExportTree.Nodes.Insert, излечилось добавлением соответствующего делегата.
Однако, если заметите в коде какие косяки, буду благодарен за советы.
0
30.04.2013, 12:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.04.2013, 12:31
Помогаю со студенческими работами здесь

Создать словарь с делегатами.
Здравствуйте! Мне требуется создать словарь dictionary ключ которого имеет тип string, а значение...

Не понимаю код с делегатами
В общем в СИ уже два года программирую микроконтроллеры PIC AVR. Решил связать контроллер с компом...

Разобрать код с делегатами
Добрый день, возникло недопонимание с делегатами, прочитал статьи, но все равно, мозг никак не...

Прошу подсказать с делегатами
Приветствую всех. У меня трабла с делегатами... Не могу понять почему делегат не видит метод...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru