ExtAspNet应用技巧(二十三) - Ext4JSLint之Grid的使用

原创|其它|编辑:郝浩|2009-09-24 09:40:40.000|阅读 1359 次

概述:Ext4JSLint是使用ExtAspNet来展示JSLint-Toolkit检查结果的开源项目。 JSLint-Toolkit是一个使用Rhino和JSLint的开源项目,可以对一个文件夹中的所有JavaScript进行语法检查,并显示友好的检查结果。

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

引子

Ext4JSLint是使用ExtAspNet来展示JSLint-Toolkit检查结果的开源项目。
JSLint-Toolkit是一个使用Rhino和JSLint的开源项目,可以对一个文件夹中的所有JavaScript进行语法检查,并显示友好的检查结果。

下面是JSLint-Toolkit为JavaScript生成的错误列表:

1.[
2.    [3, 39, 20, "Expected a number and instead saw '''.", "/Expected '{' and instead saw '.+'\\./,"],
3.    [3, 39, 21, "Expected '}' and instead saw ' '.", "/Expected '{' and instead saw '.+'\\./,"],
4.    [3, 68, 18, "Be careful when making functions within a loop. Consider putting the function in a closure.", "})();"]
5.]



这是一个类似二位数组的结构,每个数组有4列,分别表示错误级别,第几行,第几列,错误信息,错误代码。


界面截图




使用SyntaxHighlighter显示JavaScript源代码

首先看下右侧IFrame中,如何使用SyntaxHighlighter来显示JavaScript源代码。

01.<html>
02.<head>
03.    <title>Untitled Page</title>
04.    <link href="js/syntax/styles/shCore.css" rel="stylesheet" type="text/css" />
05.    <link href="js/syntax/styles/shThemeDefault.css" rel="stylesheet" type="text/css" />
06.    <style type="text/css"">
07.        html, body
08.        {
09.            font-size: 12px;
10.            margin: 0px;
11.            padding: 0px;
12.        }
13.        .syntaxhighlighter
14.        {
15.            margin: 0 !important;
16.        }
17.    </style>
18.    <script src="js/jquery-1.3.2.min.js" type="text/javascript"></script>
19.    <script src="js/syntax/scripts/shCore.js" type="text/javascript"></script>
20.    <script src="js/syntax/scripts/shBrushJScript.js" type="text/javascript"></script>
21.    <script type="text/javascript">
22.        // TODO
23.    </script>
24.</head>
25.<body>
26.</body>
27.</html>



我们引入了jQuery,来完成AJAX操作以及页面的平滑滚动,来看下JavaScript代码:

01.SyntaxHighlighter.config.clipboardSwf = 'js/syntax/scripts/clipboard.swf';
02.window.highlight = function(number) {
03.    $(".line, highlighted").removeClass("highlighted");
04.    var top = $(".line:eq(" + (number - 1) + ")").addClass("highlighted").offset().top - 150;
05.    $("html, body").animate({
06.        scrollTop: top
07.    }, 500);
08.};
09.window.loadJS = function(url, fn) {
10.    $.get(url, function(data) {
11.        data = data.replace(/</g, "<").replace(/>/g, ">").replace(/\/r\/n/g, "<br />");
12.        $("body").html("");
13.        $("<pre class=\"brush: js\">" + data + "</pre>").appendTo("body");
14.        SyntaxHighlighter.highlight();
15.        if (fn) {
16.            fn();
17.        }
18.    }, "text");
19.};



其中window.loadJS用来读取一个url的内容(这里是JavaScript文件),并使用SyntaxHighlighter高亮显示在页面。
window.highlight用来高亮显示某一行源代码,同时这里使用jQuery的animate函数来完成页面的平滑滚动。

由于这个页面是嵌入在父页面中的,所以接下来你会看到如何在父页面中操作这两个JavaScript函数。


父页面中的JavaScript定义

01.<script type="text/javascript">
02.    function onReady() {
03.      
04.        selectGridRow();
05.    }
06.    function selectGridRow() {
07.        var grid = Ext.getCmp("<%= Grid1.ClientID %>");
08.        grid.getSelectionModel().on("rowselect", function(sm, rowIndex, record) {
09.            getMainWindow().highlight(parseInt(record.json[0].replace(/<.*?>/g, "")));
10.        });
11.    }
12.    function getMainWindow() {
13.        return Ext.query("iframe[name=main]")[0].contentWindow;
14.    }
15.  
16.</script>



其中getMainWindow用来获取IFrame的window实例。
而selectGridRow会在页面加载完毕后立即执行,用来在选中Grid的某一行时高亮显示右侧IFrame中的对应行的源代码(这里用到了上面提到的highlight函数)。


点击树节点的事件处理

还记得在上一章中,我们为Tree注册了OnNodeCommand="Tree1_NodeCommand",下面来看下此函数:

