Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Студент :)
895 / 328 / 12
Регистрация: 29.01.2011
Сообщений: 1,679

Создание элементов из кода другого класса

24.06.2014, 00:07. Показов 2080. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть задача динамически создавать элементы интерфейса из другого класса.
Вот код лэйбла
C#
1
2
3
4
5
6
7
8
9
10
11
            using System.Windows.Forms;
...
            Label Status = new Label();
            this.Status.AutoSize = true;
            this.Status.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
            this.Status.Location = new System.Drawing.Point(65, 45);
            this.Status.Name = "Status";
            this.Status.Size = new System.Drawing.Size(61, 17);
            this.Status.TabIndex = 1;
            this.Status.Text = "Статус: ";
            System.Windows.Forms.Control.ControlCollection.Controls.Add(Status);
проблема тут
C#
1
System.Windows.Forms.Control.ControlCollection.Controls.Add(Status);
пишет:
"System.Windows.Forms.Control.ControlCol lection" не содержит определение для "Controls"
Как решить эту проблему ?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.06.2014, 00:07
Ответы с готовыми решениями:

Создание объекта класса с полем являющимся объектом другого класса
Bill a; cin>>a;//тут я ввел с помощью перегруженного оператора ElementSpiska c; //поля у Spiska(Bill A,int,string,int) ...

Создание объекта класса, который будет содержать указанное количество объектов другого класса
Здравствуйте. Я сейчас только учусь, помогите, пожалуйста. Задача такая: необходимо создать класс кораблика из игры "Морской...

Создание экземпляра класса внутри другого класса
Добрый вечер. Стоит задача сделать поле ввода с валидацией данных. Нужно чтобы пользователь не мог ввести более 1 символа в поле. И...

14
 Аватар для Metall_Version
2152 / 1289 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
24.06.2014, 00:14
Цитата Сообщение от nanshakov Посмотреть сообщение
пишет:
"System.Windows.Forms.Control.ControlCol lection" не содержит определение для "Controls"
Как решить эту проблему ?
верно пишет. а куда хочешь добавить?
0
Студент :)
895 / 328 / 12
Регистрация: 29.01.2011
Сообщений: 1,679
24.06.2014, 11:55  [ТС]
C#
1
: Control
Добавил наследование, ошибка исчезла (хотел добавить просто на Form1, поверх "всего"). Но и контрол не появился. Хотя точка остановки на нем реагирует, значит код работает, но почему его не видно, вот вопрос.

Добавлено через 11 часов 24 минуты
Ага...компоненты создаются, но она за веббраузером. Как их на передний план переместить ?
C#
1
Status.BringToFront();
Добавлено через 9 минут
А нет. Этот работает только если мы из основного класса создаем.
А у меня в основном создается поток
C#
1
2
3
4
Thread Thread = new Thread(ThreadF);
                    Thread.IsBackground = true;
                    Thread.SetApartmentState(ApartmentState.STA);
                    Thread.Start();
ThreadF - создает новый экземпляр класса, в котором
C#
1
2
3
4
5
6
7
8
9
10
11
12
Label Status = new Label();
Form1 Form1 = new Form1();
 this.Status.AutoSize = true;
            this.Status.BackColor = System.Drawing.Color.White;
            this.Status.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
            this.Status.Location = new System.Drawing.Point(92, 189);
            this.Status.Name = "Status";
            this.Status.Size = new System.Drawing.Size(61, 17);
            this.Status.TabIndex = 1;
            this.Status.Text = "Статус: ";
            Form1.Controls.Add(Status);
            Status.BringToFront();
Но если я этот же код инициализации вставляю в новый проект и запуская из основного класса, о все работает. Почему ? Что я упускаю ?
0
 Аватар для Spawn
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
24.06.2014, 11:59
Что Вы сделать пытаетесь? Зачем Вам в отдельном потоке GUI?
0
Студент :)
895 / 328 / 12
Регистрация: 29.01.2011
Сообщений: 1,679
24.06.2014, 12:13  [ТС]
Поток запускает экземпляр класса, который путем сложного алгоритма генерирует отчет и выводит его на веббраузер, в виде красивого графика. процедура долгая, и я хотел отображать в лейблах, поверх веббраузера информацию о прогрессе (т.к. пока процесс создания отчета не закончен - там белая страница). Была еще идея - в процессе генерации отчета создавать страницы со статусом и грузить из в веббраузер, но это еще хуже, по ресурсам точно.
0
 Аватар для Spawn
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
24.06.2014, 12:16
https://www.cyberforum.ru/post6239733.html
Обращаюсь к Label, как видно из примера, весьма часто, но форма при этом не виснет...
1
Студент :)
895 / 328 / 12
Регистрация: 29.01.2011
Сообщений: 1,679
24.06.2014, 16:14  [ТС]
Spawn, Спасибо за пример, но он мне ровном счетом не помог ( даже стыдно).
Form1.cs:
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
public void ThreadF()
        {
            Class1 Class1 = new WindowsFormsApplication2.Class1();
            Class1.settext();
            label1.Text = Class1.str;
        }
 
        private void button1_Click_1(object sender, EventArgs e)
        {
            Thread Thread = new Thread(ThreadF);
            Thread.IsBackground = true;
            Thread.SetApartmentState(ApartmentState.STA);
            Thread.Start();
            //Example
            Label lbl = new Label();
            lbl.Font = new Font(Form.DefaultFont.FontFamily, 72, FontStyle.Bold);
            lbl.AutoSize = true;
            this.Controls.Add(lbl);
            new Thread(() =>
            {
                lbl.Invoke(new Action(() => lbl.Text = "Статус: "));
            }) { IsBackground = true }.Start();
            //Example
        }
Class1.cs:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Class1
    {
        public string str;
        Form1 Form1 = new Form1();
        int num = 0;
        public void settext()
        {
            while (num < int.MaxValue)
            {
                num += 1;
                //Form1.label1.Invoke(new Action(() => Form1.label1.Text = num.ToString()));
                str = num.ToString();
                Thread.Sleep(1);
            }
        }
    }
Мне нужно достать значение str. Ваш пример работает, я попытался его запухнуть к себе (закомментированная строка). на что получил Невозможно вызвать Invoke или BeginInvoke для элемента управления до завершения создания дескриптора окна. Понятно, что этот подход не правильный. Мб есть какой то способ достать значение это str ? Честно, я даже не понимаю, почему не происходит отображение.

Добавлено через 8 минут
Получилось сделать, но не правильно и через задницу.
C#
1
2
3
4
5
        public Form1()
        {
            InitializeComponent();
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
        }
C#
1
2
3
4
5
6
        public void ThreadF()
        {
            Class1 Class1 = new WindowsFormsApplication2.Class1();
            Class1.settext();
            label1.Text = Class1.str;
        }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
    class Class1
    {
        public string str;
        Form1 Form1 = new Form1();
        int num = 0;
        public void settext()
        {
                //num += 1;
                //Form1.label1.Invoke(new Action(() => Form1.label1.Text = num.ToString()));
                str = "111111";
                //Thread.Sleep(1);
        }
    }
Но использование System.Windows.Forms.Control.CheckForIll egalCrossThreadCalls = false; - совсем не выход. Ушел читать.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
24.06.2014, 16:18
nanshakov, не совсем понял вашу цель. Сделать что-то в отдельном потоке, а как эта процедура будет завершена, вывести результат на форму, верно?
0
Студент :)
895 / 328 / 12
Регистрация: 29.01.2011
Сообщений: 1,679
24.06.2014, 16:28  [ТС]
insite2012, Неа, кажется нет. Объясню снова. К примеру на надо разархивировать архив, пересчитать кол - во файлов в нем, и заархивировать назад. Код это операции (из 3х шагов) описан в классе. В отдельном потоке мы его инициализируем (т.к. реальный процесс состоит из большего числа шагов, и подвешивать форму на пару часов - не хорошо). когда мы начинаем разархивировать, в lable на главной форме пишем - Разархивируем архив <имя> (и любую другую информацию, которая получается во время работы, в том же классе). Дошли до пересчета - пишем пересчитываем объекты. И так далее.
Так, как уйти от
C#
1
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
я понял, тут проблем нет. Но, как оказалось, этот способ тоже не то.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
24.06.2014, 16:42
Цитата Сообщение от nanshakov Посмотреть сообщение
как оказалось, этот способ тоже не то.
nanshakov, это не способ. Это извращение. Причем в самой наигрубейшей форме.
По теме - то, что сказал вам я и то, что рассказали вы не сильно отличается. Итак, еще раз: Есть основное приложение. Есть класс. Мы создаем экземпляр класса, и вызываем из него какой-то метод, который начинает свою работу в отдельном потоке. И нам надо отслеживать прогресс работы метода. Так?
1
Студент :)
895 / 328 / 12
Регистрация: 29.01.2011
Сообщений: 1,679
24.06.2014, 16:46  [ТС]
insite2012, Именно так!

Не по теме:

Да знаю я, что извращение. Просто попробовал. не собирался я так работать..

0
 Аватар для Spawn
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
24.06.2014, 16:46
nanshakov, общий смысл сводится к тому, что нет необходимости лишнее окно создавать под это всё... Progress некий и в текущее окно кинуть можно. Чаще всего в отдельный поток выносится именно "работа". Пример создания прогресса в отдельном окне я могу скинуть, меня наверное тапками потом закидают, но по определённым причинам и такую вещь пришлось сотворить в своё время.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
24.06.2014, 17:42
Лучший ответ Сообщение было отмечено nanshakov как решение

Решение

nanshakov, подождите минут 10-15, будет вам полноценный пример.

Добавлено через 54 минуты
nanshakov, вот код самого класса. Для полноты картины я еще и прогрессбар использовал.
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using System.Threading;
using System.Threading.Tasks;
 
namespace WindowsFormsApplication3
{
    public class WorkClass
    {
        public event EventHandler<ProcessEventArgs> barOptionsEvent;
        public event EventHandler<ProcessEventArgs> lblTextEvent;
        public event EventHandler<ProcessEventArgs> errEvent;
        public event EventHandler barStepEvent;
        public event EventHandler processEnded;
 
        public void StartProcess()
        {
            Thread thr = new Thread(new ThreadStart(RunProcess));
            thr.IsBackground = true;
            thr.Start();
        }
 
        //Внешний метод запуска обработки данных
        private void RunProcess()
        {
            try
            {
                Unpack();  //Распаковка
 
                Read();    //Чтение
 
                Pack();    //Упаковка
 
                //Сообщение об успешной операции
                if (processEnded != null)
                    processEnded(this, EventArgs.Empty);
            }
            catch (Exception ex)
            {
                //Событе ошибки из потока
                if (errEvent != null)
                    errEvent(this, new ProcessEventArgs(ex.Message));
            }
        }
 
        //Метод распаковки
        private void Unpack()
        {
            //Изменение текста на метке
            if (lblTextEvent != null)
                lblTextEvent(this, new ProcessEventArgs("Распаковка..."));
 
            //Установки размера прогресса
            if (barOptionsEvent != null)
                barOptionsEvent(this, new ProcessEventArgs(100));
 
            //Цикл моделирующий длительную работу
            for (int i = 0; i < 100; i++)
            {
                //Шаг прогресса
                if (barStepEvent != null)
                    barStepEvent(this, EventArgs.Empty);
 
                Thread.Sleep(100);
            }
        }
 
        //Метод чтения
        private void Read()
        {
            //Изменение текста на метке
            if (lblTextEvent != null)
                lblTextEvent(this, new ProcessEventArgs("Чтение..."));
 
            //Установки размера прогресса
            if (barOptionsEvent != null)
                barOptionsEvent(this, new ProcessEventArgs(100));
 
            //Цикл моделирующий длительную работу
            for (int i = 0; i < 100; i++)
            {
                //Шаг прогресса
                if (barStepEvent != null)
                    barStepEvent(this, EventArgs.Empty);
 
                Thread.Sleep(100);
            }
        }
        
        //Метод упаковки
        private void Pack()
        {
            //Изменение текста на метке
            if (lblTextEvent != null)
                lblTextEvent(this, new ProcessEventArgs("Упаковка..."));
 
            //Установки размера прогресса
            if (barOptionsEvent != null)
                barOptionsEvent(this, new ProcessEventArgs(100));
 
            //Цикл моделирующий длительную работу
            for (int i = 0; i < 100; i++)
            {
                //Шаг прогресса
                if (barStepEvent != null)
                    barStepEvent(this, EventArgs.Empty);
 
                Thread.Sleep(100);
            }
        }
    }
 
    //Класс для аргумента событий
    public class ProcessEventArgs : EventArgs
    {
        public readonly int BarSize;
        public readonly string Message;
        public ProcessEventArgs(int size)
            : this("", size) { }
        public ProcessEventArgs(string msg)
            : this(msg, 0) { }
        public ProcessEventArgs(string msg, int size)
        {
            Message = msg;
            BarSize = size;
        }
    }
}
Вот код формы. На форме кнопка (с именем btnStart), прогрессбар и лейбл. По нажатию кнопки запускается процесс.
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
74
75
76
77
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            btnStart.Click += delegate { StartAllProcess(); };
        }
 
        private void StartAllProcess()
        {
            //Экземпляр класса
            WorkClass worker = new WorkClass();
 
            //Подключение обработчиков событий
            worker.lblTextEvent += (s, e) => { ChangeLabelText(e); };
            worker.barOptionsEvent += (s, e) => { BarOptions(e); };
            worker.barStepEvent += (s, e) => { BarStep(); };
            worker.processEnded += (s, e) => { EndProcess(); };
            worker.errEvent += (s, e) => { ErrorMsg(e); };
 
            //Запуск метода класса в отдельном потоке
            worker.StartProcess();
        }
        //Обработчик смены текста
        private void ChangeLabelText(ProcessEventArgs e)
        {
            this.Invoke((Action)delegate
            {
                label1.Text = e.Message;
            });
        }
        //Обработчик установок прогресса
        private void BarOptions(ProcessEventArgs e)
        {
            this.Invoke((Action)delegate
            {
                progressBar1.Maximum = e.BarSize;
                progressBar1.Minimum = 0;
                progressBar1.Value = 0;
                progressBar1.Step = 1;
            }); 
        }
        //Обработчик шага прогресса
        private void BarStep()
        {
            this.Invoke((Action)delegate
            {
                progressBar1.PerformStep();
            });
        }
        //Обработчик успешного завершения
        private void EndProcess()
        {
            this.Invoke((Action)delegate
            {
                progressBar1.Value = 0;
                label1.Text = "Процесс завершен!";
            });
        }
        //Обработка ошибок
        private void ErrorMsg(ProcessEventArgs e)
        {
            MessageBox.Show(e.Message, "Error!");
        }
    }
}
Проверяйте, что надо-берите и используйте. На всякий случай вот архив с проектом.
Вложения
Тип файла: rar Архив WinRAR.rar (48.7 Кб, 11 просмотров)
1
Студент :)
895 / 328 / 12
Регистрация: 29.01.2011
Сообщений: 1,679
25.06.2014, 11:53  [ТС]
insite2012, Все получилось, огромное спасибо Вам !
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
25.06.2014, 11:56
nanshakov, на здоровье.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.06.2014, 11:56
Помогаю со студенческими работами здесь

Создание экземпляр класса из другого класса
Добрый день, форумчане. Помогите разобраться с такой плюсовенькой проблемой: есть 2 класса (назовем их A &amp; B). Нужно в классе B...

Проверка значений элементов класса относительно словаря из другого класса
Доброго времени суток! Есть класс некого предмета, который содержит булиновский словарь: public class SomeObject { ...

Создание класса-списка на основе кода со списком без класса
Здравствуйте. Не могли бы вы показать, как оформить этот код в виде класса. Смысл задания: это засунуть в список большое число(здесь я...

Создание label из другого класса
Label создается, но при выводе отображается в отдельном окне. Как сделать так, чтобы он отображался внутри MainWindow в определенном месте?...

Вспомогательный класс для сокращения кода при создании другого класса
Добрый день. Есть код: template&lt;int floor&gt; struct Collection { template&lt;typename T&gt; struct WithBath { ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru