您的位置:程序门 -> .net技术 -> vb.net



100分求解:如何屏蔽vb2005中treeview控件的afterselect事件?????


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


100分求解:如何屏蔽vb2005中treeview控件的afterselect事件?????[已结贴,结贴人:sdzzxuyawei]
发表于:2007-04-30 02:39:44 楼主
当选择了一个treeview控件的焦点时就会触发afterselect事件,那么如果我想点击treeview控件中其它焦点,但又不想触发afterselect事件的话应该用什么语句来实现呢??   请高手指点!
发表于:2007-04-30 08:51:081楼 得分:0
如何确定您是否想要触发呢。是第一次触发,后面都不触发么?还是怎样?
发表于:2007-04-30 08:55:572楼 得分:0
屏蔽afterselect事件可不是个好的想法,你最好把你最终想实现的功能或效果说一下,然后说明你的思路
如果有其他方式能实现的话,就不要抓住这一条路不放了
发表于:2007-04-30 08:57:083楼 得分:0
同意ls。
发表于:2007-04-30 09:02:314楼 得分:0
我想知道有什么类似开关的语句可以控制afterselect事件是否响应触发,这样我方便控制treeview在后台初始化时不响应afterselect事件,等初始化控件节点内容后再允许它响应afterselect事件.   哪位高手可以指点啊?   偶给100分,在线等!
发表于:2007-04-30 09:05:475楼 得分:0
你可以在treeview的beforeselect事件里通过事件参数e.cancel=true来取消选中这个节点,这样取消后treeview就不会发生afterselect事件了,当然节点也会选不中的.
发表于:2007-04-30 09:06:396楼 得分:0
如果你可以知道什么不要使用afterselect事件的话,你也可以通过事件注销来把这个afterselect事件注销掉.
发表于:2007-04-30 09:06:577楼 得分:0
vb中不加这个事件即可啊
发表于:2007-04-30 09:08:278楼 得分:0
你可以在treeview的beforeselect事件里通过事件参数e.cancel=true来取消选中这个节点,这样取消后treeview就不会发生afterselect事件了,当然节点也会选不中的.

up
发表于:2007-04-30 09:18:419楼 得分:0
你可以跟据条件在事件里对不要执行的事件进行注册或注销,比如:

private   sub   treeview1_beforeselect(byval   sender   as   object,   byval   e   as   treeviewcanceleventargs)
        '注销事件
        removehandler   me.treeview1.afterselect,   new   treevieweventhandler(addressof   me.treeview1_afterselect)
        '注册事件
        addhandler   me.treeview1.afterselect,   new   treevieweventhandler(addressof   me.treeview1_afterselect)
end   sub

 
发表于:2007-04-30 09:35:1710楼 得分:0
那么这段代码写在窗体的load事件里可以使用吗?
发表于:2007-04-30 09:43:5611楼 得分:0
可以。
发表于:2007-04-30 09:47:1812楼 得分:0
意思是你可以动态的对事注册或注销,写到哪里是你的代码上的逻辑了.
发表于:2007-04-30 10:19:0413楼 得分:0
我试过了,把

removehandler   me.treeview1.afterselect,   new   treevieweventhandler(addressof   me.treeview1_afterselect)

这句放在load事件里没起作用啊!....但是放在单独的按键代码里就可以,为什么啊????
发表于:2007-04-30 10:32:1914楼 得分:0
着急啊!诸位高手可否加我qq教我啊?   qq:29127819
发表于:2007-04-30 10:47:5315楼 得分:0
楼主你看清楚了removehandler   这个单词,很明显,这个是用来移除现有的已注册的事件的,
你只有在合适的时候调用removehandler   及addhandler方法才能适合到你的程序.不是说用一次就可以了.
发表于:2007-04-30 10:51:0816楼 得分:0
我想你的意思是不是这样
假设a树下面是a1,a2,你点a就展开a1   a2,既然不afterselect那对应的b,假如是datagrid应该不起什么变化
你试着把那个afterselect写在datagrid里面,而不写在树里面这样树就没有这个afterselect属性了,不知道你要的效果是什么东西
如果你不想要这个afterselect理论上你别写不就行了~~~
发表于:2007-04-30 11:17:4417楼 得分:0
我是意图是这样的,窗口加载时就开始读数据库将内容添加到treeview中,我的程序牵扯到添加时需同时对树进行遍历并使指定的节点得到节点。这就使窗体的load过程中就已经触发了treeview.afterselect事件,但是,我已经在该事件中添加了代码,用于根据treeview中有焦点的节点名来访问另外一个数据库。我的问题偏偏就是,我不想让窗体在load过程中就触发treeview.afterselect事件,我只想在窗体装入后再使treeview.afterselect事件接受触发。