01.protected void Tree1_NodeCommand(object sender, ExtAspNet.TreeCommandEventArgs e)
02.{
03.    string fileName = e.CommandName.Replace("/", "_");
04.    if (ViewState["CurrentFileName"] != null && ViewState["CurrentFileName"].ToString() == fileName)
05.    {
06.        return;
07.    }
08.    ViewState["CurrentFileName"] = fileName;
09.    string errorstr = GetFileContent(String.Format("~/data/errors/{0}.json", fileName));
10.    JSONArray ja = new JSONArray(errorstr);
11.    DataTable table = new DataTable();
12.    table.Columns.Add("level", typeof(Int32));
13.    table.Columns.Add("line", typeof(Int32));
14.    table.Columns.Add("character", typeof(Int32));
15.    table.Columns.Add("reason", typeof(String));
16.    table.Columns.Add("evidence", typeof(String));
17.    foreach (JSONArray error in ja.getArrayList())
18.    {
19.        DataRow row = table.NewRow();
20.        table.Rows.Add(row);
21.        row[0] = Convert.ToInt32(error[0]);
22.        row[1] = Convert.ToInt32(error[1]);
23.        row[2] = Convert.ToInt32(error[2]);
24.        row[3] = error[3].ToString();
25.        row[4] = error[4].ToString();
26.    }
27.    Grid1.DataSource = table;
28.    Grid1.DataBind();
29.    string showSourceScript = "(function(){getMainWindow().loadJS('data/source/" + fileName + "');}).defer(100);";
30.    ExtAspNet.PageContext.RegisterStartupScript(showSourceScript);
31.}



这里面有两个应用技巧:

  • 点击树节点时,需要在后台获取此节点的相关信息怎么办?通过TreeNode的CommandName或者CommandArgument来传递。
  • 点击树节点时,除了要绑定Grid1外,还需要加载IFrame中JavaScript的内容,这通过ExtAspNet.PageContext.RegisterStartupScript来执行一段脚本。


注:ExtAspNet.PageContext.RegisterStartupScript是一个常用的函数,以后你会经常遇到。
在注册的脚本中,我们使用defer(100)来让这段脚本延迟一段执行,这是为了防止浏览器卡(因为同时绑定Grid和发起AJAX可能很耗资源)。


根据错误级别为Grid每一项添加文字颜色

对于非常严重的错误,需要标示文字颜色为红色,而对于不要严重的错误只需文字颜色为淡黄色就行了。

为了实现这一效果,我们有两种不同的方法都可以达到相同的目的。

1. 方法一,在Grid的RowDataBound事件做文章(这也是Asp.net的GridView控件常用的技巧)

01.protected void Grid1_RowDataBound(object sender, ExtAspNet.GridRowEventArgs e)
02.{
03.    // DataItem是行的数据源,
04.    // 如果数据源是DataTable/DataView/DataSet,则e.DataItem是DataRow
05.    // 如果数据源是List<MyClass>,则e.DataItem是MyClass
06.    // e.Values 是实际赋予此行每列的值,可以修改
07.    DataRow row = e.DataItem as DataRow;
08.    if (row != null)
09.    {
10.        int level = Convert.ToInt32(row["level"]);
11.        string style = String.Empty;
12.        if (level == 1)
13.        {
14.            style = "color:#FF0000;";
15.        }
16.        else
17.        {
18.            style = "color:#FF9900;";
19.        }
20.        for (int i = 0; i < e.Values.Length; i++)
21.        {
22.            e.Values[i] = String.Format("<span style=\"{0}\">{1}</span>", style, e.Values[i]);
23.        }
24.    }
25.}



2. 方法二,在Grid的PreRowDataBound事件做文章(这是ExtAspNet特有的事件)

需要特别注意的是,这里改变的是一列的属性(请细细品味是列的属性,不是某一行的属性)。

01.protected void Grid1_PreRowDataBound(object sender, ExtAspNet.GridPreRowEventArgs e)
02.{
03.    DataRow row = e.DataItem as DataRow;
04.    if (row != null)
05.    {
06.        int level = Convert.ToInt32(row["level"]);
07.        string style = String.Empty;
08.        if (level == 1)
09.        {
10.            style = "color:#FF0000;";
11.        }
12.        else
13.        {
14.            style = "color:#FF9900;";
15.        }
16.        foreach (ExtAspNet.GridColumn column in Grid1.Columns)
17.        {
18.            ExtAspNet.BoundField field = column as ExtAspNet.BoundField;
19.            field.DataFormatString = "<span style=\"" + style + "\">{0}</span>";
20.        }
21.    }
22.}



关于Ext4JSLint的内容就先介绍到这,下一章我们会接着介绍AppBox。


下载全部源代码


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:互联网

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP