С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690

Как сделать отображение нескольких процессов в одном пользовательском контроле?

23.08.2018, 16:42. Показов 775. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Условный пример.
Имеется:
- файлы данных (используются для примера (файл "Данные")):
..\01\data\fol_data_1\fol_data_1.txt
..\01\data\fol_data_2\fol_data_2.txt
..\01\data\fol_data_3\fol_data_3.txt

Файлы "Данные" отображается ввиде дерева.
Пользователь может добавлять, удалять, изменять файлы "Данные".

Сценарий.
1. Пользователь. Выбирает в дереве один или более файлов "Данные" (fol_data_"N");
Выбор выполняется по средствам перевода ЧекБоксов в "true";
2. Пользователь. Нажимает кнопку "Выполнить" (button3);


3. Программа. Создаёт таблицы "ДатаТабле" для каждого файла "Данные";
4. Программа. Создаёт "ДатаГрид" для каждого файла "Данные";
5. Программа. Парсит данные из файла "Данные";
6. Программа. Заносит в "ДатаТабле";
7. Программа. Заносит в "ДатаГрид";

Пункты 3 - 7 должны выполняться одновременно для всех выбранных файлов "Данные".
Пункты 3 - 7 вынесены в пользовательский контрол "GridUserControl".
В то время когда программа выполняет процессы переноса строк из файла "Данные" в "ДатаТабле" пользователь может перемещаться по дереву курсором.
Если пользователь попадает на файл "Данные" процесс для которого уже запущен, то в "panel3" отображается "GridUserControl" с текущим состоянием заполнения "ДатаГрид" строками

Вопрос.
1. Как реализовать данные сценарий?
2. Какие есть замечания(предложения) по реализовать данного сценария?

GridUserControl.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
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace TreeView_FolderTree
{
    public partial class GridUserControl : UserControl
    {
 
        public string pathFileData;
 
        public GridUserControl(string pathFileData)
        {
            InitializeComponent();
 
            // Обрабатываем данные
            //Или записываем их в поле
* *         this.pathFileData = pathFileData;
 
        }
 
        private void GridUserControl_Load(object sender, EventArgs e)
        {
            start_GridUserControl();
        }
 
        public void start_GridUserControl()
        {
            DataTable table_1;
 
            //привязка данных
            BindingSource bs;
 
 
            table_1 = new DataTable();
            table_1.Columns.Add("Content", typeof(string));
            table_1.Columns.Add("DateTime", typeof(DateTime));
 
            bs = new BindingSource(table_1, "");
 
            dataGridView1.DataSource = bs;
            dataGridView1.Columns["DateTime"].DefaultCellStyle.Format = "dd.MM.yyyy HH:mm:ss tt";
 
            
 
            // Читаем файл "Данные"
            string[] lines = System.IO.File.ReadAllLines(pathFileData);
 
            // System.Console.WriteLine("Contents of WriteLines2.txt = ");
            foreach (string line in lines)
            {
                //создаем новую запись
                DataRow newrow = table_1.NewRow();
 
                //заполняем ее данными
                newrow["Content"] = line;
                newrow["DateTime"] = DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss");
 
                //заносим запись в таблицу
                table_1.Rows.Add(newrow);
 
                //обновляем данные в гриде
                bs.ResetBindings(false);
 
                // Пауза
                System.Threading.Thread.Sleep(1500);
                Application.DoEvents();
 
            }
        }
 
      
    }
}
Миниатюры
Как сделать отображение нескольких процессов в одном пользовательском контроле?  
Вложения
Тип файла: zip 01_pr.zip (126.0 Кб, 0 просмотров)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.08.2018, 16:42
Ответы с готовыми решениями:

Как заменить изображение на пользовательском контроле — наследнике от PictureBox?
У меня такая беда: создавал я, как обычно программку, сделал новый контролл, унаследованный от ПикчерБокса, нарисовал на нем всякую фигню,...

Методы форматирования строки в пользовательском контроле
Добрый вечер. Имеется созданный пользовательский элемент - индикатор. При добавлении индикатора на форму и вводе на форме в textbox...

Как сделать ожидание завершения нескольких процессов?
Всем привет! Нужно автоматизировать нагрузочное тестирование. Батник stress.bat должен запустить 100 процессов, дождаться их...

1
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
25.08.2018, 12:44  [ТС]
Сделал так.

Я на правильном пути или есть способы получше?

*** Код Form1.cs ***
Создаём TreeView
Кликните здесь для просмотра всего текста
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
#region  *** TreeView Создание***
        private void InitFolders()
        {
            //Отключаем любую перерисовку
            //иерархического представления.
            treeView1.BeginUpdate();
 
            //Инициализируем новую переменную предоставляющую методы экземпляра
            //класса для создания, перемещения и перечисления
            //в каталогах и подкаталогах.
            System.IO.DirectoryInfo di;
            try
            {
                //Вызываем метод GetDirectories с передачей в качестве параметра, пути к 
                //выбранной директории. Данный метод возвращает
                //массив имен подкаталогов.
                string[] root = System.IO.Directory.GetDirectories(path);
 
                //Проходимся по всем полученным подкаталогам.
                foreach (string s in root)
                {
                    try
                    {
                        //Заносим в переменную информацию
                        //о текущей директории.
                        di = new System.IO.DirectoryInfo(s);
                        //Вызов метода сканирования с
                        //передачей в качестве параметра, информации
                        //о текущей директории и объект 
                        //System.Windows.Forms.TreeNodeCollection,
                        //который предоставляет узлы
                        //дерева, назначенные элементу управления 
                        //иерархического представления.
                        BuildTree(di, treeView1.Nodes);
                    }
                    catch { }
                }
            }
            catch { }
            //Разрешаем перерисовку иерархического представления.
            treeView1.EndUpdate();
        }       
 
        //Процесс получения папок и файлов
        private void BuildTree(System.IO.DirectoryInfo directoryInfo, TreeNodeCollection addInMe)
        {
            //Добавляем новый узел в коллекцию Nodes
            //с именем текущей директории и указанием ключа 
            //со значением "Folder".
            TreeNode curNode = addInMe.Add("Folder", directoryInfo.Name);
 
            //addInMe.Add(directoryInfo.FullName, directoryInfo.Name, 
            //тут можно указать номер картинки для узла из imageCollection);
 
            //Перебираем папки.
            foreach (System.IO.DirectoryInfo subdir in directoryInfo.GetDirectories())
            {
                //Запускам процесс получения папок и файлов 
                //с текущей найденной директории.
                BuildTree(subdir, curNode.Nodes);
            }
 
            //Перебираем файлы
            foreach (System.IO.FileInfo file in directoryInfo.GetFiles())
            {
                //Добавляем новый узел в коллекцию Nodes
                //С именем текущей директории и указанием ключа 
                //со значением "File".
                curNode.Nodes.Add("File", file.Name);
 
                //curNode.Nodes.Add("File", file.Name, 
                //тут можно указать номер картинки для узла из imageCollection);  
            }
        }
        #endregion *** TreeView ***


Кнопка "Выполнить"
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
 // Выполнить 
        private void button3_Click(object sender, EventArgs e)
        {            
            // Перебор выбранных узлов "treeView"
               TreeNodeCollection Nodes;
               Nodes = treeView1.Nodes;
 
               CheckTrueTreeNode(Nodes);
        }


Рекруссия. treeView. CheckTrueTreeNode(TreeNodeCollection Nodes)
Кликните здесь для просмотра всего текста
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
#region *** Рекруссия. treeView ***
        void CheckTrueTreeNode(TreeNodeCollection Nodes)
        {
                foreach (TreeNode tn in Nodes)
                {
                    if (tn.Checked == true)
                    {
                    // textBox1.Text += (tn.Name + " -**//**- " + path + tn.FullPath + "\r\n");  // инфо сообщение 
                    //treeView1.SelectedNode = null;
                    //treeView1.SelectedNode = tn;
                    //tn.EnsureVisible();
                    //return;
                    
                    // путь к выбранному файлу 
                    pathFileData = path + tn.FullPath;
 
                    // BackgroundWorker. Старт
                    bw_start();
 
                    }
 
                    CheckTrueTreeNode(tn.Nodes);
                }
        }
        #endregion *** Рекруссия ***


Запускаем "BackgroundWorker". bw_start()

