Вот два подхода ...
Плотно связанные
В UserControlA я объявил свойство типа Form1 (родительская форма):
public partial class UserControlA : UserControl
{
public UserControlA()
{
InitializeComponent();
}
private Form1 f1;
public Form1 F1
{
get { return f1; }
set { f1 = value; }
}
private void foo()
{
if (f1 != null)
{
// ... do something with "f1" ...
}
}
}
Затем в Form1 я устанавливаю это свойство в событии Load ():
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
userControlA1.F1 = this;
}
}
Это тесно связано, потому что теперь UserControlA имеет жестко запрограммированную ссылку на Form1. Это делает его хорошо работающим с Form1, но теперь менее гибким, так как не будет хорошо работать с любыми другими формами. Если вы хотите, чтобы этот подход работал, например, с Form2, вам придется изменить жестко запрограммированный тип в UserControl.
Используйте этот подход, если между формой и пользовательским контролем существует очень тесная связь, и вполне вероятно, что пользовательский контроль не будет использоваться ни с какими другими формами, ни в каких-либо других сценариях.
Слабосвязанный
В UserControlB я объявил событие (BroadcastName), которое сообщит строку внешнему миру:
public partial class UserControlB : UserControl
{
public delegate void dlgBroadcastName(UserControlB source, string name);
public event dlgBroadcastName BroadcastName;
public UserControlB()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (BroadcastName != null)
{
BroadcastName(this, textBox1.Text);
}
}
}
Теперь в событии Load () формы Form1 (или с помощью значка молнии на панели свойств) мы подключаем это событие BroadcastName:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
userControlB1.BroadcastName += UserControlB1_BroadcastName;
}
private void UserControlB1_BroadcastName(UserControlB source, string name)
{
// ... do something to Form1 with the received information in here ...
}
}
Это слабо связано, потому что UserControlB понятия не имеет, с кем он общается. Он просто поднимает свое событие, и тот, кто подписался, получает уведомление. Обратите внимание, что этот UserControl может использоваться с любой формой без изменений. Как правило, это более гибкий подход, который имеет смысл, когда ваш пользовательский контроль носит более общий характер и будет использоваться в самых разных ситуациях.