如何在表单和用户控件之间传递信息?

时间:2019-07-16 16:52:54

标签: c# visual-studio winforms user-controls windows-forms-designer

我的项目有问题。由于我不喜欢每个Windows窗体都是一个新窗口,因此我尝试使用其他方式。

这样,我确实创建了一个包含菜单并调用不同UserControl的FormGUI。由于我们只学习了如何使用Windows窗体,所以我知道如何使用它们。在那里,我将更改新Windows窗体的构造函数以传递数据。

但是这次我主要使用一个Windows窗体和不同的UserControls。

例如我有一个要添加新数据,另一个要在数据网格中显示数据,另一个要在图表内部显示数据。至少这是结果。

但是我没有找到一种方法将信息从Windows窗体传输到一个用户控件中以及如何将它们找回。为了在其他地方使用此Knowlegde。

有人知道一个教程,可以在其中看到它如何工作吗?或可以向我解释。

由于UI是最终项目的一部分,因此将被标记为我喜欢的新方式。但是,如果找不到解决方法,则需要对其进行更改,以便使用其他Windows窗体。 > _>但实际上...我不希望该应用程序为每个任务打开新窗口。我希望只在一页上显示信息。

在搜索中,我确实找到了一些有关使用Windows Form进行UI设计的教程,但只有设计(在其中放置图表只是一张图片),而不是如何与实际信息一起使用。

希望您能理解我的问题...

1 个答案:

答案 0 :(得分:0)

让我们假设表单的构造函数是这样的

private List<MyData> _data;

public MyForm(List<MyData> data)
(
    ...
    _data = data;
)

声明一个接口

public IDataAware
{
    List<MyData> Data { get; set; }
}

并让用户控件实现它。例如

public MyDataGridUserControl : UserControl
{
    ...

    public List<MyData> Data {
        get { return (List<MyData>)dataGridView1.DataSource; }
        set { dataGridView1.DataSource = value }
    }
}

如果您正在使用BindingSource,请访问BindingSource而不是网格控件。现在,您可以通过同一界面访问所有用户控件。在表单中,您可以创建一个字段

private IDataAware _dataUserControl;

在菜单项单击例程中,您可以执行以下操作

_dataUserControl = new MyDataGridUserControl();

在另一个

_dataUserControl = new MyChartUserControl();

但是所有实现IDataAware的用户控件都可以做到

Controls.Add(_dataUserControl);
_dataUserControl.Data = _data;  

注意:窗体,控件和用户控件只是任何其他类的类,您可以像使用任何c#类一样使用它们来进行所有面向对象的操作。 (但是,泛型有一些限制。)