Кликните здесь для просмотра всего текста
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
private void bw_start()
         {
                // bw = new BackgroundWorker[];                
                i++;
 
                //новый поток
                bw[i] = new BackgroundWorker();
                bw[i].WorkerReportsProgress = true;
                bw[i].WorkerSupportsCancellation = true;
 
                bw[i].DoWork += new DoWorkEventHandler(bw_DoWork); 
                bw[i].RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); //обработчик 
                bw[i].ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
            
                if (bw[i].IsBusy != true)
                bw[i].RunWorkerAsync();
        }
 
        private void bw_DoWork(object sender, DoWorkEventArgs e)
            {
                DataTable table_1;
 
                //привязка данных
                BindingSource bs;
 
 
                table_1 = new DataTable();
                table_1.Columns.Add("Content", typeof(string));
                table_1.Columns.Add("DateTime", typeof(DateTime));
 
                bs = new BindingSource(table_1, "");
 
 
                // Читаем файл "Данные"
                string[] lines = System.IO.File.ReadAllLines(pathFileData);
 
                // System.Console.WriteLine("Contents of WriteLines2.txt = ");
                foreach (string line in lines)
                {
                    // создаем новую запись
                    DataRow newrow = table_1.NewRow();
 
                    // заполняем ее данными
                    newrow["Content"] = line;
                    newrow["DateTime"] = DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss");
 
                    // заносим запись в таблицу
                    table_1.Rows.Add(newrow);
 
                    // обновляем данные в грид
                    bs.ResetBindings(false);
 
                    // Пауза
                    System.Threading.Thread.Sleep(1500);
                    Application.DoEvents();
                }
            }
 
        private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                
            }
 
        static void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                
            }



Пункт:
"В то время когда программа выполняет процессы переноса строк из файла "Данные" в "ДатаТабле" пользователь может перемещаться по дереву курсором.
Если пользователь попадает на файл "Данные" процесс для которого уже запущен, то в "panel3" отображается "GridUserControl" с текущим состоянием заполнения "ДатаГрид" строками"
Обеспечивает

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
// События TreeView/ Происходит после выбора узла дерева.
        private void TreeView1_AfterSelect(Object sender, TreeViewEventArgs e)
        {
            panel1.Controls.Clear();
 
            GridUserControl GridUsCont = new GridUserControl(????);
 
            panel1.Controls.Add(GridUsCont);
 
        }



*** GridUserControl.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
25
26
27
28
29
30
31
32
33
namespace TreeView_FolderTree
{
    public partial class GridUserControl : UserControl
    {
 
        public string pathFileData;
 
        public GridUserControl(string pathFileData)
        {
            InitializeComponent();
 
            // Обрабатываем данные
            //Или записываем их в поле
* *         this.pathFileData = pathFileData;
 
        }
 
        private void GridUserControl_Load(object sender, EventArgs e)
        {
            start_GridUserControl();
        }
 
        public void start_GridUserControl()
        {            
            // dataGridView1
            dataGridView1.DataSource = bs;
            dataGridView1.Columns["DateTime"].DefaultCellStyle.Format = "dd.MM.yyyy HH:mm:ss tt";            
           
        }
 
      
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.08.2018, 12:44
Помогаю со студенческими работами здесь

Как в одном юзер контроле завести несколько контролов
Всем привет Проканает ли если я в юзер контроле заведу один видимый текстбокс и ещё несколько служебных? Смысл в том что в...

Отображение нескольких таблиц в одном datagridview
Добрый день! На форме есть datagridview, 3 кнопки. В бд акцесс есть 3 таблицы, бд я связал через конструктор. Необходимо сделать так что бы...

Отображение нескольких подсказок на одном окне
Если создать пару ToolTip'ов, привязать их к 2 разным контролам и отобразить используя IsOpen, второй ToolTip ни за что не закроется......

Отображение нескольких таблиц в одном DBGride
как отобразить несколько таблиц в одном гриде имеется две таблицы из которых нужно вывести столбцы в один грид структура таблиц такая ...

Отображение общего прогресса работы нескольких потоков на одном progressbar
В программе параллельно работают три потока, каждый из которых выполняет одинаковый объем работы, но время выполнения может отличаться. мне...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru