首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

如何用委托在UserControl用户控件之间传值

2012-12-16 
怎么用委托在UserControl用户控件之间传值?我想要实现上图所示的界面!每次点击左边的树上的第三层的节点的

怎么用委托在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属性,外部可以通过它设置文本框的值。同样的道理,这个控件不应该知道为什么这个值要被设置,也不应该知道谁在试图修改它,它只要接到调用请求,就照着做就行了。



你的主程序应该编写一个事件处理函数,并且关联给控件1的TextBoxValueSubmitted事件,就好比你使用一个按钮而准备一个Click事件的处理函数那样。在这个处理函数中,你去调用控件2的TextBoxValue属性,设置正确的值。主程序不关心控件1的事件怎么触发,也不关心设置属性后控件2会做什么,它就是一个桥梁,把这些控件联系在一起。

-----------------------------------------------------------


我左边是一个UserControl1,里面放的是一个TreeView,右边是一个DataGridView,想要点击节点的时候右边的DataGridView能完成实时更新。我不清楚哪个是我的主程序了,这两个UserControl都放在Form1里面,现在我的主程序是Form1的构造函数还是整个程序的入口处Program.cs的Main方法??

我的这几行代码

 UCTreeView ucTreeView = new UCTreeView();
 UCDataGridView ucGridView = new UCDataGridView();
 ucTreeView.Update += new UCTreeView.EventHandler(ucGridView.getNewSource);//订阅事件

在Form1的构造函数和Main方法里分别都试过,但是都不能完成,报错了,提示之前声明的Update代理没有实例化,证明订阅事件的这个方法根本没执行啊?

求解。我对winform窗口运行的机制了解的不好。谢谢了!
[其他解释]
这两个控件什么关系?如果关系紧密,建议做成一个控件。
[其他解释]

引用:
这两个控件什么关系?如果关系紧密,建议做成一个控件。


关系不是紧密的,都有和数据库交互的部分,做成两个模块,降低耦合性啊,看了别的资料说是事件的挂载有问题,调试的时候每次都说 定义的委托为null。
[其他解释]
引用:
之前有个人问了几乎一样的问题,我做了比较详细的回答。

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


看了别的资料说是事件的挂载有问题,我调试的时候每次都说 定义的委托为null。为什么没执行呢?
[其他解释]
引用:
UCDataGridView ucDataGridView = new UCDataGridView();//new一个用户控件的实例
你这里是new一个新的UserControl,根本就不是你右边那个控件,那又怎么可能更新呢
在左边的控件中定义一个引用右边控件的属性,然后在Form中把右边控件的引用传给它


提醒我了。谢谢

热点排行