Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
televniy
0 / 0 / 0
Регистрация: 26.04.2013
Сообщений: 3
1

Операции с контролами C#

26.04.2013, 21:09. Просмотров 576. Ответов 6
Метки нет (Все метки)

Здравствуйте.

У меня возникла следующая проблема при работе с формами в c#.
Пусть, к примеру, есть форма, на ней имеются button1 и label1.
Также есть внешний класс Class1 в том же пространстве имен. В Class1 содержаться какие-либо функции или методы (Function_Class1()), осуществляющие продолжительные математические вычисления.

При нажатии кнопки создается новый поток Tread t, в котором обращаемся к классу Class1.

Проблема заключается в следующем: как из Function_Class1() осуществлять управление label1. Требуется присваивать новое текстовое значение, или включать/отключать данный контрол.

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
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;
using System.Threading;
 
namespace FormsApplication
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        Class1 myClass = new Class1();
 
        private void button1_Click(object sender, EventArgs e)
        {
            Thread t = new Thread(Function_Form1);
            t.IsBackground = true;
            t.Start();
        }
 
        public void Function_Form1()
        {
            myClass.Function_Class1();
        }
    }
}
Внешний класс:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace FormsApplication
{
    class Class1
    {
        public void Function_Class1()
        {
            //здесь требуется присваивать занчения label1.Text = ...;
            //а также осуществлять управления label1.Enabled = true/false;
        }
    }
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.04.2013, 21:09
Ответы с готовыми решениями:

PointToClient с динамическими контролами
WinForms. Создаю динамический PictureBox координаты какието от фени.... и?.....

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

Связь между контролами и сохранение в XML
На форме имеется пять numericUpDown контролов и пять label. При изменении...

Реализовать класс MyArray, который бы поддерживал индексные операции, операции сложения, вычитания, умножения, деления
Необходимо реализовать класс MyArray, который бы поддерживал индексные...

Операции с несколькими контролами
На форме есть несколько контролов, которые при определённом условии должны...

6
Exerion
[Bicycle Reinventor]
296 / 238 / 106
Регистрация: 19.10.2011
Сообщений: 619
Записей в блоге: 2
Завершенные тесты: 2
26.04.2013, 21:26 2
в классе Form1 сделайте открытые свойства get set для label1.Text и label1.Enabled

Добавлено через 10 минут
Разумеется, сам экземпляр класса придётся передавать в конструктор Class1, чтобы оттуда был доступ к свойствам.
1
dood
46 / 46 / 12
Регистрация: 03.08.2012
Сообщений: 215
26.04.2013, 21:33 3
Для работы с потоками лучше использовать BackgroundWorker.
У него есть событие ProgressChanged с помощью которого можно управлять контролами.
1
televniy
0 / 0 / 0
Регистрация: 26.04.2013
Сообщений: 3
27.04.2013, 01:03  [ТС] 4
Цитата Сообщение от Exerion Посмотреть сообщение
в классе Form1 сделайте открытые свойства get set для label1.Text и label1.Enabled

Добавлено через 10 минут
Разумеется, сам экземпляр класса придётся передавать в конструктор Class1, чтобы оттуда был доступ к свойствам.
Exerion, я не очень понял, сказывается мой низкий уровень. Если приведете пример, буду благодарен.
0
dood
46 / 46 / 12
Регистрация: 03.08.2012
Сообщений: 215
27.04.2013, 08:45 5
На сколько я понял Exerion имел в виду свойство Modifiers. Будет ошибка, ибо у вас метод выполняется в другом потоке и доступа к контролам не будет.
Тут написано как обратится к контролам когда новый поток создается с помощью Thread.
1
Exerion
[Bicycle Reinventor]
296 / 238 / 106
Регистрация: 19.10.2011
Сообщений: 619
Записей в блоге: 2
Завершенные тесты: 2
27.04.2013, 11:52 6
Ну если кросс-тред операции будут запрещены, то надо пользоваться связкой делегаты + invoke.

C#
1
2
3
4
5
6
7
8
9
10
11
        private delegate void label1AccessDelegate(string value);
        public void SetLabel1Text(string value)
        {
            if (label1.InvokeRequired)
            {
                label1AccessDelegate method = new label1AccessDelegate(SetLabel1Text);
                label1.Invoke(method, new object[] { value });
                return;
            }
            label1.Text = value;
        }
1
televniy
0 / 0 / 0
Регистрация: 26.04.2013
Сообщений: 3
28.04.2013, 17:19  [ТС] 7
Нашел решение проблемы, довольно элегантное. Особая благодарность Артуру Рашидовичу.
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
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;
using System.Threading;
 
namespace FormsApplication
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private delegate void SetControl(string text, Control element);
 
        public void SetText(string text, Control element)
        {
            if (this.InvokeRequired)
            {
                SetControl r0 = new SetControl(SetText);
                this.Invoke(r0, text, element);
            }
            else
                element.Text = text;
        }
 
        // нажимаем кнопку, создаем поток
        private void button1_Click(object sender, EventArgs e)
        {
            Thread t = new Thread(Function_Form1);
            t.IsBackground = true;
            t.Start();
        }
 
        public void Function_Form1()
        {
            Class1 myClass = new Class1(this);
            //обращаемся к функции
            myClass.Function_Class1();
        }
    }
}
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
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;
using System.Threading;
 
namespace FormsApplication
{
    public class Class1
    {
        private Form1 form;
 
        public Class1(Form1 form)
        {
            this.form = form;
        }
 
        public void Function_Class1()
        {
            //здесь требуется присваивать значения label1.Text = ...;
            //а также осуществлять управления label1.Enabled = true/false;
            
            string str;
 
            for (int i = 0; i < 10; i++)
            {
                str = Convert.ToString(i);
                form.SetText(str, form.label1); // меняем контрол
                Thread.Sleep(1000);
            }
        }
    }
}
0
28.04.2013, 17:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.04.2013, 17:19

RichTextBox с контролами
По-сути,как сделать что-то такое,чтобы элемент работал...

Потерял ТАБ с контролами в VC++??
Куда-то задвинул сабж и не знаю как его вытащить Подскажите! Заранее спасибо!

Работа с динамическими контролами
Здравствуйте, форумчане. Я создаю программу для курьерской службы. На моей...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru