我创建了包含两个窗口的仪表板-主屏幕(窗体)和数据屏幕(用户控件)。 我的主屏幕是仪表板,并且单击仪表板上存在的“数据”按钮时,会将用户发送到数据屏幕(在此输入他的详细信息)。我在两个窗口之间进行此转换的方法是使数据屏幕可见,并在按下数据按钮时将其显示在前面。
Q1。这是切换窗口的正确方法吗?有更好的方法吗?
出现主要问题时,仪表板会指示用户是否输入了数据,如果是,则显示用户数据。提取用户数据的代码写在用户控件中。现在,我希望将此数据发送到主屏幕(窗体),以便可以在仪表板上显示数据。
Q2。如何链接用户控件和表单-明智的变量?如何在表单和用户控件之间建立双向通信,即用户控件应该能够读取表单的变量,而表单应该能够读取用户控件的变量
答案 0 :(得分:1)
这是两种方法...
在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);
}
}
}
现在,在Form1的Load()事件中(或使用属性窗格中的闪电图标),我们连接那个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可以以任何形式使用,无需更改。通常,这是一种更灵活的方法,当您的用户控件本质上更加通用并且将在更多情况下使用时,这才有意义。