在asp.net中使用符合xhtml规范的spliter控件

之前为了使用spliter而尝试了dojo,有一个很严重的问题,其对xhtml规范支持得不好,使用时必须去掉xhtml的声明,这样一来,某些ms ajax control toolkit将无法正常使用。为了寻求更好的方法,我一直没有放弃,最近终于找到了这样一个spliter控件,它能支持xhtml,并且使用起来也很方便,接下来介绍其使用方法。

我的布局是经典的左侧treeview,右侧gridview,两者皆放在updatePanel中,然后再放入div搭建的页面结构。
在asp.net中使用符合xhtml规范的spliter控件
首先是aspx的代码:
在asp.net中使用符合xhtml规范的spliter控件        <div id="pagebody">
在asp.net中使用符合xhtml规范的spliter控件            
<div id="sidebar">
在asp.net中使用符合xhtml规范的spliter控件                
<%--左侧栏--%>             
在asp.net中使用符合xhtml规范的spliter控件            
</div>
在asp.net中使用符合xhtml规范的spliter控件            
<div id="spliter"></div>
在asp.net中使用符合xhtml规范的spliter控件            
<div id="mainbody">
在asp.net中使用符合xhtml规范的spliter控件                
<%--右侧栏--%>
在asp.net中使用符合xhtml规范的spliter控件            
</div>        
在asp.net中使用符合xhtml规范的spliter控件        
</div>
在asp.net中使用符合xhtml规范的spliter控件 
在asp.net中使用符合xhtml规范的spliter控件        
<div>            
在asp.net中使用符合xhtml规范的spliter控件            
<input id="splitWidth" value="250px" />
在asp.net中使用符合xhtml规范的spliter控件        
</div>
在asp.net中使用符合xhtml规范的spliter控件        
<VwdCms:SplitterBar runat="server" ID="SplitterBar2" 
在asp.net中使用符合xhtml规范的spliter控件            LeftResizeTargets
="sidebar" 
在asp.net中使用符合xhtml规范的spliter控件            MinWidth
="0" 
在asp.net中使用符合xhtml规范的spliter控件            MaxWidth
="500"        
在asp.net中使用符合xhtml规范的spliter控件            BackgroundColor
="lightsteelblue" 
在asp.net中使用符合xhtml规范的spliter控件            BackgroundColorLimit
="firebrick"
在asp.net中使用符合xhtml规范的spliter控件            BackgroundColorHilite
="steelblue"
在asp.net中使用符合xhtml规范的spliter控件            BackgroundColorResizing
="purple"
在asp.net中使用符合xhtml规范的spliter控件            SaveWidthToElement
="splitWidth"
在asp.net中使用符合xhtml规范的spliter控件            OnResize
="splitterOnResize"       
在asp.net中使用符合xhtml规范的spliter控件            style
="background-image:url(image/vsplitter.gif);
在asp.net中使用符合xhtml规范的spliter控件                background-position:center center;
在asp.net中使用符合xhtml规范的spliter控件                background-repeat:no-repeat;"
/>     
然后是相应的css代码
在asp.net中使用符合xhtml规范的spliter控件#pagebody
在asp.net中使用符合xhtml规范的spliter控件在asp.net中使用符合xhtml规范的spliter控件
{在asp.net中使用符合xhtml规范的spliter控件}{
在asp.net中使用符合xhtml规范的spliter控件    width
: 100%;
在asp.net中使用符合xhtml规范的spliter控件    height
: 100%;
在asp.net中使用符合xhtml规范的spliter控件    border
:solid 1px #6699CC;
在asp.net中使用符合xhtml规范的spliter控件
}

在asp.net中使用符合xhtml规范的spliter控件#sidebar
在asp.net中使用符合xhtml规范的spliter控件在asp.net中使用符合xhtml规范的spliter控件
{在asp.net中使用符合xhtml规范的spliter控件}{
在asp.net中使用符合xhtml规范的spliter控件在asp.net中使用符合xhtml规范的spliter控件    
/**//*width:169px;*/
在asp.net中使用符合xhtml规范的spliter控件    width
:300px;
在asp.net中使用符合xhtml规范的spliter控件    height
:500px;
在asp.net中使用符合xhtml规范的spliter控件    overflow
:auto;
在asp.net中使用符合xhtml规范的spliter控件    clear
:left;
在asp.net中使用符合xhtml规范的spliter控件    float
:left;
在asp.net中使用符合xhtml规范的spliter控件
}

在asp.net中使用符合xhtml规范的spliter控件#spliter
在asp.net中使用符合xhtml规范的spliter控件在asp.net中使用符合xhtml规范的spliter控件
{在asp.net中使用符合xhtml规范的spliter控件}{    
在asp.net中使用符合xhtml规范的spliter控件    width
:6px;
在asp.net中使用符合xhtml规范的spliter控件    height
:500px;
在asp.net中使用符合xhtml规范的spliter控件    background-color
:#6699CC;
在asp.net中使用符合xhtml规范的spliter控件    float
:left;
在asp.net中使用符合xhtml规范的spliter控件
}

在asp.net中使用符合xhtml规范的spliter控件#mainbody
在asp.net中使用符合xhtml规范的spliter控件在asp.net中使用符合xhtml规范的spliter控件
{在asp.net中使用符合xhtml规范的spliter控件}{    
在asp.net中使用符合xhtml规范的spliter控件    height
:500px;
在asp.net中使用符合xhtml规范的spliter控件    overflow
:auto;
在asp.net中使用符合xhtml规范的spliter控件    float
:left;
在asp.net中使用符合xhtml规范的spliter控件    clear
:right;    
在asp.net中使用符合xhtml规范的spliter控件
}
需要拷贝以下三个文件到你的目录
  1. /App_Code/SplitterBar.cs (注意是App_Code目录,而不是App_Data目录)
  2. /image/VwdCmsSplitterBar.js
  3. /image/vsplitter.gif

然后在head段添加js,包含引入其js文件及一个更改spliter大小后的事件的响应

在asp.net中使用符合xhtml规范的spliter控件<head runat="server">
在asp.net中使用符合xhtml规范的spliter控件    
<title>PMX Web Edition BETA 0.4.0708</title>
在asp.net中使用符合xhtml规范的spliter控件    
<link href="StyleSheet.css" rel="stylesheet" type="text/css" />
在asp.net中使用符合xhtml规范的spliter控件    
<script src="js/VwdCmsSplitterBar.js" type="text/javascript"></script>
在asp.net中使用符合xhtml规范的spliter控件在asp.net中使用符合xhtml规范的spliter控件    
<script language="javascript" type="text/javascript">在asp.net中使用符合xhtml规范的spliter控件
在asp.net中使用符合xhtml规范的spliter控件        
function splitterOnResize(width)
在asp.net中使用符合xhtml规范的spliter控件在asp.net中使用符合xhtml规范的spliter控件        
在asp.net中使用符合xhtml规范的spliter控件{
在asp.net中使用符合xhtml规范的spliter控件            
// do any other work that needs to happen when the 
在asp.net中使用符合xhtml规范的spliter控件
            // splitter resizes. this is a good place to handle 
在asp.net中使用符合xhtml规范的spliter控件
            // any complex resizing rules, etc.
在asp.net中使用符合xhtml规范的spliter控件

在asp.net中使用符合xhtml规范的spliter控件            
// make sure the width is in number format
在asp.net中使用符合xhtml规范的spliter控件
            if (typeof width == "string")
在asp.net中使用符合xhtml规范的spliter控件在asp.net中使用符合xhtml规范的spliter控件            
在asp.net中使用符合xhtml规范的spliter控件{
在asp.net中使用符合xhtml规范的spliter控件                width 
= new Number(width.replace("px",""));
在asp.net中使用符合xhtml规范的spliter控件            }

在asp.net中使用符合xhtml规范的spliter控件
在asp.net中使用符合xhtml规范的spliter控件            
// now do something在asp.net中使用符合xhtml规范的spliter控件
在asp.net中使用符合xhtml规范的spliter控件
        }
        
在asp.net中使用符合xhtml规范的spliter控件    
</script>    
在asp.net中使用符合xhtml规范的spliter控件
</head>
然后更新web.config文件的system.web段,引入控件使用的VwdCms命名空间
在asp.net中使用符合xhtml规范的spliter控件    <pages>
在asp.net中使用符合xhtml规范的spliter控件        
<controls>
在asp.net中使用符合xhtml规范的spliter控件            
<add tagPrefix="VwdCms" namespace="VwdCms"/> 
在asp.net中使用符合xhtml规范的spliter控件        
</controls>
在asp.net中使用符合xhtml规范的spliter控件    
</pages>

好了,编译一下,看看是不是大功告成了!

本文参考了http://www.codeproject.com/useritems/VwdCmsSplitterBar.asp
它的例子使用的是table而不是div,我将其改为div后发现其仍然可用,这样就满足xhtml的要求了,在顶部加上xhtml的doctype也不会像dojo那样发生问题,可以和ms的ajax控件很好的合作。

 07.08.07 补充,原来官方的例子有一个bug,onresize回调函数的方法签名应该是function splitterOnResize(sbar,width),查了源码才弄清楚为什么回调总是得不到变更后的width,顺便应用了一下ajax的自定义profile,代码为

在asp.net中使用符合xhtml规范的spliter控件        function splitterOnResize(sbar,width)
在asp.net中使用符合xhtml规范的spliter控件在asp.net中使用符合xhtml规范的spliter控件        
在asp.net中使用符合xhtml规范的spliter控件{
在asp.net中使用符合xhtml规范的spliter控件            
// do any other work that needs to happen when the 
在asp.net中使用符合xhtml规范的spliter控件
            // splitter resizes. this is a good place to handle 
在asp.net中使用符合xhtml规范的spliter控件
            // any complex resizing rules, etc.
在asp.net中使用符合xhtml规范的spliter控件

在asp.net中使用符合xhtml规范的spliter控件            
// make sure the width is in number format
在asp.net中使用符合xhtml规范的spliter控件
            if (typeof width == "string")
在asp.net中使用符合xhtml规范的spliter控件在asp.net中使用符合xhtml规范的spliter控件            
在asp.net中使用符合xhtml规范的spliter控件{
在asp.net中使用符合xhtml规范的spliter控件                width 
= new Number(width.replace("px",""));
在asp.net中使用符合xhtml规范的spliter控件            }

在asp.net中使用符合xhtml规范的spliter控件
在asp.net中使用符合xhtml规范的spliter控件            
// now do something在asp.net中使用符合xhtml规范的spliter控件
在asp.net中使用符合xhtml规范的spliter控件
            
在asp.net中使用符合xhtml规范的spliter控件            Sys.Services.ProfileService.properties.SidebarWidth
=width;            
在asp.net中使用符合xhtml规范的spliter控件            Sys.Services.ProfileService.save();
在asp.net中使用符合xhtml规范的spliter控件        }
07.10.20补充,在经过一段时间的探索后,终于明白了原作者为什么会选择使用table而非div作为例子,因为ff中,不指定divR的宽度,允许其自适应浏览器的宽度后,其子元素必须指定具体宽度,而无法做到自适应了,当希望子元素宽度和divR一致,使用100%作为宽度值时,其百分比的参照物为浏览器而非其父元素即divR,因为父元素没有被指定宽度。为了避免严重错位的情况发生,推荐大家也使用table。
 
在asp.net中使用符合xhtml规范的spliter控件<table id="pagebody" style="width:100%;height:500px;border:solid 1px #6699CC;overflow:auto;">
在asp.net中使用符合xhtml规范的spliter控件            
<tr style="height:500px;overflow:auto;">
在asp.net中使用符合xhtml规范的spliter控件                
<td id="sidebar" align="left" valign="top" style="width:300px;height:500px;overflow:auto">
在asp.net中使用符合xhtml规范的spliter控件                    
<div id="divTree1" style="width:300px;height:500px;overflow:auto;padding:0px;margin:0px;">
在asp.net中使用符合xhtml规范的spliter控件在asp.net中使用符合xhtml规范的spliter控件                     
<%在asp.net中使用符合xhtml规范的spliter控件--左侧栏--%>
在asp.net中使用符合xhtml规范的spliter控件                    
</div>
在asp.net中使用符合xhtml规范的spliter控件                
</td>                
在asp.net中使用符合xhtml规范的spliter控件                
<td id="spliter" style="height:500px;width:1px;background-color:#6699CC;"></td>
在asp.net中使用符合xhtml规范的spliter控件           
在asp.net中使用符合xhtml规范的spliter控件                
<td id="mainbody" align="left" valign="top" style="height:500px;overflow:auto">
在asp.net中使用符合xhtml规范的spliter控件                    
<div style="height:500px;overflow:auto;padding:0px;margin:0px;">
在asp.net中使用符合xhtml规范的spliter控件在asp.net中使用符合xhtml规范的spliter控件                     
<%在asp.net中使用符合xhtml规范的spliter控件--右侧栏--%>
在asp.net中使用符合xhtml规范的spliter控件                    
</div>
在asp.net中使用符合xhtml规范的spliter控件                
</td>
在asp.net中使用符合xhtml规范的spliter控件            
</tr>
</table>在asp.net中使用符合xhtml规范的spliter控件

转载于:https://www.cnblogs.com/doraeimo/archive/2007/07/21/826639.html