欢迎来到助燃的Blog!

对你有益的氧气,或者……对你有害的氯气
 
 

与我联系

  • 发短消息

搜索

 

常用链接

  • 我的随笔
  • 我的空间
  • 我的短信
  • 我的评论
  • 更多链接
  • 我的参与
  • 我的新闻
  • 最新评论
  • 我的标签

留言簿(7)

  • 给我留言
  • 查看留言

我的标签

  • Access(1)
  • Jet(1)
  • SQL(1)
  • compute by(1)
  • 模拟(1)
  • 分类(1)
  • 汇总(1)

随笔分类

  • Asp.net+AJAX(6) (rss)
  • 我的程序人生(1) (rss)

随笔档案

  • 2008年7月 (1)
  • 2007年9月 (1)
  • 2007年8月 (1)
  • 2007年7月 (2)
  • 2007年1月 (2)
  • 2006年12月 (1)

最新评论

  • 1. re: 为gridview“删除”列添加确认对话框
  • @菜鸟A
  • --r
  • 2. re: 为gridview“删除”列添加确认对话框
  • @cnmacd
    嗯,不错。
  • --啊
  • 3. re: 为gridview“删除”列添加确认对话框
  • protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row...
  • --刘彬
  • 4. re: 为gridview“删除”列添加确认对话框
  • 我也一樣, 對話框出來, cancel也是會刪除記錄的.
  • --jasonren

阅读排行榜

  • 1. 为gridview“删除”列添加确认对话框(15889)
  • 2. 在Asp.net中使用dojo的splitContainer控件(1070)
  • 3. 如何修正CalendarExtender在updatePanel中发生错位的问题(578)
  • 4. 在vs2008为asp.net ajax添加js智能感知(541)
  • 5. 在asp.net中使用符合xhtml规范的spliter控件(523)

评论排行榜

  • 1. 为gridview“删除”列添加确认对话框(43)
  • 2. 在Asp.net中使用dojo的splitContainer控件(9)
  • 3. 在vs2008为asp.net ajax添加js智能感知(3)
  • 4. 在asp.net中使用符合xhtml规范的spliter控件(2)
  • 5. 如何修正CalendarExtender在updatePanel中发生错位的问题(1)

Powered by: 博客园
模板提供:沪江博客
博客园 | 首页 | 发新随笔 | 发新文章 | 联系 | 订阅订阅 | 管理

2008年7月25日

为Access模拟compute by分类汇总功能

最近用Access数据库做一个微型应用,需要实现类似SQL Server里compute by语法的效果,网上google了一下,得知jet不支持,只好自己用.net模拟一个了,暂时只支持根据一个字段sum另一个字段,即sum(fieldA) compute by (filedB)。注意fieldA必须是decimal类型,如果是double类型恐怕需要修改源代码。

 

 1/**//// <summary>
 2        /// 模拟SQL SERVER中的分类汇总ComputeBy语句
 3        /// </summary>
 4        /// <param name="sourceTable">源数据</param>
 5        /// <param name="sumField">求和字段</param>
 6        /// <param name="byField">分类字段</param>
 7        /// <param name="needTotolSum">是否需要汇总合计</param>
 8        /// <returns>目标数据源,重新绑定控件的DataSource属性后生效</returns>

 9        public static DataTable ComputeBy(DataTable sourceTable, string sumField, string byField, bool needTotolSum)
