Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
245 / 55 / 6
Регистрация: 05.08.2010
Сообщений: 222

Многошаговое приложение

18.01.2011, 16:57. Показов 2062. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Я собрался делать проект (первый в моей жизни на формах). И столкнулся с такой идеологической проблемой. Планирую спроектировать форму таким образом - сверху какая то часть будет содержать название проги, слева что-то типа навигации, а вот основная область будет пошагово совершать какие-либо действия, к примеру первый шаг - ввод начальных данных, второй - ввод множественных данных, а третий - отрисовка графика. На этой части будут кнопочки типа Next и Back. Так вот вопрос каким элементом управления сделать эту область и как менять содержимое этой области в зависимости от шага. Единственное что приходит на ум очень коряво -
1 идея - скрывать одни контролы и показывать другие. Заведомо думаю - что это бред, ибо это очень сложно проектировать - в дизайнере уж точно (будут перекрывать друг друга и прочее)
2 идея - на каждый шаг рисовать свою целую форму и ее показывать (думаю что это как то оч не по людски и будет наверно моргать форма в момент перехода)
3 идея - общая форма одна для всех и рабочая область представляет собой контрол - форма, которые я для каждого шага нарисую отдельно (но как это реализовывать непонятно, форма в форме - вообще можно так? и будут наверное проблемы с убиранием верхней полоски с именем)

Все идеи бредовые? Как вообще это народ делает, гуглю уже второй день, прочитал курсы на интуите, форум вроде пролазил, ничего чтобы решило эту проблему не могу найти. Заранее спасибо.


Еще идея есть сделать TabControl, но это как то некрасиво чтоль будет
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.01.2011, 16:57
Ответы с готовыми решениями:

Приложение со всеми библиотеками, или как запустить приложение без установленного FW
Извините, если для профессионалов эта тема покажется уже заезженной, но я не нашла решения в...

Скомпилировать приложение так, чтобы другое приложение было у него в ресурсах
Хочу написать программу-компилятор, в которой нужно указать файл, и она скомпилирует другую...

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

11
179 / 175 / 14
Регистрация: 17.01.2011
Сообщений: 349
18.01.2011, 19:41
Возможно, стоит посмотреть в сторону WPF? Неоднократно видел примеры подобных программ. Вот статья на MSDN, где описывается создание такого приложения.
1
 Аватар для Unril
826 / 717 / 110
Регистрация: 06.10.2010
Сообщений: 825
Записей в блоге: 1
18.01.2011, 19:56
Даже стало интересно сделать такое на WinForms. В общем вот, что получилось:
Каждая страница представляем собой UserControl с нужными элементами. На главной форме есть панель, куда и добавляется нужный контрол с опцией Dock = DockStyle.Fill. Переключение между контролами ведётся с помощью делегатов, переданных в конструктор контролов.
Класс главной формы:
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
using System;
using System.Windows.Forms;
 
namespace WindowsFormsTest {
    public partial class MainForm : Form {
        private readonly Library _library;
        private readonly UserControlSheet _userControlSheet;
 
        public MainForm() {
            InitializeComponent();
 
            // Добавляем начальные данные в библиотеку
            _library = new Library {
                new Book( "Название1", "Автор1", "Описание1" ),
                new Book( "Название2", "Автор2", "Описание2" ),
                new Book( "Название3", "Автор3", "Описание3" )
            };
 
            // Создаём экземпляр контрола с таблицей
            _userControlSheet = new UserControlSheet( ChangeUserControl, _library ) {
                Dock = DockStyle.Fill
            };
 
            // Добавляем его на панель
            panel.Controls.Add( _userControlSheet );
        }
 
        // Процедура добавления книги в библиотеку
        private void AddBookToLibrary( Book book ) {
            _library.Add( book );
        }
 
        // Процедура смены текущего контрола в панели
        private void ChangeUserControl( string controlName, Book book ) {
            // Удаляем из панели все элементы
            panel.Controls.Clear();
 
            // Контрол для добавляения
            UserControl userControl;
 
            // В зависимости от переданного имени контрола выбираем, что отображать
            switch ( controlName ) {
                case "AddBook": {
                    userControl = new UserControlAddBook( ChangeUserControl ) {
                        Dock = DockStyle.Fill
                    };
                }
                    break;
                case "Result": {
                    userControl = new UserControlResult( ChangeUserControl, book, AddBookToLibrary ) {
                        Dock = DockStyle.Fill
                    };
                }
                    break;
                case "Sheet": {
                    // Отображаем уже созданный контрол с таблицей
                    userControl = _userControlSheet;
                }
                    break;
                default:
                    throw new ArgumentException( "Неправильное название элемента" );
            }
 
            // Добавляем контрол на панель
            if ( userControl != null ) {
                panel.Controls.Add( userControl );
            }
        }
 
        private void menuItemExit_Click( object sender, EventArgs e ) {
            // Выходим из приложения
            Application.Exit();
        }
    }
}
Класс одного из контролов:
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
using System;
using System.Windows.Forms;
 
namespace WindowsFormsTest {
    /// <summary>
    /// Контрол для добавления книги
    /// </summary>
    public partial class UserControlAddBook : UserControl {
        private readonly Action<string, Book> _changeUserControl;
 
        public UserControlAddBook( Action<string, Book> changeUserControl ) {
            // Ссылка на процедуру смены контрола
            _changeUserControl = changeUserControl;
            InitializeComponent();
        }
 
        private void buttonOnward_Click( object sender, EventArgs e ) {
            // Создаём экземпляр книги на основе введённых данных
            Book book = new Book( textBoxTitle.Text, textBoxAuthor.Text, textBoxDescription.Text );
 
            // Меняем контрол и передаём книгу в процедуру смены контрола
            _changeUserControl( "Result", book );
        }
    }
}
Сам проект приложения:
WindowsFormsTest.zip
Делал под .net 4.0, но должно идти и под 3.5.
1
245 / 55 / 6
Регистрация: 05.08.2010
Сообщений: 222
19.01.2011, 13:04  [ТС]
Цитата Сообщение от Slap Посмотреть сообщение
Возможно, стоит посмотреть в сторону WPF? Неоднократно видел примеры подобных программ. Вот статья на MSDN, где описывается создание такого приложения.
Спасибо, но я пока не хочу углублятся в WPF, сделаю первые проекты без него, может быть потом как нибудь накручу на них красоту, сейчас я хотел бы посвободнее себя чувствовать хотя бы в простом.


Цитата Сообщение от Unril Посмотреть сообщение
Сам проект приложения:
WindowsFormsTest.zip
Делал под .net 4.0, но должно идти и под 3.5
У меня тоже 4.0 - все работает. Спасибо тебе огромное, я не ожидал такого развернутого ответа, да еще и с проектом. Идея очень хорошая, я сам бы такую не наглил, а ваять самому еще рано - первый проект =) С кодом разобрался, даже вопросов по сути нет - все круто.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
19.01.2011, 13:09
Цитата Сообщение от Belthazor4 Посмотреть сообщение
основная область будет пошагово совершать какие-либо действия, к примеру первый шаг - ввод начальных данных, второй - ввод множественных данных, а третий - отрисовка графика.
Это делается таблицей страниц: погаси закладки, прилепи кнопки и сам реализуй логику перелистывания.

Добавлено через 2 минуты
Цитата Сообщение от Belthazor4 Посмотреть сообщение
форма в форме - вообще можно так
Конечно. Иначе как реализовать интерфейс MDI (много документов в одном экземпляре приложения)? Только предназначено это именно как раз для MDI, а не для шагов.
1
245 / 55 / 6
Регистрация: 05.08.2010
Сообщений: 222
19.01.2011, 13:34  [ТС]
Цитата Сообщение от taras atavin Посмотреть сообщение
Это делается таблицей страниц: погаси закладки, прилепи кнопки и сам реализуй логику перелистывания.
То есть Tabcontrol'ом, как я понимаю? Хмм, тоже интересная идея - спасибо. А как гасить вкладки ?
UpdateTabSelection(false); ?
а переключаться - .SelectedIndex = value;?
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
19.01.2011, 13:38
Цитата Сообщение от Belthazor4 Посмотреть сообщение
а переключаться - .SelectedIndex = value;?
Кончено.

Добавлено через 1 минуту
Цитата Сообщение от Belthazor4 Посмотреть сообщение
а переключаться - .SelectedIndex = value;?
Не уверен в написани свойства, но кажется так.
Цитата Сообщение от Belthazor4 Посмотреть сообщение
То есть Tabcontrol'ом, как я понимаю
Я PageControl имел ввиду.

Добавлено через 1 минуту
Цитата Сообщение от Belthazor4 Посмотреть сообщение
А как гасить вкладки ?
Не сами страницы, а закладки с краю для ручного листания. Как гасить точно не знаю, у Чарлза Педзолдта описано, но там не через VCL, а на API. Согласно книге, прямо в винде есть библиотека дочерних окон, в неё входит и таблица страницы, имеющая стиль, при котором закладки не отображаются. Если не найдёшь, как гасить, то ещё вариант. Несколько панелей одного рамера и с совпадающими координатами верхнего левого угла. Нужную показываешь, остальные гасишь. При этом тоже самое произойдёт и со всеми контролами на этих панелях.
0
245 / 55 / 6
Регистрация: 05.08.2010
Сообщений: 222
19.01.2011, 13:46  [ТС]
Цитата Сообщение от taras atavin Посмотреть сообщение
Я PageControl имел ввиду.
Что то я не нашел на Toolbox'е c контролами pagecontrol, но случайно наткнулся на какой то форум и там чел один предложил сделать такую штуку TabControl'ом, точнее сделал наследника tabcontrol, с методами спрятать закладки и переход. Вот я решил спереть оттуда
C#
1
this.tabControl1.UpdateTabSelection(false);
в
C#
1
InitializeComponent();
без наследования, и VS мне говорит что этот метод закрыт, вот незадача, то есть без наследования здесь не обойтись?
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
19.01.2011, 13:49
Вкладка Common Controls. Табконтрол, кстати, на ней же.

Добавлено через 1 минуту
Листать, кстати,
C++
1
TabIndex=value;
.
0
245 / 55 / 6
Регистрация: 05.08.2010
Сообщений: 222
19.01.2011, 13:54  [ТС]
Нету у меня, а tabcontrol в containers. Может из-за того что c# express
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
19.01.2011, 14:05
Цитата Сообщение от taras atavin Посмотреть сообщение
а переключаться - .SelectedIndex = value;?
Кончено.
Блин, можно как то удалить эту строку?
0
245 / 55 / 6
Регистрация: 05.08.2010
Сообщений: 222
19.01.2011, 14:53  [ТС]
Всем спасибо за советы, я и правда решил сделать Наследником TabControl (нашел в другом источнике). Получился вот такой класс
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
using System;
using System.ComponentModel;
using System.Collections;
using System.Diagnostics;
using System.Windows.Forms;
using System.Runtime.InteropServices;
 
namespace BATabs
{
    public class BATab : System.Windows.Forms.TabControl
    {
 
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.Container components = null;
 
        public BATab(System.ComponentModel.IContainer container)
        {
            /// <summary>
            /// Required for Windows.Forms Class Composition Designer support
            /// </summary>
            container.Add(this);
            InitializeComponent();
 
            //
            // TODO: Add any constructor code after InitializeComponent call
            //
        }
 
        public BATab()
        {
            /// <summary>
            /// Required for Windows.Forms Class Composition Designer support
            /// </summary>
            InitializeComponent();
 
            //
            // TODO: Add any constructor code after InitializeComponent call
            //
        }
 
        #region Component Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            components = new System.ComponentModel.Container();
        }
        #endregion
 
 
        bool m_bShowTabs = false;
        public bool ShowTabs
        {
            get
            {
                return m_bShowTabs;
            }
            set
            {
                m_bShowTabs = value;
                UpdateTabSelection(false);
            }
        }
 
        public override System.Drawing.Rectangle DisplayRectangle
        {
            get
            {
                return m_bShowTabs ? base.DisplayRectangle : ClientRectangle;
            }
        }
 
        public int SelIndex
        {
            get
            {
                return base.SelectedIndex;
            }
            set
            {
                base.SelectedIndex = value;
            }
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.01.2011, 14:53
Помогаю со студенческими работами здесь

Переделать консольное приложение в приложение Windows Forms
Дорогие друзья пожалуйста помогите в консольным приложением. У меня есть код, но он под консольное...

Запустить одно свое приложение через другое свое приложение
Здравствуйте. В программе &quot;программа1&quot; запускаю &quot;программа2&quot; через Process.Start(&quot;программа1&quot;); ...

Если приложение запущено, то показать MessageBox и закрыть приложение
Доброго времени. Плохо разбираюсь в с# и прощу помощи написать кусочек кода. Мысль такая &quot;Если...

Как открыть консольное приложение в .NET через другое консольное приложение .NET
Есть один вопрос. Как открыть консольное приложение .NET через другое консольное приложение .NET,...

Создание приложение типа Messenger. Как правильно создать такое приложение?
Доброго времени суток. Вот мне нужно написать приложение типа Messenger на технологии WinForms или...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
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