【问题标题】:Passing data between usercontrols c#在用户控件之间传递数据c#
【发布时间】:2017-06-23 08:06:39
【问题描述】:

已知有一些与此类似的解决方案,但我无法解决我的问题。 我有两个用户控件:

  • 第一个创建一个 Report 对象。
  • 第二个显示它。

我有一个链接两个控件的主窗体。

这两个控件在 DLL 中创建,并添加到 主要形式如下:

//ADDS THE FIRST CONTROL TO THE PANEL CONTROL
  myDll.controlUserReport userControlA = new myDll.controlUserReport();
  panelControl1.Controls.Add(userControlA);
  userControlA.Dock = DockStyle.Left;

//ADDS THE SECOND CONTROL TO THE PANEL CONTROL
   myDll.controlDocViewer userControlB = new myDll.controlDocViewer();
   panelControl1.Controls.Add(userControlB);
   userControlB.Dock = DockStyle.Fill;

当我点击一个按钮时,如何将在第一个控件controlUserReport 中创建的报告对象传递给另一个用户控件controlDocViewer 以显示它?

【问题讨论】:

  • 最好的方法可能是在您的 controlUserReport 中创建一个包含 Report 对象的公共属性,并在 controlDocViewer 中创建另一个来获取它
  • cn 你改了用户控件的代码?
  • 是的,我可以@MongZhu

标签: c# winforms user-controls report


【解决方案1】:

您应该为此使用事件。在UserControlA 声明事件:

//Declare EventHandler outside of class
public delegate void MyEventHandler(object source, Report r);

public class UserControlA
{
    public event MyEventHandler OnShowReport;

    private void btnShowReport_Click(object sender, Report r)
    {
         OnShowReport?.Invoke(this, this.Report);
    }
}

在UserControlB 订阅事件并显示报告:

public class UserControlB
{
    // Do it in Form_Load or so ...
    private void init()
    {
       userControlA.OnShowReport += userControlA_OnShowReport;
    }

    private void userControlA_OnShowReport(object sender, Report r)
    {
        // Show the report
        this.ShowReport(r);
    }
}

【讨论】:

  • UserControlB 类如何知道 userControlA 的实例?
【解决方案2】:

上面的帖子很好,除了 init() 方法不应该在 ControlB 中,而是在父窗体中,如下所示:

public class frmMain : Form
{
    private void frmMain_Load(object sender, EventArgs e)        
    {
       // subscribe/glue
       userControlA.OnShowReport += userControlB.OnShowReport;
       userControlB.OnShowReport += userControlA.OnShowReport;
    }



public class UserControlA
{
    public event EventHandlerNodeCopy OnDataCopy;
    public TreeNode NodeCopied { get; set; }

    private void some_method(string z, TreeNode trn)
    {
        OnDataCopy?.Invoke(this, trn);
        ...
    }

    public void frmJsTree_OnDataCopy(object source, TreeNode tn)
    {
        NodeCopied = tn;
    }


public class UserControlB
{
    public event EventHandlerNodeCopy OnDataCopy;
    public TreeNode NodeCopied { get; set; }

    private void another_method(int i, TreeNode trn)
    {
        OnDataCopy?.Invoke(this, trn);
        ...
    }

    public void frmJsTree_OnDataCopy(object source, TreeNode tn)
    {
        NodeCopied = tn;
    }


    enter code here

【讨论】:

    【解决方案3】:

    另一种方法是使用BehaviorSubject(需要 System.Reactive)。在 BehaviorSubject 中添加 数据 后,所有订阅的地方都可以看到该信息。一个非常基本的例子:

    1. 创建一个类来表示您的数据。前任: DataService.cs
    public static BehaviorSubject<YourDataType> MyAwesomeData { get; } = new BehaviorSubject<YourDataType> (null);
    
    1. 在你 UserControlA 中(可能在按钮的 clickEvent 中)或其他:
    private void btnShowReport_Click(object sender, MouseButtonEventArgs e)
    {
      // Do some stuffs to prepare the data...
      YourDataType myDataReportPrepared = null; // something;
    
      // Here you update your DataInfo on BehaviorSubject
      DataService.MyAwesomeData.OnNext(myDataReportPrepared);
    }
    
    1. 最后,您的解决方案中在该主题中使用 subscribe 的每个地方都会监听该数据,例如在您的 UserControlB 中:
    
    // This will trigger every time MyAwesomeData.OnNext() is executed.
    DataService.MyAwesomeData.Subscribe(item =>
          {
            if (item != null){
               // Do something with it...Like populate some Datagrid...
            }
    
          });
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-07
      • 2014-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多