10        {
11            int rowCount = sourceTable.Rows.Count;
12            if (rowCount == 0) return sourceTable;//数据量为0,不执行计算分类汇总
13            DataTable destTable = sourceTable.Copy();//深拷贝数据源
14            int insertTimes = 0;//插入次数,用于记录数据源与其拷贝之间的相对偏移量
15            int i = 0;
16            int j = 0;
17            decimal sum = 0;//分类汇总
18            decimal totolSum = 0;//合计
19            DataRow dr;
20            while (i < rowCount)
21            {
22                sum += (decimal)sourceTable.Rows[i][sumField];
23                j = i + 1;
24                if (j < rowCount && sourceTable.Rows[i][byField].ToString() != sourceTable.Rows[j][byField].ToString())
25                {
26                    dr = destTable.NewRow();
27                    dr[sumField] = sum;
28                    totolSum += sum;
29                    sum = 0;
30                    destTable.Rows.InsertAt(dr, j + insertTimes);//插入分类汇总
31                    insertTimes++;
32                }

33                i++;
34            }

35            dr = destTable.NewRow();
36            dr[sumField] = sum;
37            destTable.Rows.InsertAt(dr, j + insertTimes);
38            //分类汇总插入完毕,插入合计
39            if (needTotolSum)
40            {
41                totolSum += sum;
42                dr = destTable.NewRow();
43                dr[sumField] = totolSum;
44                destTable.Rows.Add(dr);
45            }

46            return destTable;
47        }
posted @ 2008-07-25 01:06 助燃 阅读(89) | 评论 (0) | 编辑
 

2007年9月6日

让Validation Callout Extender与Custom Validator协作
官方的说明中提到ValidatorCalloutExtender并不支持CustomValidator的服务器端验证,而我又迫切需要这个功能,于是使用google大法,找到了这篇名为《Validating Server Side using the Validation Callout Extender with the Custom Validator》 的文章,它提到了可以通过让Page类实现System.Web.UI.ICallbackEventHandler接口从而使页面本身支持异步回调,接着指定CustomValidator的ClientValidationFunction属性,把验证事件关联到一个客户端的js函数,在该函数中通过异步回调获得服务器端验证结果后返回,那么对于ValidatorCalloutExtender而言,没有与服务器端通信,只是从js中获得了一个验证结果,效果自然是大大的好。

不过,这个方法太烦杂了,上次看了老赵的这篇 分清ASP.NET AJAX中的Extender和Behavior模型 当时就受到了启发,在服务器端验证事件中,若验证失败,则注册一个启动脚本,内容是调用ValidatorCalloutExtender的Behavior中显示气泡提示的方法,那么当这个启动脚本被执行不就大功告成了嘛!

说干就干,首先摸索了一下那个弹出气泡的方法名,居然就是show(),要是不对恐怕还要到官方文档里面查,接着在页面中添加一个RegularExpressionValidator,因为如果ValidatorCalloutExtender直接关联带有服务器端验证的CustomValidator会报错,所以需要一个替代品,例如:
<asp:RegularExpressionValidator ID="rev" runat="server" ErrorMessage="用户名密码错误!" 
                    ControlToValidate
="Password" Display="None" ValidationExpression="\w*|\W*"></asp:RegularExpressionValidator>  
其中,ErrorMessage即弹出气泡中的提示文字,若提示内容会由于服务器端验证结果动态变化,则可以在后台代码中动态改变该属性从而达到目的;ControlToValidate为弹出气泡指向的文本框;Display设为none用于隐藏这个替代品;正则表达式设为“\w*|\W*”表示任意字符都能通过验证,这样就不会出现客户端正则表达式验证没通过而激活气泡提示的情况了。接着添加一个ValidatorCalloutExtender,注意要指明BehaviorID属性
                <cc1:ValidatorCalloutExtender ID="vceLogin" runat="server" TargetControlID="rev" BehaviorID="vceLoginBehavior">
                
