Как открыть форму по кнопке c
Перейти к содержимому

Как открыть форму по кнопке c

  • автор:

Как открыть форму new. С#

Проблема: Я решил сделать интерфейс. Сбоку которого есть кнопочки. При нажатии на кнопочку исполняется код, который переключает на дочернею форму. При переходе на другую дочернею форму по нажатию кнопочки загружается форма, и если хочешь вернутся на прошлую дочернею форму, то эта форма загружается заново. Повышается потребление ОЗУ и пропадают ведённые данные. Вот кусок кода:

 public void openChildForm(Form childForm, object btnSender) < if (activeForm != null) activeForm.Hide(); activeForm = childForm; childForm.TopLevel = false; childForm.FormBorderStyle = FormBorderStyle.None; childForm.Dock = DockStyle.Fill; panelChildForm.Controls.Add(childForm); panelChildForm.Tag = childForm; childForm.BringToFront(); childForm.Show(); >private void btnSettings_Click(object sender, EventArgs e)

Использовал hide и show, толку нет.
Отслеживать
задан 1 июн 2020 в 16:06
13 3 3 бронзовых знака

Форму чего? Укажите тег winforms или wpf, покажите код. Отредактируйте вопрос. Какие данные хотите сохранять, для чего? Искали ли вы решение, какие нашли варианты? Почему они вам не подошли? Пытались ли решить вопрос самостоятельно? Сейчас ваш вопрос похож на «у меня болит нога, как вылечить?».

1 июн 2020 в 16:15
Всё указал, теперь похоже на «Болит здесь, пробовал подорожник, не помогло, что делать?»
1 июн 2020 в 16:55
.NET Core или .NET Framework?
1 июн 2020 в 17:01
.NET Framework последней версии
1 июн 2020 в 17:07

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

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

  • В главном окне Form1 одна кнопка с именем button1 и названием Settings, заданным в дизайнере
  • Дочернее окно Form2 будет вызываться как модальное, то есть будет блокировать доступ к основному окну, пока оно открыто
  • Form2 содержит 3 контрола textBox1 , и 2 кнопки button1 OK, и button2 Cancel

Суть примера в том, что название главного окна можно поменять в окне настроек, сохранить или отменить сохранение настроек. При закрытии программы настроки сохраняются в XML файл settings.xml в каталоге с программой. При запуске программы соответственно оттуда загружаются, и если файла нет (например при первом запуске программы), то устанавливаются по умолчанию.

Класс настроек Settings.cs

[Serializable] public class Settings < // здесь и задам значение по умолчанию public string WindowName < get; set; >= "My Application"; > 

Далее, реализую окно настроек, при этом событие Form.Load в дизайнере привяжу к обработчику Form2_Load .

Далее на button1 я назначаю в дизайнере DialogResult.OK , на button2 — DialogResult.Cancel

Form2.cs

public partial class Form2 : Form < // публично доступное свойство с настройками public Settings Settings < get; set; >// никогда не вставляйте свой код в конструктор формы public Form2() < InitializeComponent(); >// гружу настройки в TextBox здесь private void Form2_Load(object sender, EventArgs e) < textBox1.Text = Settings.WindowName; >// А здесь записываю значение TextBox в настроки private void button1_Click(object sender, EventArgs e) < Settings.WindowName = textBox1.Text; >> 

Далее, главное окно Form1 . События Form.Load и Form.FormClosing привязываю с обработчикам Form1_Load и Form1_FormClosing соовтетственно.

Form1.cs

public partial class Form1 : Form < // путь к файлу с настройками private readonly string _settingsFilePath = Path.Combine(Application.StartupPath, "settings.xml"); // сами настройки, которые я буду хранить в классе главного окна private Settings _settings; public Form1() < InitializeComponent(); >// этот обработчик вызывается при запуске приложения private void Form1_Load(object sender, EventArgs e) < LoadSettings(); ApplySettings(); >// этот обработчик вызывается при закрытии приложения private void Form1_FormClosing(object sender, FormClosingEventArgs e) < SaveSettings(); >// загрузить настройки их XML файла private void LoadSettings() < // если файл есть if (File.Exists(_settingsFilePath)) < // гружу из него настройки XmlSerializer serializer = new XmlSerializer(typeof(Settings)); using (StreamReader sr = new StreamReader(_settingsFilePath)) < _settings = serializer.Deserialize(sr) as Settings; >> else < // если файла нет, просто создаю новые _settings = new Settings(); >> // сохранить настройки в XML файл private void SaveSettings() < XmlSerializer serializer = new XmlSerializer(typeof(Settings)); using (StreamWriter sw = new StreamWriter(_settingsFilePath)) < serializer.Serialize(sw, _settings); >> // применить настройки к окну private void ApplySettings() < Text = _settings.WindowName; >// кнопка Settings открывает окно настроек private void button1_Click(object sender, EventArgs e) < Form2 formSettings = new Form2 < Settings = _settings >; if (formSettings.ShowDialog(this) == DialogResult.OK) < _settings = formSettings.Settings; ApplySettings(); >> > 

Главный прикол состоит в том, что XmlSerializer сам превращает класс в XML файл (сериализует), и обратно (десереализует) автоматически.

Создайте этот пример у себя на базе нового Windows Forms приложения и потестируйте его. Окно настроек конечно создается заново каждый раз, но при закрытии оно корректно уничтожается (назначение DialogResult кнопке автоматически закрывает модальное окно, вызванное с помощью ShowDialog() ). Хранить в памяти только необходимые данные — дешевле и проще, чем целое окно.

К тому же ShowDialog() — это удобно. Например дочернему окну можно задать в дизайнере свойство StartPosition значение CenterParent , и оно появится ровно по центру родительского окна.

Открытие новой формы по нажатию button на форме?

Оче тупой вопрос, как я понимаю.
Есть форма1, с тремя кнопками
При нажатии на button1 должно открыться новое окно, где пользователь сможет добавлять строки в таблицу/не добавлять, если нажатие кнопки было случайным
Пробовал через создание Form2 и открытии её при нажатии на кнопку, но чот не работает.

Я так понимаю, сперва

public partial class Form2 : Form < public basket() 

Далее в действии после нажатия кнопки
Form2.Load

Но может есть иные пути?

  • Вопрос задан более трёх лет назад
  • 683 просмотра

Как открыть форму по кнопке c

Чтобы добавить еще одну форму в проект, нажмем на имя проекта в окне Solution Explorer (Обозреватель решений) правой кнопкой мыши и выберем Add(Добавить)->Windows Form.

добавление новой формы

Дадим новой форме какое-нибудь имя, например, Form2.cs:

создание новой формы

Итак, у нас в проект была добавлена вторая форма. Теперь попробуем осуществить взаимодействие между двумя формами. Допустим, первая форма по нажатию на кнопку будет вызывать вторую форму. Во-первых, добавим на первую форму Form1 кнопку и двойным щелчком по кнопке перейдем в файл кода. Итак, мы попадем в обработчик события нажатия кнопки, который создается по умолчанию после двойного щелчка по кнопке:

private void button1_Click(object sender, EventArgs e)

Теперь добавим в него код вызова второй формы. У нас вторая форма называется Form2, поэтому сначала мы создаем объект данного класса, а потом для его отображения на экране вызываем метод Show:

private void button1_Click(object sender, EventArgs e)

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

Итак перейдем ко второй форме и перейдем к ее коду - нажмем правой кнопкой мыши на форму и выберем View Code (Просмотр кода). Пока он пустой и содержит только конструктор. Поскольку C# поддерживает перегрузку методов, то мы можем создать несколько методов и конструкторов с разными параметрами и в зависимости от ситуации вызывать один из них. Итак, изменим файл кода второй формы на следующий:

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace HelloApp < public partial class Form2 : Form < public Form2() < InitializeComponent(); >public Form2(Form1 f) < InitializeComponent(); f.BackColor = Color.Yellow; >> >

Фактически мы только добавили здесь новый конструктор public Form2(Form1 f) , в котором мы получаем первую форму и устанавливаем ее фон в желтый цвет. Теперь перейдем к коду первой формы, где мы вызывали вторую форму и изменим его на следующий:

private void button1_Click(object sender, EventArgs e)

Поскольку в данном случае ключевое слово this представляет ссылку на текущий объект - объект Form1, то при создании второй формы она будет получать ее (ссылку) и через нее управлять первой формой.

Теперь после нажатия на кнопку у нас будет создана вторая форма, которая сразу изменит цвет первой формы.

Мы можем также создавать объекты и текущей формы:

private void button1_Click(object sender, EventArgs e)

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

ПолучитьФорму().Открыть() открывает другую форму

все.
Открывается ДРУГОЙ отчет. Ошибиться здесь негде. Смотрел в отладчике - выполняется эта строчка и следующий шаг - модуль того ДРУГОГО отчета. Потом из модуля того другого отчета попадаем в модуль формы нужного отчета (ОтчетТМЦБезЦен) и потом открывается форма - опять того ДРУГОГО отчета.
Выглядит полным бредом. Команд у отчета нет, модуль менеджера пуст, модуль объекта пуст.
Стер из конфигурации ОтчетТМЦБезЦен - стала ругаться "нет такого отчета". Вставил обратно - бред повторяется.
Если ОтчетТМЦБезЦен сохранить как внешний и открыть, то нормально открывается то, что нужно.
8.2.14.540, 11.0.6.9
Сделал тестирование исправление базы. Попробовал фокус в другой базе с той же конфигурацией - фокус повторяется.
Как это понимать и что делать? Кто-нибудь видел такое? я немного в растерянности.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *