4.9 用户界面的设计和实现(DIV+CSS,可编辑的TreeView用户控件)

4.9.1 Div+Css布局

任何系统都要和最终的用户交互才能体现它的价值。在线考试系统也不例外。因为本系统是基于web的系统因此系统和用户交互的就是通过html来完成的。因为界面的设计需要布局和美化。下面我们介绍下本系统是如何利用div+css来给用户界面布局和美化的。下图4-19展示了系统的大致布局。


图4-19 整体布局

如图4.20所示。该布局分四大块。上面是标题显示部分。中间分两部分。左边是菜单栏。右边是内容区域。最下面是版权信息部分。下面看看上图html代码和css代码


< html >
< head >
< title > 无标题文档 </ title >
< link  href ="style.css"  rel ="stylesheet"  type ="text/css"   />
</ head >
< body >
< div  id ="head" > 在线考试系统 </ div >
< div  id ="main" >
< div  id ="menu" > 菜单栏 </ div >
< div  id ="content" > 内容区域 </ div >
</ div >
< div  id ="bottom" > 版权所有 2008 </ div >
</ body >
</ html >

下面是css文件的代码
body
{} {
    margin
:0px;
    padding
:0px; 
    text-align
:center; 
    font-size
:40px;
}

#head 
{} {
   width
:100%;
   height
:80px;
   background-color
:#3399CC;
   color
:#FFFFFF;
}

#main
{} {
    width
:100%;
    height
:480px;
}

#menu
{} {
    width
:10%;
    height
:100%;
    float
:left;
    background-color
:#33CCCC;
}

#content
{} {
    width
:90%;
    height
:100%;
    float
:right;
    background-color
:#CCCCCC;
}

#bottom
{} {
    width
:100%;
    height
:60px;
    background-color
:#CCFF00;
}

利用cssdiv布局不但网页代码比用table布局看起来更加的容易理解。而且也更简洁。我们通过css文件和html分离很好的分离了内容和样式。让整个站点修改样式更加的简单。

4.9.2可编辑的树形控件






在本系统中还实现了一个自定义的树形控件。由于Asp.net2.0 中的TreeView 控件是无法进行编辑, 添加和删除节点的。为了能够使用用户更加的方便的管理某一科目的章节。系统提供了以树形结构显示章节的功能。并且可以在树形结构上通过右键菜单添加,删除,修改章节节点。如图4-20 所示。

图4-20 可编辑树形菜单

自定义控件是在Asp.net 2.0 TreeView控件的基础上实现的。通过查看TreeView控件生成的html代码发现Text 属性为子结点TreeNode生成的html代码如下所示

<a class="TreeView1_0"

   href="javascript:__doPostBack('TreeView1','s1""2')"

   οnclick="TreeView_SelectNode(TreeView1_Data, this,'TreeView1t1');"

   id="TreeView1t1">

子结点

</a>

其中Text属性的值会显示在链接标记内。而且如果将带有html标记的字符串赋给TreeNodeText属性,TreeView会不加修改的添加到<a>中。比如Text=” <b>子结点</b>”,会呈现如下html代码

<a class="TreeView1_0"

 href="javascript:__doPostBack('TreeView1','s1""2')" οnclick="TreeView_SelectNode(TreeView1_Data, this,'TreeView1t1');"

id="TreeView1t1">

<b>子结点</b>

</a>

就是利用TreeView这一特点,可以实现让TreeView节点表现出可编辑的状态。比如可以直接把input标记赋值给TreeNodeText属性。下图4-21是将TreeNodeText属性设为”<input type=’text’ value=’子结点’/>”的效果






图4-21 节点显示效果

这样就可以编辑添加新的节点了。下面介绍树形控件是如何触发运行保存,编辑,删除,添加节点代码的。由于页面是在浏览器中呈现的。而添加,删除章节代码却放在服务器端。如何才能在浏览器中触发执行服务器端的处理函数那?下面先分析下Asp.net的事件回传机制。在浏览器中只能通过javascript来捕获用户操作。比如点击按钮。移动鼠标等动作。当然在IE中也可以用vbscript ,但是javascript还是在浏览器中占统治地位的脚本语言。所以Asp.net在浏览器中捕获用户操作事件也是用javascript来实现的。Asp.net首先通过脚本在浏览器中捕获触发事件,然后用隐藏字段来记录触发事件的控件Id和相关的参数信息。最后再通过Post请求进一步将处理交给服务器端。服务器端接收到Post请求。通过读取隐藏字段中控件的Id和事件参数来调用相应的事件处理函数。下面举个简单的例子来说明这个过程。

先新建一个aspx页面然后添加一个LinkButton一个Label代码如下

    <form id="form1" runat="server">

    <div>

        <asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkButton1_Click">LinkButton</asp:LinkButton>

 

        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label></div>

</form>

按钮的处理函数如下

    protected void LinkButton1_Click(object sender, EventArgs e)

    {

        Label1.Text = "LinkButton1 is clicked !";

}

该页面生成的html代码如下

< body >
    
< form  name ="form1"  method ="post"  action ="Default2.aspx"  id ="form1" >
< div >
< input  type ="hidden"  name ="__EVENTTARGET"  id ="__EVENTTARGET"  value =""   />
< input  type ="hidden"  name ="__EVENTARGUMENT"  id ="__EVENTARGUMENT"  value =""   />
</ div >
< script  type ="text/javascript" >
//<![CDATA[
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();
    }

}

//]]>
</ script >
    
< div >
        
<
id ="LinkButton1"  href ="javascript:__doPostBack('LinkButton1','')" > LinkButton </ a >
        
< span  id ="Label1" > Label </ span ></ div >
    
< div >
</ div ></ form >
</ body >

注意下划线部分,LinkBotton在客户端的html是一个超级链接。该链接href属性是对javasciprt函数__doPostBack的调用。该函数是Asp.net自动生成的。上面有__doPostBack函数的实现。可以看出当点击LinkButton这个链接时候。就会在浏览器中运行__doPostBack函数。该函数把LinkButton1设为__EVENTTARGET隐藏字段的value。这个例子没有用到__EVENTARGUMENT隐藏字段,所以__doPostBack第二个参数设为了空。因为这个该事件不需要任何相关参数。修改了记录事件触发Id和事件相关参数后__doPostBack调用表单的submit方法开始回传。当服务器接收到回传后通过查看__EVENTTARGET隐藏表单就可以知道该调用那个处理函数了

下图4-22是我们点击LinkButton时候在服务器端事件处理函数监视__EVENTTARGET的值。

图4-22 __EVENTTARGET变量监视图

有了以上分析我们就可以为我们的控件添加自己的事件了。该控件提供了4个事件。包括添加事件。编辑事件。保存事件。删除事件。下面给出我们的具体实现

首先触发事件的链接如下

<a href="javascript:__doPostBack('Add','')">添加</a>
<a href="javascript:__doPostBack('Edit','')">
编辑</a>

<a href="javascript:__doPostBack('Delete','')">删除</a>

<a href="javascript:__doPostBack('Save','')">保存</a>

在服务器端的Page_Load处理函数里检查__EVENTTARGET的值然后就可以执行相应的处理代码了。

    protected   void  Page_Load( object  sender, EventArgs e)
    
{
        
if (Request.Form["__EVENTTARGET"!= null)
        
{
            
string action = Request.Form["__EVENTTARGET"].ToString();
            
switch (action)
            
{
                
case "Add":
                    
//do Add
                    break;
                
case "Delete":
                   
//do Delete
                    break;
                
case "Save":
                    
//do Save
                    break;
                
case "Edit":
                    
// do Edit
                    break;
            }

        }

    }

注意__doPostBack方法,只有页面上有LinkBotton等需要用脚本才能回传的控件才会自动生成。因为提交按钮是不需要通过脚本来回传的。



转载于:https://www.cnblogs.com/xhan/archive/2008/05/20/1202976.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Dreamweaver 外部插件 名称 简介 Alwaysontop 可以使弹出的窗口始终位于顶端 Browse4redirct 页面自动重定向到某个地址 Moustrail 鼠标移动带有"轨迹" windowresizer 指定窗口的分辨率 Pageborder 设定页边距 ColourDethRedirect 根据访问者的的屏幕颜色数选定相应页面 Framewizard 制作各种样式的帧结构 FrameBuster 监测是否现在在一个帧中,如果在跳出帧结构 Makemaillink 建立邮件连接 Makenewslink 建立新闻组连接 Fullscreen Opener 在新窗口中以全屏幕方式打开页面 close onblur 光标移出窗口时自动关闭该窗口 CSS on resolution 根据不同的分辨率调入相应的外部css文件 Css on platform 根据不同的操作系统调入相应的外部css文件 Css on Browser 根据不同的浏览器调入相应的外部css文件 FontTagKiller 将页面中所有的标记清除 jsonbrowser 根据不同的浏览器选择不同的js代码 Remove lines from maps IE4会在可点图激活时候显示虚线框,该命令移走这个框 Tag killer 将指定的标签从页面中清除 InsertCustom Tag 插入自定义标签 set global Var 在head标签中设置javascript的全局变量 windwo mover 将窗口移到屏幕的指定地方 dreamshow 使图片像播放幻灯一样顺序播放 Show-HideallLayers 隐藏或者显示所有的层 OpenerLocation 在新窗口中打开指定的url Flash3_detector 监测是否支持flash3 redirect 可以根据浏览器操作系统等多种条件调入相应页面 Centrewindow 自动将窗口置中 One by one(behavior+command) 在显示当前层的时候,自动隐藏前一个层 maxmizewindow 最大化窗口 Open full screen window 打开一个新的全屏幕的窗口 printcrossbrowser 弹出打印对话框 Audioembed 可以嵌入midi文件并设置为循环播放 Background_that_fit 不论怎样缩放窗口背景图片总是和窗口一样大 Basetarget 设定页面的的base URL Timestamp 为页面加上时间戳,这下最新更动时间不用每次再自己写了 guestbook-o-matic 不用cgi制作自己的留言本 quicktimeobj 插入quicktime文件 Flash3embedder 插入Flash3文件 realvideo 插入real文件 js depending on browser 根据不同的浏览器选择不同的javascript代码 Externel CSS file 插入外部的CSS文件 Externel Javascript file 插入外部的js文件 Video embed 插入activemovie windowsMaxmizer 最大化窗口   名称 简介 Reverse Timeline Reverse Timeline可以从TIMELINE的帧15倒放到帧1,但必须将其放到TIMELINE的文件夹下,否则它不会工作 Layer f(x) Behavior 这个Behavior 可以让一个层(layer)按照一个圆形、螺旋形或一些 特殊的轨迹运动。 Align Layers 这个Action的功能是让用户可以将一个layer象table一样的在屏幕上 进行竖直或水平排列对齐,同时这个插件还可以设置整个html页面的边距。 Layer Transitions 包含了12种网页中常见的层变化效果的插件,在IE和NN内都能够正常 显示。 Back to my frame 在网页中加入这个action后浏览器将会判断当前的页面是否包含在一 个帧中,如果结果为否则会自动跳转到指定的url地址。 History Go 2.0 这个Behavior的作用是在网页中增加一个“History Go”的javascri pt,从而可以实现类似于浏览器中的“前进”和“后退”按钮的功能。 Print 3.0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值