</cc1:ValidatorCalloutExtender>
接下来转到后台代码,在验证失败后添加一条注册启动脚本的语句
ScriptManager.RegisterStartupScript(UpdatePanel1, this.GetType(), "loginFailed", "window.setTimeout(\"$find('vceLoginBehavior').show();\",500);", true);                
之所以在js中用到了延时,是因为之前不用延时直接执行会发生$find('vceLoginBehavior')对象为Null的意外,遗憾的是原因我到目前也没有找到,麻烦哪位高人指点一下哈,在下先谢过!这个写法自然不够安全,最好能写成若$find('vceLoginBehavior')对象为空,隔一段时间再执行直到执行成功为止,这儿就先偷个懒,毕竟我的这个程序大多是内网用的,网速可以保证。如果觉得有必要在气泡弹出时将焦点移动到气泡所指向的文本框,那就再追加一句
ScriptManager1.SetFocus(txtPassword);
OK,大功告成!实际测试时还发现了ValidatorCalloutExtender的一个小bug,气泡部分可能被页面上的控件遮住,没设z-index的关系,不得以改了源码,AjaxControlToolkit\ValidatorCallout\ValidatorCalloutBehavior.js的第68行追加一句
popupTable.style.zIndex = "1000";
在漫长的编译过程中,想了下为什么这个控件没有指定css的class,也没有指定id,本来只要有其中任意一个,我就不用来改源码了...
以上内容适用于10618,更新到10920后,按上述做法居然出现问题,请听我继续分解...
版本更新后,运行时报错“this._popupBehavior为空或不是对象”,郁闷不已。只能把两个版本的ValidatorCalloutBehavior.js文件拿过来对比,发现问题出在直接调用behavior的时候,不会进行DOM构造了,因此找到了被封装的用于构造DOM的函数_ensureCallout()执行之,其后调用show()方法,顺利解决问题!
也就是原先的代码改为
ScriptManager.RegisterStartupScript(UpdatePanel1, this.GetType(), "loginFailed", "window.setTimeout(\"$find('vceLoginBehavior')._ensureCallout();$find('vceLoginBehavior').show();\",500);", true);

另外,新版本果然多了个id,于是添加z-index不用更改源代码了,只需要在css文件中加上一句
        #vceLoginBehavior_popupTable,#vcePwd_popupTable,#vceUsername_popupTable
        
{}{
            z-index
:1000;
        
}
   
上面的例句适用于多个ValidatorCalloutExtender存在的情况,只要写一次就可以了,几个id之间用逗号隔开。behavior的命名规则是这样的:如果已经被指定,则使用指定名称拼上"_popupTable"否则会使用Extender的id拼上"_popupTable"。舒服~
posted @ 2007-09-06 15:48 助燃 阅读(398) | 评论 (0) | 编辑
 

2007年8月11日

在vs2008为asp.net ajax添加js智能感知
今天找了好久,终于搞清楚了,scriptManager控件支持js智能感知,而从其继承的toolkitScriptManager不支持。至少在vs2008b2中是这样。
要在js文件中添加asp.net ajax的js智能感知(与scriptManager控件无关),在js文件的开头添加这样一行即可:
///<reference name="MicrosoftAjax.js"/>
若要在aspx文件中添加智能感知,网上很多都说可以在ScriptManager标记内添加
<Scripts>
  
<asp:ScriptReference Path="" />
</Scripts>               
不过我基于toolkitScriptManager如此尝试仍然失败了,最后自己把C:\Program Files\Microsoft ASP.NET\ASP.NET 2.0 AJAX Extensions\v1.0.61025\MicrosoftAjaxLibrary\System.Web.Extensions\1.0.61025.0目录下的MicrosoftAjax.js文件拷贝到project的js目录下,然后用传统的js方式引用
<script src="js/MicrosoftAjax.js" type="text/javascript"></script>
居然成功地获得了智能感知,只是这两天写程序的时候发现,这样写会引起莫名其妙的运行时冲突,如果是为了拥有智能感知,那么在运行时需要把这一行注释掉再运行。
posted @ 2007-08-11 23:44 助燃 阅读(541) | 评论 (3) | 编辑
 

2007年7月24日

如何修正CalendarExtender在updatePanel中发生错位的问题
     摘要: 最近用到了CalendarExtender,结果不知道为什么发生了错位,如图在Google和百度上找了很久,中文的文章里面似乎只提到了如何本地化(就是显示中文的月份)以及怎么解决被下拉框挡住的问题,谈到格式错位的好像没有,我最后在官方论坛上找到一篇文章,解决了这个问题,就在这儿贴一下~应该也算是个bug吧,可能在0618之后的版本会有补丁。解决的方法是在调用CalendarExtender的页面所... 阅读全文
