С# Передача данных через формы

58
7

Пытался найти решение этой проблемы, но не смог найти рабочий, поэтому решил сам это расспросить.

У меня есть текстовое поле в Form2.cs с именем "ipaddress_2", а другое - в Form1.cs с именем "ipaddress".

Это код, который я использую для запуска Form2.cs.

    private void rtmTool_Load(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.ShowDialog();
}

Я хочу импортировать данные из поля Form2.cs в ящик формы Forms1.cs, поэтому, когда пользователь закрыл форму2.cs, form1 будет иметь уже заполненный (form2) ip.

Это ссылка для form1.cs, если вам нужно/хотите взглянуть. http://www.mediafire.com/download/3f5726axo7w6o92/Source.txt

С уважением.

спросил(а) 2020-04-04T00:45:27+03:00 6 месяцев, 3 недели назад
1
Решение
57

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

Пример объекта

    public class IPSettings:INotifyPropertyChanged
{
private string ipAddress;

public string IPAddress
{
get
{
return this.ipAddress;
}
set
{
this.ipAddress = value;
OnPropertyChanged("IPAddress");
}
}

public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = this.PropertyChanged;
if(handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}

Форма 1

    public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
ipSettings = new IPSettings();
textBoxIpAddress1.DataBindings.Add("Text", ipSettings, "IPAddress");
}

private IPSettings ipSettings;

private void buttonOpenDialog_Click(object sender, EventArgs e)
{
new Form2(ipSettings).ShowDialog();
}
}

Форма 2

    public partial class Form2 : Form
{
public Form2(IPSettings ipSettings)
{
InitializeComponent();
textBoxIpAddress2.DataBindings.Add("Text", ipSettings, "IPAddress",false,DataSourceUpdateMode.OnPropertyChanged);
}
}

ответил(а) 2020-04-04T01:04:32.779726+03:00 6 месяцев, 3 недели назад
41

Когда f2 закрыто, управление вернется к функции, которая называется ShowDialog.

f2 будет по-прежнему доступным для использования, поэтому, пока элементы управления объявляются общедоступными, вы должны иметь доступ к ним напрямую:

private void rtmTool_Load(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.ShowDialog();
ipAddress.Text = f2.ip_address2.Text;
}

ответил(а) 2020-04-04T00:45:27+03:00 6 месяцев, 3 недели назад
41

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

Форма 1

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

private void button1_Click(object sender, EventArgs e)
{
using(var form = new Form2())
{
form.ShowDialog();
ipAddess.Text = form.IpAddress;
}
}
}

Форма 2

public partial class Form2 : Form
{
public string IpAddress
{
get
{
return ip_address.Text;
}
}
}

ответил(а) 2020-04-04T00:45:27+03:00 6 месяцев, 3 недели назад
41

По умолчанию в файле Form2.Designer.cs ipaddress_2 объявляется private. Измените спецификатор доступа для public доступа.

Затем из Form1.cs вы можете получить доступ к Form2.cs - ipaddress_2 следующим образом.

private void rtmTool_Load(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.ShowDialog();
ipAddress.Text = f2.ip_address2.Text; // After the Form2.cs has been closed, the ipaddress from Form2.cs has been accessed and displayed in Form1.cs - ipaddress Textbox.
}

ответил(а) 2020-04-04T00:45:27+03:00 6 месяцев, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема