Я думаю, что ответы Давида в Дакоте и Джеффа Доннини, выше, дают вам все, что вам нужно, но я буду «продумать» тривиальный пример более широкого подхода, разумно предложенного Джеффом, и надеюсь, что вы получите начал.
Одна небольшая область несогласия, которую я могу иметь с ответом Джеффа, заключается в том, что я считаю, что любое решение этой проблемы - это вариант «инъекции зависимостей» или «управления зависимостями»: даже если вы идете «самым абстрактным» маршрутом и «издатели» «транслируют» события «неизвестным подписчикам», но это только мое личное мнение.
Вот простой пример того типа, который был полезен для меня в прошлом.
Создайте единый общедоступный статический класс, в который вы вставляете статические ссылки на текстовые поля во всех Формах, которые вы хотите изменить (или сохранить сами формы или что-то еще): определить публичные статические методы для перемещения данных из текстового поля одной формы в другие (ы): очень быстрый набросок: (использование удлиненных имен переменных является преднамеренным, и только для пояснительных целей)
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 Событие загрузки выглядит так:
// 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, «королевский путь», чтобы сделать примеры кода более мощными и более «обобщаемыми», чем этот пример. best,
imho было бы полезно выяснить, как именно Form1 и Form2 создаются: Form1 создает Form2 (возможно, что мы предположим, прочитав ваше сообщение); или, являются ли обе формы, созданные каким-либо другим классом или формой? best, – BillW
Это только я или этот вопрос действительно непонятен? – claws