Visual Studio : 链接用户控件和表单

Visual Studio : Linking User Control and Form

我创建了由两个 windows 组成的仪表板 - 主屏幕(表单)和数据屏幕(用户控件)。 我的主屏幕是仪表板,单击仪表板上的 "data" 按钮后,用户将被转到数据屏幕(他可以在其中输入详细信息)。我在 2 windows 之间进行这种转换的方法是使数据屏幕可见,并在按下数据按钮时将其置于前面。

Q1。这是切换 windows 的正确方法吗?有更好的方法吗?

回到主要问题,仪表板指示用户是否输入了数据,如果是,则显示用户数据。获取用户数据的代码写在用户控件中。现在我希望将此数据发送到主屏幕(表单),以便数据可以显示在仪表板上。

Q2。如何 link 用户控件和表单 - 变量明智?如何在表单和用户控件之间建立双向通信,即用户控件应该能够读取表单的变量,而表单应该能够读取用户控件的变量

这里有两种方法...


紧耦合

在 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 的 hard-coded 引用。这使得它可以很好地与 Form1 配合使用,但现在不太灵活,因为它不能很好地与任何其他表单配合使用。例如,如果您希望此方法适用于 Form2,则必须更改 UserControl 中的 hard-coded 类型。

如果表单和用户控件之间存在非常紧密的关系,并且用户控件可能不会与任何其他表单一起使用,或在任何其他情况下可能使用此方法。


松耦合

在 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 可用于任何窗体,无需更改。这通常是一种更灵活的方法,并且当您的用户控件本质上更通用并且将在更广泛的情况下使用时才有意义。