界面截图

点击左侧“日志管理”,在右侧IFrame中载入./admin/log.aspx:

选择错误级别即更新Grid:

在TwinTriggerBox中输入需要查询的关键词,回车或点击查询按钮,则更新Grid,同时显示搜索按钮前面的取消搜索按钮:

AppBox不仅仅是功能的实现

AppBox不仅仅是使用ExtAspNet来完成某项功能,我们还融入了很多用户易用性方面的考虑,
比如外面的Panel和里面Panel的间距,Form中控件距离右侧的距离,对话框在父页面弹出,表单已经修改提醒等等。
最终呈现在用户面前的是一个近乎完美的页面,这也是我们的追求。

细心的读者可能会发现这个常见的列表页面居然没有“查询”按钮,甚至连开始时间和结束时间也浓缩到一个下拉列表中:

这里面有一些设计查询条件时的考虑:
1. 查询条件要尽量浓缩,只保留最常用的,以一行查询条件为最佳(不超过4个)。
2. 如果需要在多个字段中查询关键字,可以在TwinTriggerBox通过(在字段一或者字段二中查询)的方式来实现。
3. 一般只能以TwinTriggerBox和DropDownList(AutoPostback)形式存在的查询条件,不出现“查询”按钮。

上面的设计原则应该可以覆盖80%的应用场景,并且这样的设计不仅可以保持页面的清爽,而且方便了用户操作。

布局,漂亮的布局

一个恰当的布局能够使你的页面美观大方,可以适应窗口的大小变化,并且不会出现指定像素数导致的1px或者2px的空白。
先省略到其他标签定义,只关注布局的定义:

    <ext:PageManager ID="PageManager1" AutoSizePanelID="Panel1" runat="server" /><ext:Panel ID="Panel1" runat="server" BodyPadding="5px" EnableLargeHeader="false"EnableBackgroundColor="true" ShowBorder="false" Layout="Anchor" ShowHeader="true"Title="日志管理"><Items><ext:Form ID="Form2" runat="server" Height="36px" BodyPadding="5px" ShowHeader="false"ShowBorder="false" EnableBackgroundColor="true"></ext:Form><ext:Grid ID="Grid1" runat="server" AnchorValue="100% -36px" ShowBorder="true" ShowHeader="false"EnableCheckBoxSelect="true" EnableRowNumber="true" DataKeyNames="Logid" AllowSorting="true"OnSort="Grid1_Sort" AllowPaging="true" IsDatabasePaging="true" OnPageIndexChange="Grid1_PageIndexChange"></ext:Grid></Items></ext:Panel>

简单来看,就是外层一个Panel,里面两个Panel(一个Form,一个Grid),

然后在外层指定Layout="Anchor",为Grid指定AnchorValue="100% -36px"(意思是Grid宽度100%,距离下边界36px):

再设定Form的高度为36px,相应的Grid就被挤下去了,形成了如下的布局:

这个就是Anchor布局的含义,很多开发人员在使用ExtAspNet一段时间后还是没弄明白Anchor的意思,不知道这两个丑丑的手绘图是否能让你明白,呵呵。

为什么是36px呢?为什么不是37呢?

这是很多人想问的问题对吧,为什么那个Form要设置高度为36px呢?我说出原因,大家不要吐哦
...
...
...
...
...
...
...
...
那是因为我计算出来的$#%……%@&¥#%#¥@%&……%……

首先我拿Firebug测量Form每行的高度是26px,再加上面和下面5px的内边距,就得到:
26px + 5px + 5px = 36px

虽然这不是一种好办法,不过至少目前能工作,就先这样了。等我想到好的办法再告诉大家。

Form标签的定义

    <ext:Form ID="Form2" runat="server" Height="36px" BodyPadding="5px" ShowHeader="false"ShowBorder="false" EnableBackgroundColor="true"><Rows><ext:FormRow ID="FormRow1" runat="server"><Items><ext:TwinTriggerBox ID="ttbSearchMessage" runat="server" ShowLabel="false" EmptyText="在错误信息中搜索"Trigger1Icon="Clear" Trigger2Icon="Search" ShowTrigger1="false" OnTrigger2Click="ttbSearchMessage_Trigger2Click"OnTrigger1Click="ttbSearchMessage_Trigger1Click"></ext:TwinTriggerBox><ext:DropDownList ID="ddlSearchLevel" runat="server" Label="错误级别" AutoPostBack="true"OnSelectedIndexChanged="ddlSearchLevel_SelectedIndexChanged"><ext:ListItem Text="全部" Value="ALL" Selected="true" /><ext:ListItem Text="INFO" Value="INFO" /><ext:ListItem Text="DEBUG" Value="DEBUG" /><ext:ListItem Text="WARN" Value="WARN" /><ext:ListItem Text="ERROR" Value="ERROR" /><ext:ListItem Text="FATAL" Value="FATAL" /></ext:DropDownList><ext:DropDownList ID="ddlSearchRange" runat="server" Label="搜索范围" AutoPostBack="true"OnSelectedIndexChanged="ddlSearchRange_SelectedIndexChanged"><ext:ListItem Text="全部" Value="ALL" /><ext:ListItem Text="今天" Value="TODAY" Selected="true" /><ext:ListItem Text="最近三天" Value="LAST3DAYS" /><ext:ListItem Text="最近七天" Value="LAST7DAYS" /><ext:ListItem Text="最近一个月" Value="LASTMONTH" /><ext:ListItem Text="最近一年" Value="LASTYEAR" /></ext:DropDownList></Items></ext:FormRow></Rows></ext:Form>

两个DropDownList都很好理解了,我们来重点看看TwinTriggerBox。
顾名思义,TwinTriggerBox就是有两个(Twin)Trigger的TextBox,我们需要手工指定这两个Trigger分别是什么图标Trigger1Icon="Clear" Trigger2Icon="Search"。
默认不显示第一个Trigger - ShowTrigger1="false",同时注册两个Trigger的点击处理函数。

事件处理函数

    protected void ttbSearchMessage_Trigger2Click(object sender, EventArgs e){ttbSearchMessage.ShowTrigger1 = true;BindGrid();}protected void ttbSearchMessage_Trigger1Click(object sender, EventArgs e){ttbSearchMessage.Text = String.Empty;ttbSearchMessage.ShowTrigger1 = false;BindGrid();}protected void ddlSearchLevel_SelectedIndexChanged(object sender, EventArgs e){BindGrid();}protected void ddlSearchRange_SelectedIndexChanged(object sender, EventArgs e){BindGrid();}

其实也很简单了,点击Trigger2时显示Trigger1,通过查询数据绑定Grid。
点击Trigger1时(也即是清空查询条件),隐藏Trigger1,同时情况此TwinTriggerBox的文本框,并查询数据绑定Grid。

下一章,我们会继续介绍日志管理模块,主要是Grid的数据库分页,排序,批量删除,查看等功能(同时你将感受到SubSonic的强大)。

下载全部源代码

ExtAspNet应用技巧(十九) - 日志管理相关推荐

  1. 第二十九章 管理许可(二)

    文章目录 第二十九章 管理许可(二) 激活许可证密钥 更新许可证密钥 许可证故障排除 Administrator Terminal Session Administrator Session on W ...

  2. Eclipse用法和技巧十九:eclipse修改workspace

    工作中某一个项目的文件一般都在某一个路径,大多数人都习惯固定eclipse的workspace.不过偶尔也有点别的,比如做一个大项目中穿插着做些OJ,或者别的--这个时候当然可以选择在安装一个ecli ...

  3. CorelDraw绘图技巧十九招

    在CorelDraw绘图中我们会经常碰到一些问题,我们来看看针对它们的解决方法,附带介绍一些实用技巧. 1. 保证平滑渐变 当你在CorelDraw8中创造渐变时,获得平滑的中间形状的最好方法是以渐变 ...

  4. 嵌入式Linux驱动笔记(二十九)------内存管理之伙伴算法(Buddy)分析

    你好!这里是风筝的博客, 欢迎和我一起交流. 我们知道,在一个通用操作系统里,频繁申请内存释放内存都会出现一个非常著名的内存管理问题:内存碎片. 学过操作系统的都知道,有很多行之有效的方法(比如:记录 ...

  5. Mac OS使用技巧十九:Safari碉堡功能之二查看网页源代码

         由于大三下的时候选修了搜索技术.了解了网络上搜索引擎和网络爬虫的信息扒取的一些东西,后来我们做了一个比較水的东西.就是仅仅扒取了几家较大的下载站点几十个软件的评分下载量等信息,当用户输入一个 ...

  6. Mac OS使用技巧十九:Safari碉堡功能之二查看网页源码

         因为大三下的时候选修了搜索技术,了解了网络上搜索引擎和网络爬虫的信息扒取的一些东西,后来我们做了一个比较水的东西,就是只扒取了几家较大的下载网站几十个软件的评分下载量等信息,当用户输入一个程 ...

  7. 玩Google有妙法:使用技巧十九招(转自计世网)

    在输入多个词的时候,Google默认的是并且式的查询,如果想使用或者式的查询,使用OR,例如:java OR c++ google是不区分大小写的,搜索Java和搜索JAVA或者java是完全一样的. ...

  8. Eclipse用法和技巧十八:减少不必要的输入

    写代码的时候,很多人都有一个原则,尽量上输入.依靠IDE自动生成的代码,一般可读性,排版什么的都还是不错的,最主要的一般不会有什么低级错误.今天介绍几个在eclipse环境中,常用的依靠eclipse ...

  9. 第十九章——使用资源调控器管理资源(2)——使用T-SQL配置资源调控器

    第十九章--使用资源调控器管理资源(2)--使用T-SQL配置资源调控器 原文: 第十九章--使用资源调控器管理资源(2)--使用T-SQL配置资源调控器 前言: 在前一章已经演示了如何使用SSMS来 ...

最新文章

  1. 东华计算机学院常珊,常姗 - 东华大学 - 计算机科学与技术学院
  2. 做为前端开发者,你应该要懂的 http协议
  3. python控制电机_树莓派Python控制步进电机
  4. 「C++」C++ Primer Plus 笔记:第二章 开始学习C++
  5. Java Swing编程:JTable表格
  6. 自定义Chrome 滚动条样式
  7. ACM PKU 2663 Tri Tiling http://acm.pku.edu.cn/JudgeOnline/problem?id=2663
  8. 位数问题(信息学奥赛一本通-T1313)
  9. java服务器与客户端项目,Java项目中用于服务器和客户端软件包的共...
  10. Java_接口练习题
  11. 大量监控视频如何存储?
  12. 利用PPT制作PNG透明图片
  13. 电脑实用技巧:给大家推荐5种低成本笔记本散热方式
  14. 题目 A : 勇士传说
  15. 小蓝本 第一本 《因式分解技巧》 第七章 综合运用 笔记 (第七天)
  16. win10计算机左边栏,教你把win10任务栏透明设置
  17. 解决nrm ls命令没有*(星号)的问题
  18. DevExpress----破解补丁
  19. 通过IDEA打个可执行的jar包
  20. 河大计算机2015年招生计划,河南大学招生计划

热门文章

  1. jsp、freemarker、velocity区别
  2. injectionForXcode代码注入步骤
  3. 自动化测试基础篇--Selenium框架设计(POM)
  4. workflow4.0学习资料
  5. UVa 412 - Pi
  6. 关于版本控制工具GitHub安装报错
  7. 安装Live communication server 2005存档服务
  8. django_models_关系一对多
  9. Webpack学习-工作原理(上)
  10. web压力测试工具ab安装及使用