日期:2014-05-17  浏览次数:21006 次

怎么用委托在UserControl用户控件之间传值?


我想要实现上图所示的界面!每次点击左边的树上的第三层的节点的时候,都能把第三层节点相应的属性显示在右边的网格里。
分别用的是两个用户控件。一个用户控件里放的是TreeView,另外用户控件里用的是DataGridView,每次点击左侧树的时候就把相应的一个ID传给右侧的用户控件,在数据库里查了以后显示相应的属性。

我想在左边的用户空间里写一个委托事件Update,在右边的用户控件里写好订阅这个委托的事件setNodeID用来重新使DataGridView绑定新的数据源,每次当点左边击节点的时候,在After_selected()事件里,先new一个右边的用户控件的实例,然后调用委托事件。

但是现在不能实现啊,好像没反应啊??
下面是代码:
-------------------------------------------------------
左侧用户控件的:
  private void nodeTree_AfterSelect(object sender, TreeViewEventArgs e)
  {
                /*这里得到了当前鼠标点击的节点的ID*/

    UCDataGridView ucDataGridView = new UCDataGridView();//new一个用户控件的实例

    this.Update += new EventHandler(ucDataGridView.setNodeID);//把右边用户控件的方法订阅委托事件

    Notify(nodeID);
  }

    public delegate void EventHandler(int selectedNodeID);

    public event EventHandler Update;//声明一个EventHandler类型的委托事件,名称为Update

    private int nodeID;

    public int NodeID
    {
        get { return nodeID; }
        set { this.nodeID = value; }
    }
   public void Notify(int newNodeID)//当selectedNodeID改变时,调用此方法,这个方法调用了Update这个委托事件,其分别把当前ID的值通知给另外两个控件。
   {
        nodeID = newNodeID;
   }



大家谁有更好的方法或者可以帮我找找问题的?紧急求救!




------最佳解决方案--------------------
UCDataGridView ucDataGridView = new UCDataGridView();//new一个用户控件的实例
你这里是new一个新的UserControl,根本就不是你右边那个控件,那又怎么可能更新呢
在左边的控件中定义一个引用右边控件的属性,然后在Form中把右边控件的引用传给它

------其他解决方案--------------------
引用:
UCDataGridView ucDataGridView = new UCDataGridView();//new一个用户控件的实例
你这里是new一个新的UserControl,根本就不是你右边那个控件,那又怎么可能更新呢
在左边的控件中定义一个引用右边控件的属性,然后在Form中把右边控件的引用传给它

正解!!!!
就个人理解,我觉得楼主的程序应该设计为:在窗体中订阅左边控件的事件,然后在窗体的处理程序中设置右边控件的数据源。右边的控件可以提供方法或者属性实现设置数据源。
我觉得这样才算真正降低了两个控件的耦合性
以上鄙人陋见,仅供参考
------其他解决方案--------------------
你是不是想传固定数目的值,如果想传入固定数目可以用string【】和arraylist的组合
Arraylist arraylist=new Arraylist();
Add方法加只,remove方法去值,
每次对string【】数组赋值时都要初始化
然后遍历arraylist对string【】数组赋值
------其他解决方案--------------------
之前有个人问了几乎一样的问题,我做了比较详细的回答。

这次不重复了,
http://bbs.csdn.net/topics/390284294
------其他解决方案--------------------
自己申明一个事件,然后在需要传值的那个类里面注册这个事件
------其他解决方案--------------------
引用:
之前有个人问了几乎一样的问题,我做了比较详细的回答。

这次不重复了, http://bbs.csdn.net/topics/390284294


下面是你以前回答别人的那个答案:
----------------------------------------------------
你应该这么设计:控件1定义一个TextBoxValueSubmitted事件,当用户点击其中的按钮的时候触发。控件本身不应该知道触发了事件外部谁关心它,也不必知道外部接到通知该做什么,它只负责按了按钮就触发这个事件把消息传出去就行了。

控件2应该有一个TextBoxValue属性,外部可以通过它设置文本框的值。同样的道理,这个控件不应该知道为什么这个值要被设置,也不应该知道谁在试图修改它,它只要接到调用请求,就照着做就行了。