Я думаю, что ответы Дэвида в Дакоте и Джеффа Донничи, приведенные выше, дадут вам все, что вам нужно, но я "продемонстрирую" тривиальный пример более широкого подхода, мудро предложенного Джеффом, который, я надеюсь, поможет вам начать .
Одна небольшая область разногласий, которая может возникнуть у меня с ответом Джеффа, заключается в том, что я считаю, что любое решение этой проблемы - это вариант «внедрения зависимостей» или «управления зависимостями»: даже если вы идете по «наиболее абстрактному» маршруту и имеете «издатели» «транслируют» события «неизвестным подписчикам», но это только мое личное мнение.
Вот простой пример типа, который мне было полезно понять в прошлом.
Создайте один общедоступный статический класс, в который вы вставляете статические ссылки на TextBox для всех форм, которые вы хотите изменить (или сохраняете сами формы, или что-то еще): определите общедоступные статические методы для перемещения данных из текстового поля одной формы в другое (ие): очень краткое описание: (использование сверхдлинных имен переменных является преднамеренным и предназначено только для пояснения)
using System;
using System.Collections.Generic;
using System.Windows.Forms;
// note : compiles against FrameWork 2.0 and 4.0
// wanted this to work w/o Linq, automatic properties, etc.
namespace MessageHandler
{
public static class TextBoxMessenger
{
// internal List of TextBoxes of interest on all Forms
internal static List<TextBox> _messageEnabledTBxes = new List<TextBox>();
// public Property to get/set the collection of TextBoxes of interest
public static List<TextBox>MessageEnabledTextBoxes
{
get { return _messageEnabledTBxes; }
set { _messageEnabledTBxes = value; }
}
// in case you want to register one TextBox at a time
public static void RegisterTextBoxForMessaging(TextBox theTBx)
{
_messageEnabledTBxes.Add(theTBx);
}
// send from one specific TBx to another
public static void setText(TextBox originTBx, TextBox destinationTBx)
{
destinationTBx.Text = originTBx.Text;
}
// send to a specified list of TextBoxes
public static void setText(TextBox originTBx, List<TextBox> destinationTBxs)
{
foreach (TextBox theTBx in destinationTBxs)
{
theTBx.Text = originTBx.Text;
}
}
// set text in all other TextBoxes in MessageEnabledTextBoxes list
public static void setText(TextBox originTBx)
{
foreach (TextBox theTBx in _messageEnabledTBxes)
{
// a needless check, since assigning the text of the
// original TextBox to itself wouldn't "hurt" anything
// but, imho, much better "practice" to always test
if (theTBx != originTBx) theTBx.Text = originTBx.Text;
}
}
}
}
Итак, в действии, как это работает: давайте рассмотрим пример, где ваше событие Form1 Load выглядит так:
// assume Form2 has a single TextBox on it named 'textBox1'
public Form2 myForm2;
private void Form1_Load(object sender, EventArgs e)
{
myForm2 = new Form2();
myForm2.Show();
// register all the TextBoxes
// note the redundant use of 'this here : it's a deliberate choice to make
// the code communicate to a future user/reader/maintainter
TextBoxMessenger.RegisterTextBoxForMessaging(this.textBox1);
TextBoxMessenger.RegisterTextBoxForMessaging(this.textBox2);
TextBoxMessenger.RegisterTextBoxForMessaging((TextBox)myForm2.Controls["textBox1"]);
// or ...
//TextBoxMessenger.MessageEnabledTextBoxes = new List<TextBox>
//{
// this.textBox1, this.textBox2, (TextBox)myForm2.Controls["textBox1"]
//};
}
И вы могли бы проверить вышеупомянутое, вот так, поместив кнопку в Form1:
private void button1_Click(object sender, EventArgs e)
{
// tests
// one to all ...
//TextBoxMessenger.setText(this.textBox1);
// one to a specific TextBox on another Form
//TextBoxMessenger.setText(this.textBox1, (TextBox) myForm2.Controls["textBox1"]);
// one to a List<TextBox>
TextBoxMessenger.setText(this.textBox1, new List<TextBox> { this.textBox2, (TextBox)myForm2.Controls["textBox1"]});
}
Но обратите внимание на «уродство», «неприятный запах кода» таких вещей, как:
(TextBox) myForm2.Controls ["textBox1"] // кастинг - это зло! установить кровавую ссылку!
Это та вещь, от которой вы хотите избавиться, выйдя за пределы подобного примера на «арену», на которую, я полагаю, указывает Джефф.
Надеюсь, это полезно. В «долгосрочной перспективе» абстракция передачи сообщений на более высокий уровень, который, как я полагаю, предписывает Джефф, является, «imho», «королевской дорогой» к тому, чтобы сделать примеры кода гораздо более мощными и более «обобщаемыми», чем этот пример. лучший