所以,我需要在窗体load前关闭treeview对事件afterselect的响应,而在窗体load之后打开它。

各位前辈,帮偶想想办法!
发表于:2007-04-30 11:22:2618楼 得分:0
哎,楼主啊,你早这么说不就解决了吗?

你不要在窗体设计的时候给treeview添加这个事件,而是在窗体load事件中动态的给treeview添加这个事件,如下:


protected   overrides   sub   onload(byval   e   as   system.eventargs)
        mybase.onload(e)
        addhandler   me.treeview1.afterselect,   new   treevieweventhandler(addressof   me.treeview1_afterselect)
end   sub
发表于:2007-04-30 11:24:3619楼 得分:0
其实思路是这样的,当你加载数据的时候为了不响应afterselect事件,你就不要添加这个事件,而是当你把treeview加载数据完成后再手动的添加上这个事件就ok了!

不要把所有的设计事情都要在窗体的设计时完成,在合适的时候调用合适的代码才是程序的逻辑!
发表于:2007-04-30 13:44:4120楼 得分:60
1.声明一个整型变量i
2.load载入事件中赋值为0
3.点击treeview时赋值为1
4.afterselect事件方法中判断:
if   i   =   1   then
事件方法()
end   if
发表于:2007-04-30 14:07:4521楼 得分:0
问题终于解决了,根据楼上网友bitcoffee的启发,我用了更简单的办法:

1.   声明窗体内全局变量   pas   as   boolean   =   false
2.   窗体load过程先写treeview处理程序 最后一行为:   pas=true
3.   afterselect事件代码就三行:if   pas   then   call   我的过程()   endif

实现本人需求,非常感谢网友bitcoffee   向你至敬!同时感谢网友hbxtlhx热情相助,虽然没有采用,但你的方案比较高深,在一些特别的程序算法下更加适用。
发表于:2007-04-30 14:17:5722楼 得分:0
唉...
道理不很简单吗.
发表于:2007-04-30 14:19:2123楼 得分:25
并且把事件注销了再操作从效率上也是高的啊,如果用标志来操作,每次都要去判断,比注销掉要慢多了.
发表于:2007-04-30 14:49:5924楼 得分:15
public   sub   new()

                '   此调用是   windows   窗体设计器所必需的。
                initializecomponent()

                '修改你要注消的事件↓                           '修改你要注消的事件过程名↓
                  removehandler   labetexbox1.smouseup,   addressof   labetexbox1_smouseup   '注消事件

                '   在   initializecomponent()   调用之后添加任何初始化。

        end   sub

............

'在你需要这事件的过程,添加
               
                '修改你要注消的事件↓                           '修改你要注消的事件过程名↓
                  addhandler   labetexbox1.smouseup,   addressof   labetexbox1_smouseup


private   sub   labetexbox1_smouseup(byval   sender   as   object,   _
                                                                  byval   e   as   system.eventargs)     _
                                                                  handles   labetexbox1.smouseup

'此事件必需出现在代码中

end   sub

发表于:2007-04-30 14:57:2825楼 得分:0
还好我的数据库记录不会太多,用标志判断的方法做做也无妨,毕竟简直嘛.如果数据量大了,当然就自考虑用屏蔽事件触发的方式了.
发表于:2007-04-30 15:04:5226楼 得分:0
偶要结贴了,现在给分,谢谢各位.


快速检索

最新资讯
热门点击