получение значений из предыдущих форм в c # winforms - PullRequest
0 голосов
/ 08 октября 2019

У меня есть 2 формы, которые содержат около 20 текстовых полей, и я хочу сохранить все 20 записей и показать их все в 3-й форме, каждая из которых показана в разных ярлыках, я сохранил все 20 данных в отдельных public static string глобальных переменных, но имея глобальную переменную 20 static, она занимает много памяти и замедляет работу программы, есть ли другой способ сохранить эти данные и сохранить их индивидуально в метках?

вот что я пробовал:

первая форма:

public static string place_of_application;
public static string gender;

private void bunifuFlatButton1_Click(object sender, EventArgs e)
{
    place_of_application = PlaceOfApplication.Text;
    gender = identity.Text;
    ...
}

вторая форма:

private void PrintTemplateForm_Load(object sender, EventArgs e)
{
    label36.Text = userform2.place_of_birth;
    label34.Text = userform2.gender;
    ...    
}

спасибо за помощь

Ответы [ 3 ]

0 голосов
/ 08 октября 2019

Допустим, у вас есть две формы, основная форма и вторичная форма. У вас есть несколько текстовых полей в основном, и после нажатия кнопки вы хотите получить данные из них и показать их в форме 2.

Сначала я бы определил класс, который представляет данные, которые вы хотите отправить / получить. Кажется, это какие-то личные данные, поэтому давайте создадим класс Person:

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

Очевидно, у вас будут все ваши 20 вещей в качестве свойств в классе, а не только эти два.

Теперь идея заключается в том, чтобы получить данные из текстовых полей и сохранить их в экземпляре этого объекта. Далее, во второй форме, которую вы хотите запустить, давайте передадим объект Person в конструктор. Таким образом, код второй формы будет выглядеть следующим образом. Мы сохраним эту Person информацию во второй форме, а затем отобразим ее метки.

public partial class SecondForm : Form
{
    public Person Person { get; set; }

    public SecondForm(Person person)
    {
        InitializeComponent();
        Person = person;
    }

    private void SecondForm_Load(object sender, EventArgs e)
    {
        lblName.Text = Person.Name;
        lblAge.Text = Person.Age.ToString();
    }
}

Теперь в основной форме, когда нажата кнопка, мы сохраним данные в экземпляреPerson class, затем передайте его в конструктор SecondForm и затем покажите его.

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var person = new Person();
        person.Name = txtName.Text;
        if (int.TryParse(txtAge.Text, out int age))
        {
            person.Age = age;
        }

        var form2 = new SecondForm(person);
        form2.Show();
    }
}
0 голосов
/ 09 октября 2019

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


Рекомендация

Попробуйте воспользоваться объектно-ориентированными функциями C# и построить модель данных (т. Е. Класс, содержащий все данные). Затем вы можете передать этот класс (или фактически ссылку на класс) из одной формы в другую. Каждая форма будет отвечать за заполнение своих собственных текстовых полей из модели данных или создание нового экземпляра модели данных из текстовых полей.

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

Я настоятельно рекомендую прочитать книгу по программированию Windows или найти онлайн-ресурсы с примерами. [SO] не очень хорошее место, чтобы научиться правильно создавать приложения для Windows.


Пример

  1. Модель данных - это класс, содержащий данные

    public class PersonalInformation
    {
        public string PlaceOfApplication { get; set; }
        public string Gender { get; set; }
        // .. more here
    }
    
  2. Основная форма может получать или отправлять данные через PersonalInformation объект.

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    
        public PersonalInformation PersonalInformation
        {
            get
            {
                return new PersonalInformation()
                {
                    PlaceOfApplication = placeOfApplicationTextBox.Text,
                    Gender = genderTextBox.Text
                };
            }
            set
            {
                placeOfApplicationTextBox.Text = value.PlaceOfApplication;
                genderTextBox.Text = value.Gender;
            }
        }
    }
    
  3. Во второй форме создать метод для получения данных

    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
    
        public void SetPersonalInformation(PersonalInformation value)
        {
            placeOfApplictionLabel.Text = value.PlaceOfApplication;
            genderLabel.Text = value.Gender;
        }
    }
    
  4. В первой форме нажмите кнопку, подготовив и отправив информацию во вторую форму

    public partial class Form1 : Form
    {
        ...
    
        private void secondFormButton_Click(object sender, EventArgs e)
        {
            var dlg = new Form2();
            dlg.SetPersonalInformation(this.PersonalInformation);
    
            if (dlg.ShowDialog(this) == DialogResult.OK)
            {
                // user pressed OK in second form
            }
        }
    }
    
  5. Проверьте процесс

screenshot

0 голосов
/ 08 октября 2019

Одним из подходов может быть выбор всех ваших текстовых полей в первой форме и в окнах свойств Visual Studio (полагаю, вы используете эту IDE), перейдите к свойству Modifiers и выберите Public из списка

* 1002. *enter image description here

Или вы можете напрямую отредактировать файл Form1.Designer.cs и изменить все нужные вам текстовые поля с Private на Public, после чего вы сможете получить к ним доступ непосредственно из вашей второй формыкак это:

Form1 frm = new Form1();
frm.ShowDialog();
if (frm.DialogResult == DialogResult.OK)
    label1.Text = frm.textBox1.Text;
...