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

Переход одной формы в другую

13.01.2014, 12:20. Показов 19291. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Прикрепляю картинку к своему вопросу, чтобы наглядно было лучше понятно.

Теперь вопрос. Возможно он покажется элементарным и такое даже спрашивать всем стыдно (поскольку я не смог найти ответа, а искал несколько дней), но вы не смейтесь, а расскажите как правильно сделать.

На картинке изображены окна, и они у меня в разных ареолах, чтобы ориентироваться было проще.
Допустим есть основное меня (зеленый) при нажатии красной клавиши, содержание окна становится , например, как у окна справа (красный), при нажатии синей кнопки как у окна слева (синий). ну и так далее.

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

И вот наконец вопрос. Как сделать вот такие штуки?
Я знаю, что можно сделать форму1 , форму2, форму3 и т.д. и открывать их и закрывать, но что-то мне подсказывает, что в программах которые я использую повседневно все сделано совсем не так. будто бы в одной и той же форме происходят действия.
была мысль сделать все через вкладки (TabControl). Убрать названия вкладок, и тайным способом переключать их... да, так работало на дэлфи, но тут почему-то не вышло. Была попытка наделать панелей в конструкторе (Panel) и включать и выключать их, но думается, что это что-то не то, да и не удобно до жути.
Так вот, думается, что есть еще способ, когда внутри формы открывается какой-то элемент, либо другая форма (внутри нашей первой, а не сверху нашей формы в виде нового окна), которая содержит уже необходимые нам ингредиенты(;
я прошу знающего человека сказать, как делают это умные люди.

p.s. я знаю, что что-то можно в wpf сделать, но это совсем другая история, и этому нужно по новой учиться, а до него ведь тоже как-то делалось...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.01.2014, 12:20
Ответы с готовыми решениями:

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

Переход от одной формы к другой и ошибка при закрытии одной из них
Здравствуйте! Есть 2 формы. Из одной перехожу во вторую по нажатию кнопки, со второй возвращаюсь в первую 2мя способами: 1) при закрытии...

Монополия: сделать переход фишками с одной ячейки в другую
Как сделать переход фишками с одной ячейки в другую?

15
 Аватар для Kruds
708 / 708 / 226
Регистрация: 04.03.2013
Сообщений: 1,384
13.01.2014, 12:42
Форма в форме - multiple-document interface (MDI).
Вот первые две ссылки по запросу "mdi forms tutorial c#":
http://msdn.microsoft.com/en-u... .110).aspx
http://www.youtube.com/watch?v=-4EYhC9xDHo
2
3 / 0 / 0
Регистрация: 10.01.2014
Сообщений: 17
13.01.2014, 12:56  [ТС]
Здорово. Я о таком и не слышал. Посмотрел видео, стало что-то понятней. Но мой случай, все же, не совсем этот случай. Форма в форме = это круто, но если ты присмотришься к картинкам, то я описывал нечто другое. Не знаешь ли еще способы? Либо с помощью MDI все же получится так сделать?
0
 Аватар для Kruds
708 / 708 / 226
Регистрация: 04.03.2013
Сообщений: 1,384
13.01.2014, 13:05
Можно сделать с помощью MDI, можно при открытии вторичной формы скрывать основную, а потом снова показывать.

Добавлено через 2 минуты
Простейший вариант через диалоговый показ второй формы:
C#
1
2
3
4
5
6
7
8
//обработчик кнопки на первой форме
private void button1_Click(object sender, EventArgs e)
{
    Form2 f = new Form2();
    this.Hide();
    f.ShowDialog();
    this.Show();
}
0
3 / 0 / 0
Регистрация: 10.01.2014
Сообщений: 17
13.01.2014, 15:08  [ТС]
потому способ с двумя формами я и не хочу, что , видно это появление и исчезновение (даже если сделать появление в одинаковых местах).
любой установщик запускаем, и там это "далее, далее" не открывает и не закрывает форму.
потому вопрос остается открытым. а я пока помучаю это МДИ

Добавлено через 1 час 7 минут
Вот к чему я пришел:
Создаю форму. И создаю несколько "Пользовательский элемент управления". И запускаю программно их на этой форме.

Если кто-нибудь все же напишет способ лучше, то буду премного благодарен.

Добавлено через 48 минут
С "Пользовательским элементом управления" тоже видимо косяк. Не получается передать с него на основную форму, что его нужно закрыть. (;
0
 Аватар для Spectral-Owl
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
13.01.2014, 17:05
можешь попробовать что-то наподобие этого, тоже UserControls:

форма
Кликните здесь для просмотра всего текста
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.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    public partial class UnitsForm : Form
    {
        private const int MaxUnits = 0x02;
        
        private int currentUnitIndex = 0x00;
        private int CurrentUnitIndex
        {
            get { return currentUnitIndex; }
            set
            {
                if (value < MaxUnits)
                    currentUnitIndex = value;
                else
                    currentUnitIndex = 0x00;
            }
        }
 
        public ChildrenUnit currentUnit = null;
        public UnitsForm()
        {
            InitializeComponent();
            AddUnit();
        }
 
        public void ChangeUnit(object sender, EventArgs e)
        { AddUnit(); }
 
        public void AddUnit()
        {
            if (currentUnit != null)
                DeleteUnit();
 
            switch (this.CurrentUnitIndex)
            {
                case 0x00: { this.currentUnit = new UnitOne(); break; }
                case 0x01: { this.currentUnit = new UnitTwo(); break; }
                default: { CurrentUnitIndex = 0x00; AddUnit(); return; }
            }
 
            this.currentUnit.Changing += ChangeUnit;
            this.Controls.Add(this.currentUnit);
            this.CurrentUnitIndex++;
        }
 
        public void DeleteUnit()
        {
            this.currentUnit.Changing -= ChangeUnit;
            this.currentUnit.Dispose();
 
            this.Controls.Remove(currentUnit);
        }
    }
}

контролы
Кликните здесь для просмотра всего текста
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.Text;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    public abstract class ChildrenUnit: UserControl
    {
        public const int UnitWidth = 300;
        public const int UnitHeight = 300;
        public const int UnitLeft = 15;
        public const int UnitTop = 15;
 
        public event EventHandler Changing;
 
        public ChildrenUnit()
        {
            this.Size = new System.Drawing.Size(UnitWidth, UnitHeight);
            this.Location = new System.Drawing.Point(UnitLeft, UnitTop);
 
            Button btnChange = new Button();
            btnChange.Dock = DockStyle.Bottom;
            btnChange.Text = "Следующий юнит";
            btnChange.Click += new EventHandler((sndr, e) => Changing(sndr, e));
 
            this.Controls.Add(btnChange);
        }
    }
 
    public class UnitOne : ChildrenUnit
    {
        public UnitOne()
            : base()
        {
            this.Controls.Add(new Button() { Location = new System.Drawing.Point(100, 100) });
        }
    }
 
    public class UnitTwo : ChildrenUnit
    {
        public UnitTwo()
            : base()
        {
            this.Controls.Add(new ListBox(){Location=new System.Drawing.Point(100,100)});
        }
    }
}


Добавлено через 13 минут
хм... так организовать контролы будет правильнее:
Кликните здесь для просмотра всего текста
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
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    public abstract class ChildrenUnit: UserControl
    {
        public const int UnitWidth = 300;
        public const int UnitHeight = 300;
        public const int UnitLeft = 15;
        public const int UnitTop = 15;
 
        protected abstract string ButtonCaption { get; }
        public event EventHandler Changing;
 
        public ChildrenUnit()
        {
            this.Size = new System.Drawing.Size(UnitWidth, UnitHeight);
            this.Location = new System.Drawing.Point(UnitLeft, UnitTop);
 
            Button btnChange = new Button();
            btnChange.Dock = DockStyle.Bottom;
            btnChange.Text = ButtonCaption;
            btnChange.Click += new EventHandler((sndr, e) => Changing(sndr, e));
 
            this.Controls.Add(btnChange);
        }
    }
 
    public class UnitOne : ChildrenUnit
    {
        protected override string ButtonCaption { get { return "Перейти к контролу 2"; } }
 
        public UnitOne()
            : base()
        {
            this.Controls.Add(new Button() { Location = new System.Drawing.Point(100, 100) });
        }
    }
 
    public class UnitTwo : ChildrenUnit
    {
        protected override string ButtonCaption { get { return "Вернуться к контролу 1"; } }
 
        public UnitTwo()
            : base()
        {
            this.Controls.Add(new ListBox(){Location=new System.Drawing.Point(100,100)});
        }
    }
}


Добавлено через 7 минут
Цитата Сообщение от amebow Посмотреть сообщение
Не получается передать с него на основную форму, что его нужно закрыть. (;
и сразу представляется такой матёрый контрол-рецедивист, которого опять "закрыли" за грабёж со взломом). этож не форма, кто-ж его закроет?)

контрол можно задиспозить, либо удалить из коллекции контролов формы. передать необходимость этого события, уж простите за тавтологию, можно с помощью события (у меня событие представлено как EventHandler Changing, которое вызывается при событии нажатия на кнопку, добавленную конструкторе абстрактного контрола)
1
3 / 0 / 0
Регистрация: 10.01.2014
Сообщений: 17
13.01.2014, 17:24  [ТС]
спасибо. еще не смотрел, но заранее уверен, что теперь сдвинусь с мертвой точки.
ну контрол отлично закрывается из формы его вызвавшей, а вот сам из себя - не получилось(((;
но сейчас посмотрим, что мне там было предложено
0
 Аватар для Spectral-Owl
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
13.01.2014, 18:02
C#
1
this.Dispose();//в контексте класса-контрола, и всё удаляется)
0
3 / 0 / 0
Регистрация: 10.01.2014
Сообщений: 17
14.01.2014, 14:31  [ТС]
Spectral-Owl, не получается это. по разному пробовал вставлять приведенный текст, но всегда выдает ошибки. и просто так вставить - то же самое. это так замысловато, оказалось. видимо, сидеть мне в одной форме, и не париться.
0
 Аватар для Spectral-Owl
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
14.01.2014, 15:31
э... единственное что может вызывать осложнения это пространства имён... ща архив склепаю.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
14.01.2014, 15:32
Я бы использовала контролы, причему логику тоже вклинивал в контролы. Что-то такого плана:

Создаем абстрактный базовій контрол с событием закрытия.
Реализуем нужные интерфейсы. При клике на меню замещаем (или просто скрываем) меню и отображаем указанный контрол. При вызове закрития удаляем контрол и возращаем меню.
Всю логику работы размещаем на контроле.

Если не ясно, то поздно вечером могу скинуть пример.
0
 Аватар для Spectral-Owl
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
14.01.2014, 15:34
обещанный архив
Вложения
Тип файла: rar WinTest.rar (50.0 Кб, 151 просмотров)
2
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
14.01.2014, 16:56
Цитата Сообщение от Spectral-Owl Посмотреть сообщение
обещанный архив
приблизительно такое я и предлагал.
0
3 / 0 / 0
Регистрация: 10.01.2014
Сообщений: 17
15.01.2014, 09:44  [ТС]
Spectral-Owl, спасибо большое. именно такой результат я и имел ввиду. теперь разберу все по полочкам.
0
0 / 0 / 1
Регистрация: 26.12.2013
Сообщений: 5
15.01.2014, 11:46
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
using System;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;
            tabControl1.Appearance = TabAppearance.Buttons;
            tabControl1.ItemSize = new System.Drawing.Size(0, 1);
            tabControl1.SizeMode = TabSizeMode.Fixed;
            tabControl1.TabStop = false;
        }
        // Кнопка на первой закладке
        private void button1_Click(object sender, EventArgs e)
        {
            tabControl1.SelectedIndex = 1;
        }
        // Кнопка на второй закладке
        private void button2_Click(object sender, EventArgs e)
        {
            tabControl1.SelectedIndex = 0;
        }
    }
}
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
15.01.2014, 17:49
Цитата Сообщение от BrainS Посмотреть сообщение
tabControl
Табы вещь интересная, но требуют постоянного присутствия всех элементов. На мой взгляд, это не сильно красиво и практическое тоже самое, что накидать n-ое количество панелей и отображать их по очереди.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.01.2014, 17:49
Помогаю со студенческими работами здесь

Переход от одной формы к другой
Как сделать переход от одной формы к другой C#? Переход как бы есть! он очень медленный ,можно ли ускорить этот процесс?

Переход от одной формы к другой
Здравствуйте. Проблема стандартна - перейти из одной формы form1 во вторую form2 При этом, не имеет значения, закрывать первую, или...

Переход от одной формы к другой
У меня есть текстбокс и кнопка, так вот мне надо допустим ввел цифру 6 и прога сразу показала мне 6-ю форму, или если ввожу форму 15 то...

Плавный переход от одной формы к другой
Можно ли как то сделать плавный переход от одной формы к другой? А то быстрый переход прямо режет глаза. Надеюсь на вашу помощь. Код...

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера 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. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru