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

Как получить доступ к элементам Form1 из другого класса

31.07.2014, 15:59. Показов 12768. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Нахожусь в начальных этапах обучения языку C# и конечно возникло много вопросов, часть из которых я решил сам. Буду признателен, если подскажите как получить доступ к элементам формы, для дальнейшего взаимодействия с ними.

Моя программа выполняет GET запрос, при создании потока. Хотел, после получения некоторых данных выводить их в процессе выполнения потока. Но увы, не понимаю как это сделать.

Пытался так.

C#
1
2
Form1 frm = new Form1();
            frm.text = "123";
Так же, в модиф. textBox1 установил public. Не получилось присвоить текст. Мне надо именно внутри потока или одной из процедуры класса, получить доступ к элементу textBox1.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.07.2014, 15:59
Ответы с готовыми решениями:

Как получить доступ к элементам формы из другого обычного класса (не из второй формы)
Сабж. В гугле вся инфа только про доступ из другой формы, это я знаю. А вот как получить доступ из...

Классы С++, получить доступ из одного класса к элементам другого
Здравствуйте! Объясните пожалуйста, вот имеется у меня два класса,например вот такие: Class A...

Как получить доступ к элементам UserControl из класса?
Это стол рулетки (UserControl), мне нужно каждому квадратику (Lable) задать цвет (красный,черный)....

Как получить доступ к элементам формы из созданного класса?
Всем доброго времени суток!:help: Скажите, пожалуйста, как мне обратиться к элементу...

14
Эксперт .NET
5545 / 4308 / 1218
Регистрация: 12.10.2013
Сообщений: 12,356
Записей в блоге: 2
31.07.2014, 16:29 2
ingushmen, вам помогут события либо static класс.
0
33 / 31 / 7
Регистрация: 16.08.2012
Сообщений: 126
31.07.2014, 16:39 3
C#
1
frm.textBox1.text
наверное так?
0
3 / 3 / 3
Регистрация: 20.06.2011
Сообщений: 55
31.07.2014, 16:54  [ТС] 4
MaxValue, забыл исправить при создании темы. Но так тоже не пашет.
insite2012, если можно по подробней.
0
33 / 31 / 7
Регистрация: 16.08.2012
Сообщений: 126
31.07.2014, 17:54 5
а из другого потока, тогда так надо
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
delegate void SetTextCallback(string text);
 
private void SetText(string text)
{
     if (this.textBox1.InvokeRequired)
    {    
        SetTextCallback d = new SetTextCallback(SetText);
        this.Invoke(d, new object[] { text });
    }
    else
    {
        this.textBox1.Text = text;
    }
}
0
Эксперт .NET
5545 / 4308 / 1218
Регистрация: 12.10.2013
Сообщений: 12,356
Записей в блоге: 2
31.07.2014, 18:09 6
ingushmen, вариант 1, со статик классом.
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
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 Test_StaticClass
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            //Обработчик нажатия кнопки
            button1.Click += delegate
            {
                //Создаем рабочий экземпляр класса
                Test test = new Test();
                //Запускаем рабочий метод
                test.SomeMethod();
                //Устанавливаем текстовое поле по свойству из статик класса
                textBox1.Text = InfoClass.TestData;
            };
        }
    }
    public class Test
    {
        public void SomeMethod()
        {
            string s = string.Empty;
 
            //Какой-то код, формирующий нужные данные
            for (int i = 0; i < 10; i++)
            {
                s += "A";
                Thread.Sleep(200);
            }
            //Установка свойства в статик классе
            InfoClass.TestData = s;
        }
    }
    //Статик-класс для передачи данных
    public static class InfoClass
    {
        public static string TestData { get; set; }
    }
}
На форме кнопка и текстовое поле.

Добавлено через 8 минут
ingushmen, вариант 2, через событие.
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
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 Test_Events
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            //Обработчик нажатия кнопки
            button1.Click += delegate
            {
                //Создаем рабочий экземпляр класса
                Test test = new Test();
                //Подписываемся на событие в классе
                test.testEvent += delegate(object sender, EventArgs e) { test_Handler(sender, e); };
                //Запускаем рабочий метод
                test.SomeMethod();
            };
        }
        //Обработчик события в классе
        private void test_Handler(object sender, EventArgs e)
        {
            //Получаем объект вызвавший событие
            Test temp = sender as Test;
            //Устанавливаем текстовое поле из свойства класса
            textBox1.Text = temp.S;
        }
    }
    public class Test
    {
        //Событие в классе
        public event EventHandler testEvent;
        //Автосвойство в классе
        public string S { get; set; }
 
        public void SomeMethod()
        {
            //Какой-то код, формирующий нужные данные
            for (int i = 0; i < 10; i++)
            {
                S += "A";
                Thread.Sleep(200);
            }
 
            //Срабатывание события
            if (testEvent != null)
                testEvent(this, EventArgs.Empty);
        }
    }
}
На форме кнопка и текстовое поле.
0
3 / 3 / 3
Регистрация: 20.06.2011
Сообщений: 55
31.07.2014, 18:38  [ТС] 7
MaxValue, делаю так.

C#
1
Form1.SetTextCallback("test");
Но, что-то не получается. Делаю так.

C#
1
2
Form1 frm = new Form1();
                frm.SetTextCallback("test");
И так не получается.
0
Эксперт .NET
5545 / 4308 / 1218
Регистрация: 12.10.2013
Сообщений: 12,356
Записей в блоге: 2
31.07.2014, 18:46 8
ingushmen, выше показано аж два варианта. Используйте.
0
3 / 3 / 3
Регистрация: 20.06.2011
Сообщений: 55
31.07.2014, 18:49  [ТС] 9
insite2012, спасибо, что подсказали эти варианты, но первый и второй способ немного не подходят.

Есть класс: func.cs

Есть глоб. переменная public static string Token.

Так же функция которая пихает в textBox1 этот Token:
C#
1
2
3
4
            public void SetInfo(string url, string html)
            {
                textBox1.Text = Token;
            }
Эта функция вызывается из самого потока, которые выполняется после одного GET запроса. И следовательно пихает этот токен в текстбокс. А не после выполнения потока.
0
Эксперт .NET
5545 / 4308 / 1218
Регистрация: 12.10.2013
Сообщений: 12,356
Записей в блоге: 2
31.07.2014, 18:53 10
ingushmen, не понял... Еще раз и поподробнее. Есть форма с контролами. Есть класс. И есть статик переменная типа string (глобальных переменных нет! Чтобы они были, надо переходить на уровень IL!). И есть какой-то поток (отдельный), который что-то делает. И дальше? Опишите, что с чем и как взаимодействует?
0
3 / 3 / 3
Регистрация: 20.06.2011
Сообщений: 55
31.07.2014, 19:02  [ТС] 11
insite2012, есть переменная та, "Token". Которая может применяться как для Form1, так и для других функций. (Я просто перехожу с Delphi на C#, могу ошибаться в некоторых случаях).

Как я писал есть func.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
using System;
using System.Threading;
using System.Windows.Forms;
using System.Net;
using System.IO;
using System.Text;
using System.Security.Policy;
using System.Collections;
using System.Text.RegularExpressions;
using System.Drawing;
 
namespace VK
{
    public class Check
    {
 
      public static string Token;
 
        public void CreateThreads()
        {
            Thread Threadz;
            Threadz = new Thread(this.Checking);
            Threadz.IsBackground = true;
            Threadz.Start();
            
        }
        
    private void Checking()
        {
        
        //... Выполняется GET запрос, парсим из HTML -> token_acess, далее его пихаем в переменную Token.
        
        //Теперь после завершения потока, мы эту переменну выводим
        Form1.textBox1.Text = Token;
        
        //... Выполняются еще другие действия
        
        Thread.Sleep(500);
        }
 
    }
}
А Form1.cs событие Button1_click выполняет код создания потока. Который выполнил, GET запрос за и прочие действия, в процессе выполнения потока, чтобы пихал Токен и выполня другие действия.

C#
1
Check1.CreateThreads();
0
33 / 31 / 7
Регистрация: 16.08.2012
Сообщений: 126
31.07.2014, 19:08 12
не получается - выходит какая-то ошибка или просто ноль реакции?
0
Эксперт .NET
5545 / 4308 / 1218
Регистрация: 12.10.2013
Сообщений: 12,356
Записей в блоге: 2
31.07.2014, 19:12 13
ingushmen, так вот, в вашем классе создайте автосвойство для вашего Token. Далее в потоке установите ему к-либо значение и на строке 34 вашего кода выбросьте событие. А на форме подпишитесь на него и получите значение автосвойства класса так, как я показывал в примере. Это же элементарно. И не забывайте про обращение к контролам формы из другого потока (используйте Invoke()).
0
3 / 3 / 3
Регистрация: 20.06.2011
Сообщений: 55
31.07.2014, 19:13  [ТС] 14
MaxValue, никакой ошибки. Просто ноль реакции. Если так:
C#
1
2
Form1 frm = new Form1();
            frm.textBox1.text = "123";
А это, я для примера показал, как хотелось бы
Цитата Сообщение от ingushmen Посмотреть сообщение
//Теперь после завершения потока, мы эту переменну выводим
* * * * Form1.textBox1.Text = Token;
//... Выполняются еще другие действия
0
Эксперт .NET
5545 / 4308 / 1218
Регистрация: 12.10.2013
Сообщений: 12,356
Записей в блоге: 2
31.07.2014, 19:26 15
ingushmen, вот класс.
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.Linq;
using System.Text;
 
using System.Threading;
 
namespace WindowsFormsApplication3
{
    public class Check
    {
        public event EventHandler checkEvent;
        public static string Token { get; set; }
 
        public void CreateThread()
        {
            Thread t = new Thread(new ThreadStart(Checking));
            t.IsBackground = true;
            t.Start();
        }
        private void Checking()
        {
            //Делаем что-то.....
            Thread.Sleep(5000);
            //Устанавливаем токен
            Token = "O-lo-lo!";
            //Бросаем событие
            if (checkEvent != null)
                checkEvent(this, EventArgs.Empty);
            //И дальше что-то делаем...
            Thread.Sleep(5000);
        }
    }
}
А вот форма.
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
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();
            button1.Click += delegate { DoSomeWork(); };
        }
        private void DoSomeWork()
        {
            Check checker = new Check();
            checker.checkEvent += (s, e) =>
                {
                    this.Invoke((Action)delegate { textBox1.Text = Check.Token; });
                };
            checker.CreateThread();
        }
    }
}
1
31.07.2014, 19:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.07.2014, 19:26
Помогаю со студенческими работами здесь

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

Доступ к элементам формы из другого класса
Приветствую, в классе Form1.cs находятся элементы формы. Так же есть класс Doing.cs, в котором...

Доступ к элементам формы из другого класса C#
Всем доброго времени суток!) Возник вопрос, как получить доступ к элементам пользовательского...

Доступ к элементам формы из другого класса
День добрый! Подобных вопросов на форумах куча, но я так и не могу дойти до истины. Вот есть у...


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

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