posted @ 2007-07-24 21:52 助燃 阅读(578) | 评论 (1) | 编辑
 

2007年7月21日

在asp.net中使用符合xhtml规范的spliter控件
     摘要: 之前为了使用spliter而尝试了dojo,有一个很严重的问题,其对xhtml规范支持得不好,使用时必须去掉xhtml的声明,这样一来,某些ms ajax control toolkit将无法正常使用。为了寻求更好的方法,我一直没有放弃,最近终于找到了这样一个spliter控件,它能支持xhtml,并且使用起来也很方便,接下来介绍其使用方法。我的布局是经典的左侧treeview,右侧gridvie... 阅读全文
posted @ 2007-07-21 16:10 助燃 阅读(523) | 评论 (2) | 编辑
 

2007年1月30日

在Asp.net中使用dojo的splitContainer控件

在vs2005为winForm编程,有splitContainer控件可以用;可webForm可就没有这么个东西了。去问了赵老师,他说“试试dojo的splitContainer”,于是我查了N多资料捣鼓了1天终于搞定了,下面来总结一下这次收获的经验。效果图:

如何使用dojo中的某个控件

  1.  去官方网站下载最新版本的dojo,我用的是0.4.1的。
  2.  将其解压缩后放在项目所在目录下的js目录下
  3.  在网页的<head>标记内,做一次这样的引用,算是让js读取dojo相关的命名空间
     <script type="text/javascript" src="js/dojo/dojo.js"></script> 
  4.  紧跟其后,要这样来引用控件相关的类,例如本文中要使用的是splitContainer
            dojo.require("dojo.widget.SplitContainer");
            dojo.require(
    "dojo.widget.ContentPane");
  5. 因为dojo是开源的,您可以在dojo\tests\widget目录下找到相应控件的使用方法,并且可以在这里查找每个方法的说明文档
  6. 根据sample得知,这样写就可以让splitContainer生效,其中SplitContainer的orientation决定了其水平方式分栏还是垂直方式分栏,style中的border属性决定了分隔条的风格。而两个ContentPane在其内即决定了分两栏,overflow设置为auto决定了在拖动分隔条时左右两侧的内容不会重叠。
    <div id="SplitContainer1" dojoType="SplitContainer" 
            orientation
    ="horizontal"
            sizerWidth
    ="5"
            activeSizing
    ="false"
            style
    ="border: 1px solid black; float: left; width: 100%; height: 100%;">
          
    <div id="ContentPane1" dojoType="ContentPane" sizeMin="20" sizeShare="20" style="overflow:auto">
            
    <!--左侧的内容-->
          
    </div>                                    
          
    <div  id="ContentPane2"  dojoType="ContentPane" sizeMin="50" sizeShare="50"  style="overflow:auto">
            
    <!--右侧的内容-->
          
    </div>      
    </div>

 配合asp.net使用的注意事项

  1.  由于dojo使用的标记不符合xhtml1.0的规范,因此需要去掉webForm开头部分声明的这句话,否则无法使用
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. 考虑到大部分使用这种左右分栏结构的人同时需要收缩一侧的效果,写了如下的代码将其实现,注意调用的时候要这样写onclick="fac(event)"来兼容IE和FF
            function fac(evt)
            
    {
                evt
    =evt?evt:window.event;
                
    var oTarget=evt.srcElement||evt.target;            
                oTarget.disabled
    ="disabled";            
                
    if (!dojo.widget.byId("SplitContainer1").isHide)
                
    {
                    dojo.widget.byId(
    "SplitContainer1").removeChild(dojo.widget.byId("ContentPane1"));
                    dojo.widget.byId(
    "SplitContainer1").isHide=true;
                    oTarget.value
    =">>";
                }

                
    else
                
    {
                    dojo.widget.byId(
    "SplitContainer1").removeChild(dojo.widget.byId("ContentPane2"));
                    dojo.widget.byId(
    "SplitContainer1").addChild(dojo.widget.byId("ContentPane1"));         
                    dojo.widget.byId(
    "SplitContainer1").addChild(dojo.widget.byId("ContentPane2"));
                    dojo.widget.byId(
    "SplitContainer1").isHide=false;
                    oTarget.value
    ="<<";
                }

                oTarget.disabled
    ="";
            }
  3. 若配合msAjax控件一同使用,例如要用到updatePanel时,不要把整个splitContainer都放在一个updatePanel中,应尽量分几栏放几个,否则在回调之后,页面上的div标签的class属性都会消失得无影无踪,造成dojo控件失效。
  4. 去掉开头xhtml的声明之后会有产生一个并发症,某些ajax control toolkit的控件将不正常!
posted @ 2007-01-30 01:45 助燃 阅读(1070) | 评论 (9) | 编辑
 

2007年1月1日

为gridview“删除”列添加确认对话框

如何为gridview控件里的“删除”列添加一个确认对话框?网上众说纷纭,大致见到了三种解决方案,现归纳如下:
1、继承Web.IO里的button控件,为其实现一个IPostback的接口用于回调,具体代码之复杂,只有作者自己想体会吧……
2、在gridview的RowDataBound事件中,遍历所有子控件,若属于LinkButton类,且CommandName为“Delete”,就调用其Atributes.Add方法,添加一个onclick事件内含confirm语句,即

lb.Attributes.Add("onclick", "return confirm('您真的要删除此行吗?')");
这种做法效率低下而且代码十分不雅。

3、目前已知的最简洁的方法,如图,在删除按钮的那一列属性里面,把DeleteText属性设为

<div id="de" onclick="JavaScript:return confirm('确定删除吗?')">删除</div> 

这个太强了,赞一个。

可问题是,.net输出的html代码如下:

<a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$GridView1','Delete$0')" style="color:#4A3C8C;"><div id="de" onclick="JavaScript:return confirm('确定删除吗?')">删除</div></a> 
为什么内层<div>的onclick事件所返回的bool值能影响到外层<a>标签的的语句是否被执行呢?
仔细想了想,以前用asp直接写的删除标签是这个样子的:
<a href="deleteUser.asp?id=xxx"  onclick="return confirm('确定删除吗?')">删除</a> 
也就是说,onclick事件接受一个bool值,其决定了click事件是否被触发。若click事件没有被触发,href内含的跳转动作就不会生效。同理,之前的那段代码中,<div>在<a>中,只有先触发<div>的click事件,<a>的跳转动作才会生效。而我们在<div>的onclick事件中若选择为其赋值false,随即取消了<div>的click事件,也同时取消了<a>的跳转。

之后,新的问题又来了。如果我们的CommandField中ButtonType是Button的话,这段代码就失效了。我想了下,可以通过将其转换为模板列的方式来解决。
先将该字段转换成模板,然后编辑这个模板列,选中用于删除的Button,将其onClientClick属性设为
return confirm('您确认删除要删除么?')
即可。
posted @ 2007-01-01 00:47 助燃 阅读(15889) | 评论 (43) | 编辑
 

2006年12月31日

告别06,喜迎07
终于在cnblogs里安了个窝,本来已经有两处窝了,不过看上了这儿贴代码的功能,所以就赶在06年的最后一刻搬进来,当作是给自己的新年礼物吧
以前两处住所贴了代码浏览器解析起来就不正常了
但愿新的一年里,我能在这儿不断提升.net平台上的功力,记录下学习过程中的点点滴滴与各位分享。
posted @ 2006-12-31 23:37 助燃 阅读(231) | 评论 (0) | 编辑
 
仅列出标题