Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
7 / 7 / 3
Регистрация: 16.04.2015
Сообщений: 175

Пользовательский элемент управления UserControl (выполнение операций внутри)

13.07.2016, 11:18. Показов 1412. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Смысл в следующем:
Есть некий пользовательский элемент с кнопками и некоторыми функциями внутри. По нажатию кнопок происходит некая обработка и выдача результата данной обработки.
Вопрос: Реально-ли это сделать по принципу
C#
1
var result = userControl1(something);
или
C#
1
userControl1(something, out result);
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.07.2016, 11:18
Ответы с готовыми решениями:

Пользовательский элемент управления
Привет всем! Вопрос собственно по теме. Как его создать? Очень мало информации в интернете и на YouTube. Я вроде бы разобрался с простыми...

Пользовательский элемент управления
Помгите! Надо создать элемент управления (в виде трапеции) чтобы при клике на нем менялся цвет сего элемента управления.

Пользовательский элемент управления и конструктор
Создал свой элемент управления, при компиляции отображается и работает как часы (собсна часы и делал:)), НО при загрузке конструктора форм...

10
186 / 184 / 97
Регистрация: 30.04.2016
Сообщений: 478
13.07.2016, 11:59
а под userControl Вы что здесь понимаете? Модальное окно?
0
16 / 16 / 5
Регистрация: 09.06.2015
Сообщений: 96
13.07.2016, 12:03
реально, надо добавить в Control
C#
1
2
3
 
public delegate void MethodContainer();
public event MethodContainer onEvent;
и подписаться на событие Control.onEvent += ...
а в контроле генерировать onEvent в нужном месте
0
7 / 7 / 3
Регистрация: 16.04.2015
Сообщений: 175
13.07.2016, 13:33  [ТС]
Цитата Сообщение от golubyatnikovtv Посмотреть сообщение
а под userControl Вы что здесь понимаете?
Разумеется под ним я понимаю пользовательский элемент управления (UserControl - по-умолчанию...).
Т.е., например панель с двумя кнопками "Да", "Нет". Когда пользователь совершает некое действие, то появляется эта панелька и опрашивает пользователя. Программная клавиатура, своего рода...

Добавлено через 2 минуты
Цитата Сообщение от sysadkrd Посмотреть сообщение
реально, надо добавить в Control
Благодарю за ответ, но это немного не то. Через события у меня сейчас реализовано, а хотелось бы так, как я описал это в вопросе.
0
186 / 184 / 97
Регистрация: 30.04.2016
Сообщений: 478
13.07.2016, 14:21
Цитата Сообщение от DMF Посмотреть сообщение
Через события у меня сейчас реализовано, а хотелось бы так, как я описал это в вопросе.
Вообще, через события такая функциональность и реализовывается. Может объясните сценарий использования описанного Вами подхода? А то совсем не понятно чего Вы хотите добиться.
Создается ощущение, что за Вашими плечами опыт программирования на функциональных языках, а сейчас Вы начали заниматься ООП.
0
7 / 7 / 3
Регистрация: 16.04.2015
Сообщений: 175
13.07.2016, 14:32  [ТС]
Цитата Сообщение от golubyatnikovtv Посмотреть сообщение
чего Вы хотите добиться
Грубо говоря, есть процедура. В процессе её выполнения возникает необходимость задать вопрос пользователю. По результату ответа процедура должна продолжить своё выполнение. Т.е., нельзя просто прервать выполнение процедуры, что бы потом отреагировать на событие, т.к. процедура не завершена. И разбить процедуру на две части, до и после события, не представляется возможным. Идеально было бы по условию обращаться к элементу как к переменной (или получать из него переменную).

П.С.: Как MessegeBox действует...
0
186 / 184 / 97
Регистрация: 30.04.2016
Сообщений: 478
13.07.2016, 15:03
Цитата Сообщение от DMF Посмотреть сообщение
Как MessegeBox действует...
Может тогда модальное окно открыть и поместить туда UserControl?
В Окне создать публичное свойство с результатом взаимодействия с пользователем и к нему обращаться после закрытия окна. Окно открывать через ShowDialog(), при этом выполнение процедуры будет приостановлено до закрытия окна.
0
964 / 485 / 241
Регистрация: 02.06.2016
Сообщений: 760
13.07.2016, 15:25
DMF, лучше делать модальный режим у компонента или режим на событиях/промисах. Но! можно сделать так. Например, у тебя есть уже какое-то событие:
C#
1
2
3
struct MyDelegateResult { public string Text; }
delegate void MyDelegate(MyDelegateResult result);
event MyDelegate MyDelegateEvent;
которое вызывается(raise), например (чтобы подчеркнуть асинхронность), по нажатию на кнопку:
C#
1
2
3
4
private void button1_Click(object sender, EventArgs e)
{
    MyDelegateEvent?.Invoke(new MyDelegateResult() { Text = "введенный текст" });
}
А тебе нужно как-то получать этот Text "синхронно". Тогда делаем такой метод:
C#
1
2
3
4
5
6
7
8
9
10
11
12
Task<string> GetText()
{
    var tcs = new TaskCompletionSource<string>();
    MyDelegate eh = null;
    eh = (e) =>
    {
        tcs.SetResult(e.Text);
        MyDelegateEvent -= eh;
    };
    MyDelegateEvent += eh;
    return tcs.Task;
}
И через await ждем пока событие наступит. Для примера в form_load:
C#
1
2
3
4
5
private async void Form1_Load(object sender, EventArgs e)
{
    string text = await GetText(); // Вот оно! 
    MessageBox.Show(text);
}
Соответственно, в твоем случае события и метод GetText нужно положить внутрь компонента и читать про TaskCompletionSource.
полный код формы
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
using System;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        
        public Form1()
        { 
            InitializeComponent();
            this.Load += Form1_Load;
            button1.Click += button1_Click;
        }
 
        struct MyDelegateResult { public string Text; }
        delegate void MyDelegate(MyDelegateResult result);
        event MyDelegate MyDelegateEvent;
 
        private void button1_Click(object sender, EventArgs e)
        {
            MyDelegateEvent?.Invoke(new MyDelegateResult() { Text = "введенный текст" });
        }
 
        Task<string> GetText()
        {
            var tcs = new TaskCompletionSource<string>();
            MyDelegate eh = null;
            eh = (e) =>
            {
                tcs.SetResult(e.Text);
                MyDelegateEvent -= eh;
            };
            MyDelegateEvent += eh;
            return tcs.Task;
        }
 
        private async void Form1_Load(object sender, EventArgs e)
        {
            string text = await GetText(); 
            MessageBox.Show(text);
        }
    }
}
0
7 / 7 / 3
Регистрация: 16.04.2015
Сообщений: 175
13.07.2016, 15:39  [ТС]
Цитата Сообщение от golubyatnikovtv Посмотреть сообщение
ShowDialog()
Он же только у форм есть? У меня Windows Mobile... Формы открываются на весь экран, а значит закроет всю важную для пользователя информацию...

Добавлено через 5 минут
Цитата Сообщение от Aael Посмотреть сообщение
лучше делать модальный режим у компонента
Это как?

Добавлено через 7 минут
Элемент управления свой делал что бы сократить код, потому, что использую его в разных окнах. А так не получается никакой экономии... хоть через события, хоть через задачи делать...
0
964 / 485 / 241
Регистрация: 02.06.2016
Сообщений: 760
13.07.2016, 15:47
DMF, имхо на коде не стоит экономить =) Лучше привинтить какой-нибудь крутой менеджер компонентов, типа надстроек в ms office, способный позиционировать компоненты и фризить когда нужно.
Цитата Сообщение от DMF Посмотреть сообщение
Это как?
а это вопрос проектирования интерфейса. кто ж знает что у тебя там за софт и как его сделать удобным для пользователя.. (ну кроме тебя)
0
7 / 7 / 3
Регистрация: 16.04.2015
Сообщений: 175
13.07.2016, 15:58  [ТС]
Цитата Сообщение от Aael Посмотреть сообщение
Task<string>
Этот класс доступен только в .NET 4? а у меня .NET CF 3.5

Добавлено через 2 минуты
Цитата Сообщение от Aael Посмотреть сообщение
проектирования интерфейса
Я имел ввиду, как его сделать модальным?
Вообще, возможно получать инфу из компонента через его метод с ожиданием действий пользователя?
При таком варианте как-раз и будет элемент модальным...

Добавлено через 5 минут
Цитата Сообщение от Aael Посмотреть сообщение
на коде не стоит экономить
Без такой экономии памяти не хватает...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.07.2016, 15:58
Помогаю со студенческими работами здесь

Пользовательский элемент управления и события
Собственно проблема состоит в том, что у меня есть некая переменная: public static DependencyProperty CurrentFileProperty = ...

Пользовательский элемент управления Edit
Привет,ребята,нужна помощь,нужно создать пользовательский элемент управления Edit(я создал) и теперь нужно организовать проверку вводимых...

Простенький пользовательский элемент управления
Доброго времени суток, уважаемые программисты. Решил я написать простенький user control :) Написать, дабы хотя бы чуток улучшить...

Пользовательский элемент управления. С чего начать
Не скрою, статей видел много, понятного мало. Задача такая. Состоять будет контрол из RichTextBox, Label'ов, DataGridView и...

Как создать пользовательский элемент управления
Доброе время суток. Подскажите пожалуйста как создать свой пользовательской элемент управления? Как его добавить в список ко всем...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера 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. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru