为TreeView控件添加的节点,为何在指定了NavigateUrl属性后,SelectedNodeChanged不触发了?

shenjingyao 2006-09-22 11:44:39

TreeNode tn = new TreeNode();
tn.Text = "text";
tn.Value = "value";
tn.NavigateUrl = "page.aspx";
tn.Target = "iframe1";
TreeView1.Nodes.Add(tn);

如上代码,添加的节点,为何在指定了NavigateUrl属性后,SelectedNodeChanged事件不触发了?
而不设置NavigateUrl 属性时SelectedNodeChanged事件就正常触发?这是为什么呢?我想在使网页导向连接页面的同时还要响应事件怎么解决呢?谢谢了!~
...全文
61131 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
shenjingyao 2006-09-23
  • 打赏
  • 举报
回复
up一下
jb303 2006-09-23
  • 打赏
  • 举报
回复
顶,学习,期待高手回答,我也需要解决这个问题
shenjingyao 2006-09-23
  • 打赏
  • 举报
回复
to:Knight94(愚翁)
可是TreeNode的Value属性已经被我用了?
shenjingyao 2006-09-23
  • 打赏
  • 举报
回复
今天搞了一天这个东西,累了,不搞了,getElementById方法没有调试出来,有时候调试js程序是一件比较郁闷的事情,最后依旧使用我的那个笨方法解决这个问题.

特别感谢Knight94(愚翁),牺牲了一个宝贵的周末下午来帮助我调试程序,真的不知道说什么感谢的话好!真的谢谢你!希望你工作得开心!:)

也欢迎喜欢技术话题的朋友加我qq:9296182进行讨论!再次谢谢大家的回答!
Knight94 2006-09-23
  • 打赏
  • 举报
回复
可能使我俩用的东西不一样,我用的是frame,你用的是iframe。

后者的话,需要getElementById去查找获得,然后进行修改。
shenjingyao 2006-09-23
  • 打赏
  • 举报
回复
to:Knight94(愚翁)
看了你指出的问题,我觉得也可能是我的分帧指定错误.但我试了好多次都是提示'window.parent.iframe1.location'为空或不是对象错误?

我的页面结构如下:

<html>
<body>
<iframe id=main> <!-- 主页显示面在一个帧里面 -->
<html>
<body> <!-- 这是帧里面的页面,这个页面中有TreeView和iframe1 -->

<自定义控件>TreeView</自定义控件> <!-- 点击TreeNode后,需要导向下面的iframe1帧中 -->

<iframe id=iframe1></iframe>

</body>
</html>
</iframe>
</body>
</html>

页面的结构就是上面那样,我要如何设置我的分帧呢?js调试起来感觉很不好用?
Knight94 2006-09-23
  • 打赏
  • 举报
回复
取消NavigateUrl属性设制,把它放到TreeNode的Value中,然后在js函数中处理节点的click事件进行调转。
Knight94 2006-09-23
  • 打赏
  • 举报
回复
to 然后我又尝试不设置NavigateUrl 在SelectedNodeChanged中统计完数据后,使用javascript语句打开我的网页到iframe中,但当我把 (window.frames['iframe1'].location='page.aspx';")语句写在SelectedNodeChanged 中时并不好用.

我试了一下没有什么问题,不过你注意,对于分帧的指定,
如果当前treeview所在的frame与需要改变navigate的frame属于同一层的话,需要如下进行设置
window.parent.iframe1.location.href='page.aspx';
shenjingyao 2006-09-23
  • 打赏
  • 举报
回复
我的这个TreeView控件被我写在一个自定义控件中,现在的解决办法是,设置NavigateUrl 属性,调用控件所在页面,明码传递TreeNode参数,然后使用Request取得参数值,再在页面中根据取得参数值处理业务.

只是我觉得有些不伦不类的,还是希望能够得到更好的办法!

如下代码就是我暂时解决办法:

TreeNode tn = new TreeNode();
tn.Text = "text";
tn.Value = "value";
tn.NavigateUrl = "Default.aspx?value=5"; //调用控件所在页,并且明码传递参数
tn.Target = "iframe1";
TreeView1.Nodes.Add(tn);

--------------------
获取参数传递值value.
try
{
Response.Write((string)Request["value"]);
}
catch
{
}

总的来说觉得与Knight94(愚翁)思想略似.
那么NavigateUrl 与SelectedNodeChanged不能共同使用这是TreeView控件的bug吗?
shenjingyao 2006-09-23
  • 打赏
  • 举报
回复
to:Knight94(愚翁)

是这样的,当点击这个节点后,需要统计一些数据,然后需要把指定网页导向到 指定的iframe中.

其实按我最初的想法,设置NavigateUrl 后,再使用SelectedNodeChanged来统计这些数据,但可惜这个想法不行;

然后我又尝试不设置NavigateUrl 在SelectedNodeChanged中统计完数据后,使用javascript语句打开我的网页到iframe中,但当我把(window.frames['iframe1'].location='page.aspx';")语句写在SelectedNodeChanged中时并不好用.

因为发现页面被编译完成后的html代码中会生成一个名为__doPostBack的js函数,并且它自动为你设置了theForm = document.forms['form1']这样的值,所以,使我加到后台程序中导向页面的js语句失效.这个问题有办法解决吗?

下面的代码就是没有设置NavigateUrl 属性生成的html页面代码中的一部分,其中包含了程序自动生成的路径与页面提交程序.

var theForm = document.forms['form1'];
if (!theForm) {
theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
Knight94 2006-09-23
  • 打赏
  • 举报
回复
你可以在NavigateNodeURL函数中根据node.value来决定“yourTargetFrameName, yourURL”这两个参数的值。
Knight94 2006-09-23
  • 打赏
  • 举报
回复
to 可是TreeNode的Value属性已经被我用了?

那么navigate属性和value有什么关系,如果有的话,假如从js不容易控制的话,可以在SelectedNodeChanged事件中去处理。
//selectednodechanged event
'calling a javascript function
NavigateNodeURL( yourTreeView.SelectedNode.Value);

//Generate script to node navigation
private void NavigateNodeURL( string NodeValue )
{
const string Format_Script =
@"<script language=JavaScript>
window.parent.{0}.location.href='{1}';
</Script>";

if( ! this.ClientScript.IsStartupScriptRegistered( "NodeNavigate" ) )
Page.RegisterStartupScript( "NodeNavigate" ,
string.Format( Format_Script, yourTargetFrameName, yourURL ) );
}
AFatPig 2006-09-23
  • 打赏
  • 举报
回复
up
shenjingyao 2006-09-23
  • 打赏
  • 举报
回复
观察上面的测试发现,未设置NavigateUrl 属性的节点<a>标记的 href属性等于="javascript:__doPostBack('TreeView1','svalue')" ,这应该是一个起到提交事务功能的函数;

而设置了NavigateUrl 属性的节点<a>标记中则没有调用这个__doPostBack函数,
也就是说虽然它执行了href设置的网页,但它没有调用事务提交功能的函数__doPostBack.那么就不会触发SelectedNodeChanged事件?
shenjingyao 2006-09-23
  • 打赏
  • 举报
回复
谢谢楼上兄弟回答,但似乎没有看清楚题目.

接我上面的发言,观察设置上面两种情况生成的不同的html代码可以发现:

1.设置NavigateUrl 属性的,节点<a>标记的 href="page.aspx";
onclick="javascript:TreeView_SelectNode(TreeView1_Data, this,'TreeView1t0');"

2.未 设置NavigateUrl 属性的,节点<a>标记的 href="javascript:__doPostBack('TreeView1','svalue')" ;
onclick="TreeView_SelectNode(TreeView1_Data, this,'TreeView1t0');"

可以发现两端代码的不同.

同时我对html的<a>标记进行了测试,如果<a>标记中同时设置 href,onclick属性,那么它的执行顺序是先执行onclick,再执行href.可以肯定的是href与onclick可以同时使用.

那么继续刚才的问题,为什么TreeView设置了NavigateUrl 属性后SelectedNodeChanged事件就不可用了呢??希望大家参与回答?谢谢了!
sunjiancn 2006-09-23
  • 打赏
  • 举报
回复
private void InitTree(TreeNodeCollection tns,string parentid)
{
//DataView dv=dt.DefaultView;
DataView dv=GetAllData().DefaultView;
dv.RowFilter="OverDept_Code="+"'"+parentid+"'";//dv.RowFilter=parentid+"ParentId=";
TreeNode tn;
foreach(DataRowView drv in dv)
{
tn=new TreeNode();
tn.Text=drv["Dept_Name"].ToString();
tn.ID=drv["Dept_Code"].ToString();
tn.NavigateUrl="user_info_level1.aspx?Dept_Code="+drv["Dept_Code"].ToString();
tn.Target="rightFrame2";
tns.Add(tn);
InitTree(tn.Nodes,tn.ID);
}

}
节点不多的话 一次性递归加载可以
shenjingyao 2006-09-23
  • 打赏
  • 举报
回复
做一个测试:分别将NavigateUrl 属性设置与取消设置,我们会得到不同的前台html代码,观察html代码会发现:

1.设置了NavigateUrl 属性的页面中,TreeView控把TreeNode节点翻译为:
<a class="TreeView1_0" href="page.aspx" target="iframe1" onclick="javascript:TreeView_SelectNode(TreeView1_Data, this,'TreeView1t0');" id="TreeView1t0">text</a>

2.没有设置NavigateUrl 属性的页面中,TreeView控把TreeNode节点翻译为:
<a class="TreeView1_0" href="javascript:__doPostBack('TreeView1','svalue')" onclick="TreeView_SelectNode(TreeView1_Data, this,'TreeView1t0');" id="TreeView1t0">text</a>


生成html页面控件的同时,它还为TreeView控件生成了JavaScript函数:

function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
feifeiyaqi3 2006-09-23
  • 打赏
  • 举报
回复
up

111,131

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