崔文远 Troy Cui 老崔先生的上海生活、技术博客

C# .Net Web开发中导入Excel到数据库,使用NPOI2支持2003、2007、2010等更高版本

周五花了半天时间搞一个OA里面的Excel报表导入,使用的是吉日嘎拉的GPM架构,但是发现其DotNet.Utilities中的Excel导入类,只能支持Office2003、2007版本,对于2010版本就不支持了,通过搜索[URL=http://code.google.com/p/npoi/]NPOI官方[/URL]文档,终于找到了解决办法,可以不用再担心用户Excel文件版本的问题了。以下2篇文章起到很大作用,特别感谢Tony Qu搞出来这么好的组件。

1、《[URL=http://tonyqus.sinaapp.com/archives/575]NPOI 2教程–1.2 NPOI 2.0模块简介[/URL]》
2、《[URL=http://tonyqus.sinaapp.com/archives/482]NPOI 2.0教程 – 自动识别Excel 2003或2007格式[/URL]》

修改到的文件代码如下,请注意升级NPOI到2的版本,同时请手工添加多个dll引用,貌似1的版本只需要引用一个文件,而2的版本需要应用4个(NPOI.dll, NPOI.OOXML.dll, NPOI.OpenXml4Net.dll, ICSharpCode.SharpZipLib.dll)。

<br/>        /// <summary><br/>        /// 读取Excel<br/>        /// 默认第一行为标头<br/>        /// 支持Office 2007以上版本<br/>        /// 替换原先的方式,不存在非托管方式无法释放资源的问题<br/>        /// 适用于B/S C/S。服务器可免安装Office。<br/>        /// Pcsky 2012.05.01<br/>        /// </summary><br/>        /// <param name="path">excel文档路径</param><br/>        /// <returns></returns><br/>        public static DataTable ImportExcel(string path, int sheetIndex = 0 )<br/>        {<br/>            string columnName;<br/>            var dt = new DataTable();<br/>            //HSSFWorkbook wb;<br/>            IWorkbook wb;<br/>            using (FileStream file = new FileStream(path, FileMode.Open, FileAccess.Read))<br/>            {<br/>                // 只支持2007及以下低版本<br/>                //wb = new HSSFWorkbook(file);<br/>                // 通过接口的方式实现从xls到xlsx 2003、2007以上版本的全部支持<br/>                wb = WorkbookFactory.Create(file);<br/><br/>            }<br/>            ISheet sheet = wb.GetSheetAt(sheetIndex);<br/>            System.Collections.IEnumerator rows = sheet.GetRowEnumerator();<br/>            IRow headerRow = sheet.GetRow(0);<br/>            int cellCount = headerRow.LastCellNum;<br/><br/>            // 添加datatable的标题行<br/><br/><br/>            //for (int i = 0; i < cellCount; i++)<br/>            for (int i = headerRow.FirstCellNum; i < cellCount; i++)<br/>            {<br/>                //ICell cell = headerRow.GetCell(j);<br/>                //dt.Columns.Add(cell.ToString());<br/><br/>                // 2012.09.13 Pcsky 处理空列<br/>                if (headerRow.GetCell(i) == null)<br/>                {<br/>                    columnName = Guid.NewGuid().ToString();<br/>                }<br/>                else<br/>                {<br/>                    columnName = headerRow.GetCell(i).StringCellValue;<br/>                }<br/>                DataColumn column = new DataColumn(columnName);<br/>                dt.Columns.Add(column);<br/>            }<br/><br/>            // 从第2行起添加内容行<br/>            for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)<br/>            {<br/>                IRow row = sheet.GetRow(i);<br/>                DataRow dr = dt.NewRow();<br/><br/>                // 2012.09.12 Pcsky 设置dataRow的索引号从0开始<br/>                int k = 0;<br/>                for (int j = row.FirstCellNum; j < cellCount; j++)<br/>                {<br/>                    //if (row.GetCell(j) != null)<br/>                    //{<br/>                    //dataRow[j] = row.GetCell(j).ToString();<br/><br/>                    dr[k] = row.GetCell(j);<br/>                    k++;<br/>                    //}<br/>                }<br/><br/>                dt.Rows.Add(dr);<br/>            }<br/>            wb = null;<br/>            sheet = null;<br/>            return dt;<br/>        }<br/>



现在想想:满足了一下用户的需求,盯了一天的电脑,同事说我眼睛都红了,而内心还挺高兴,也许这就是工作的乐趣、编程的乐趣吧,当然了,坏处就是一旦有啥东西搞不定,就会很沮丧,而影响心情和生活。我们都是凡人,没办法。

Tags:

发布: cuiwenyuan 分类: Web技术 评论: 0 浏览: 234

给CuteEditor编辑器添加中文字体的方法及代码

OA开发的前两个应用模块给用户去测试了,反馈回来的意见是CuteEditor网页编辑器中的字体没有中文字体。百度和Google了一下,没有现成的代码,只好根据这篇《[URL=http://www.cnblogs.com/mxh691/archive/2008/07/10/1240166.html]CuteEditor 编辑器添加中文字体[/URL]》,花了20分钟整理出来了常见中文字体的清单代码,分享一下给同样用CuteEditor的朋友,更推荐给[URL=http://www.cnblogs.com/jirigala/]吉日嘎拉[/URL]的GPM用户们,又帮你们省了至少10分钟时间去干点别的挥霍生命。

<br/><item text="SimSun" html="<font size=3 face='SimSun'>宋体</font>">SimSun</item><br/><item text="SimHei" html="<font size=3 face='SimHei'>黑体</font>">SimHei</item><br/><item text="FangSong_GB2312" html="<font size=3 face='FangSong_GB2312'>仿宋_GB2312</font>">FangSong_GB2312</item><br/><item text="KaiTi_GB2312" html="<font size=3 face='KaiTi_GB2312'>楷体_GB2312</font>">KaiTi_GB2312</item><br/><item text="YouYuan" html="<font size=3 face='YouYuan'>幼圆</font>">YouYuan</item><br/><item text="STSong" html="<font size=3 face='STSong'>华文宋体</font>">STSong</item><br/><item text="STZhongsong" html="<font size=3 face='STZhongsong'>华文中宋</font>">STZhongsong</item><br/><item text="STKaiti" html="<font size=3 face='STKaiti'>华文楷体</font>">STKaiti</item><br/><item text="STFangsong" html="<font size=3 face='STFangsong'>华文仿宋</font>">STFangsong</item><br/><item text="STXihei" html="<font size=3 face='STXihei'>华文细黑</font>">STXihei</item><br/><item text="STLiti" html="<font size=3 face='STLiti'>华文隶书</font>">STLiti</item><br/><item text="STXingkai" html="<font size=3 face='STXingkai'>华文行楷</font>">STXingkai</item><br/><item text="STXinwei" html="<font size=3 face='STXinwei'>华文新魏</font>">STXinwei</item><br/><item text="STHupo" html="<font size=3 face='STHupo'>华文琥珀</font>">STHupo</item><br/><item text="STCaiyun " html="<font size=3 face='STCaiyun '>华文彩云</font>">STCaiyun </item><br/><item text="FZYaoTi" html="<font size=3 face='FZYaoTi'>方正姚体简体</font>">FZYaoTi</item><br/><item text="FZShuTi" html="<font size=3 face='FZShuTi'>方正舒体简体</font>">FZShuTi</item><br/><item text="NSimSun" html="<font size=3 face='NSimSun'>新宋体</font>">NSimSun</item><br/><item text="LiSu" html="<font size=3 face='LiSu'>隶书</font>">LiSu</item><br/>



需要修改的文件是CuteSoft_Client\CuteEditor\Configuration\Shared\Common.config,找到FontName的节点即可。

发现贴出来的代码好像给自动浏览器转义了,上传一个文本附件,大家用附件中的代码。

[URL=upload/CuteEditorChinseFonts.txt]CuteEditorChinseFonts.txt[/URL]

Tags:

发布: cuiwenyuan 分类: Web技术 评论: 0 浏览: 116

把吉日嘎拉GPM自带的DotNet.WebForm Web Site 转换为Web Application

昨晚上折腾了一晚上终于把吉日嘎拉的GPM自带的DotNet.WebForm转换为Web Application项目了。之所以要费这个劲,一个原因是公司里开发的OA项目,在使用Web Site模式发布的时候,每个页面都会生成随机名称的dll,每次更新发布到服务器的时候就很费劲,不如一个Web Application最终生成一个dll方便。另一个原因是吉日嘎拉的官方SVN上的源码也已经转换为Web Application,我也要与时俱进才行。

转换过程中遇到的问题主要有:

1、添加引用的问题,不要漏掉引用NPOI、CuteEditor、CuteEditor.ImageEditor、System.ServiceModel
2、重复的类名:Common/WorkFlow/Report.ascx和Common/Report/Report.ascx、Common/User/UserCode.aspx和Common/UserAdmin/UserCode.aspx

参考文章:[URL=http://blogs.msdn.com/b/webdev/archive/2009/10/29/converting-a-web-site-project-to-a-web-application-project.aspx]Converting a Web Site Project to a Web Application Project[/URL]

Tags:

发布: cuiwenyuan 分类: Web技术 评论: 0 浏览: 141

C#开发中Windows域认证登录2(扩展吉日嘎拉GPM系统)

上午写了一篇《[URL=http://www.cuiwenyuan.com/shanghai/post/Windows-AD-Logon-Intergrated-into-Jirigala-CSharp-Framework.html]C#开发中Windows域认证登录[/URL]》,然后跟[URL=http://www.cnblogs.com/jirigala/]吉日嘎拉[/URL]沟通了一下,还是把这个Windows AD用户登录的功能扩展到DotNet.Business中,重新命名为LDAP方式的登录,因为需要引用System.DirectoryServices,暂时用不到此功能的朋友,可以exclude此文件(DotNet.Business\WebUtilities\Utilities.LogOnLDAP.cs)。

<br/>//-----------------------------------------------------------------<br/>// All Rights Reserved , Copyright (C) 2013 , Hairihan TECH, Ltd .<br/>//-----------------------------------------------------------------<br/><br/>using System;<br/>using System.Collections.Generic;<br/>using System.Configuration;<br/>using System.Data;<br/>using System.Text;<br/>using System.Web;<br/>using System.Web.Caching;<br/>using System.Web.Security;<br/>using System.DirectoryServices;<br/>using DotNet.Utilities;<br/><br/>namespace DotNet.Business<br/>{<br/>    /// <summary><br/>    /// LDAP登录功能相关部分<br/>    /// </summary><br/>    public partial class Utilities<br/>    {<br/>        // LDAP域用户登录部分:包括Windows AD域用户登录<br/>        #region public static BaseUserInfo LogOnByLDAP(string domain, string lDAP, string userName, string password, string permissionCode, bool persistCookie, bool formsAuthentication, out string statusCode, out string statusMessage)<br/>        /// <summary><br/>        /// 验证LDAP用户<br/>        /// </summary><br/>        /// <param name="domain">域</param><br/>        /// <param name="lDAP">LDAP</param><br/>        /// <param name="userName">域用户名</param><br/>        /// <param name="password">域密码</param><br/>        /// <param name="permissionCode">权限编号</param><br/>        /// <param name="persistCookie">是否保存密码</param><br/>        /// <param name="formsAuthentication">表单验证,是否需要重定位</param><br/>        /// <param name="statusCode"></param><br/>        /// <param name="statusMessage"></param><br/>        /// <returns></returns><br/>        public static BaseUserInfo LogOnByLDAP(string domain, string lDAP, string userName, string password, string permissionCode, bool persistCookie, bool formsAuthentication, out string statusCode, out string statusMessage)<br/>        {<br/>            DirectoryEntry dirEntry = new DirectoryEntry();<br/>            dirEntry.Path = lDAP;<br/>            dirEntry.Username = domain + "\\" + userName;<br/>            dirEntry.Password = password;<br/>            dirEntry.AuthenticationType = AuthenticationTypes.Secure;<br/><br/>            try<br/>            {<br/>                DirectorySearcher dirSearcher = new DirectorySearcher(dirEntry);<br/>                dirSearcher.Filter = String.Format("(&(objectClass=user)(samAccountName={0}))", userName);<br/>                System.DirectoryServices.SearchResult result = dirSearcher.FindOne();<br/>                if (result != null)<br/>                {<br/>                    // 统一的登录服务<br/>                    DotNetService dotNetService = new DotNetService();<br/>                    BaseUserInfo userInfo = dotNetService.LogOnService.LogOnByUserName(Utilities.GetUserInfo(), userName, out statusCode, out statusMessage);<br/>                    // 检查身份<br/>                    if (statusCode.Equals(Status.OK.ToString()))<br/>                    {<br/>                        userInfo.IPAddress = GetIPAddressId();<br/><br/>                        bool isAuthorized = true;<br/>                        // 用户是否有哪个相应的权限<br/>                        if (!string.IsNullOrEmpty(permissionCode))<br/>                        {<br/>                            isAuthorized = dotNetService.PermissionService.IsAuthorized(userInfo, permissionCode, null);<br/>                        }<br/>                        // 有相应的权限才可以登录<br/>                        if (isAuthorized)<br/>                        {<br/>                            if (persistCookie)<br/>                            {<br/>                                // 相对安全的方式保存登录状态<br/>                                // SaveCookie(userName, password);<br/>                                // 内部单点登录方式<br/>                                SaveCookie(userInfo);<br/>                            }<br/>                            else<br/>                            {<br/>                                RemoveUserCookie();<br/>                            }<br/>                            LogOn(userInfo, formsAuthentication);<br/>                        }<br/>                        else<br/>                        {<br/>                            statusCode = Status.LogOnDeny.ToString();<br/>                            statusMessage = "访问被拒绝、您的账户没有后台管理访问权限。";<br/>                        }<br/>                    }<br/><br/>                    return userInfo;<br/>                }<br/>                else<br/>                {<br/>                    statusCode = Status.LogOnDeny.ToString();<br/>                    statusMessage = "应用系统用户不存在,请联系管理员。";<br/>                    return null;<br/>                }<br/>            }<br/>            catch (Exception e)<br/>            {<br/>                //Logon failure: unknown user name or bad password.<br/>                statusCode = Status.LogOnDeny.ToString();<br/>                statusMessage = "域服务器返回信息" + e.Message.Replace("\r\n", "");<br/>                return null;<br/>            }<br/><br/>            <br/>        }<br/>        #endregion<br/><br/>    }<br/>}<br/>



前端的登录文件-SigninLDAP.aspx,代码较多可参考Signin.aspx。

Tags:

发布: cuiwenyuan 分类: Web技术 评论: 0 浏览: 573

C#开发中Windows域认证登录

吉日嘎了的Webform例子程序做的很好,但在我们公司,除了使用GPM通用权限管理自带的账户系统登录,还需要集成Windows域账户登录。对于如何实现,我思考了一段时间,大体的思路如下:

1、在GPM中创建的用户账号和其在Windows域中的账号一致,如域账号为Troy.Cui,那么GPM中登录userName也是Troy.Cui
2、GPM中的账号需要单独手工创建,因为涉及到的权限、角色的设定,如果使用域账号登录的时候,自动创建GPM的账号意义不大
3、不启用IIS中的Windows集成认证,因为我们还有一部分用户是没有域账号的,所以必须使用模拟域用户登录的方式进行认证
4、模拟域账号登录成功后,需要在GPM中增加一个DomainLogon的方法,直接使用域账号进行登录,无需密码。

昨天在实现的过程中,在DoNet.Business中增加了DomainLogon(string userName)的方法调用BaseUserManager.LogOnByUserName,但是在做模拟域用户登录的时候,一直报各种各样的错误:

1、There is no such object on the server.
2、0x80005000
3、A referral was returned from the server

最后通过参考《[URL=http://www.codeproject.com/Articles/18102/Howto-Almost-Everything-In-Active-Directory-via-C]Howto: (Almost) Everything In Active Directory via C#[/URL]》和《[URL=http://www.cnblogs.com/netlover/archive/2011/03/30/1999836.html]Asp.Net模拟域验证登录及密码修改[/URL]》,最后终于调试通过,代码如下:

创建DomainSigin.aspx,在DomainSigin.aspx.cs中增加引用:using System.DirectoryServices;

<br/>/// <summary><br/>    /// 域用户登录<br/>    /// </summary><br/>    /// <param name="userName">用户名</param><br/>    /// <param name="password">密码</param><br/>    private void DomainUserLogOn(string userName, string password)<br/>    {<br/>        //China Only<br/>        //string lDAP = "OU=Users,OU=China,DC=CORP,DC=yourdomain,DC=com";<br/>        string lDAP = "DC=CORP,DC=yourdomain,DC=com";<br/>        <br/>        DirectoryEntry dirEntry = new DirectoryEntry();<br/>        dirEntry.Path = string.Format("LDAP://{0}", lDAP);<br/>        dirEntry.Username = "corpwaiglobal\\" + userName;<br/>        dirEntry.Password = password;<br/>        dirEntry.AuthenticationType = AuthenticationTypes.Secure;<br/>        <br/>        string checkInput = string.Empty;<br/><br/>        try<br/>        {<br/>            DirectorySearcher searcher = new DirectorySearcher(dirEntry);<br/>            searcher.Filter = String.Format("(&(objectClass=user)(samAccountName={0}))", userName);<br/>            System.DirectoryServices.SearchResult result = searcher.FindOne();<br/>            if (result != null)<br/>            {<br/>                // 正常登录<br/>                <br/>                try<br/>                {<br/>                    string statusCode = string.Empty;<br/>                    string statusMessage = "没有此用户。";<br/><br/>                    // 有什么权限的人才可以登录到系统<br/>                    string permissionItemCode = string.Empty;<br/><br/>                    // 登录验证<br/>                    string openId = Utilities.GetOpenId();<br/>                    BaseUserInfo userInfo = Utilities.DomainLogOn(userName);<br/><br/>                    // txtVerifyCode.Text = string.Empty;<br/>                    // 登录结果<br/>                    if (userInfo!=null)<br/>                    {<br/>                        this.AfterLogOn(userInfo);<br/>                        // 登录成功,重新定向到跳转的页面<br/>                        // Page.Response.Redirect(this.ReturnURL);<br/>                        // 若是单点登录,还需要把OpenId传递过去,这样在其他子网站里可以获取到OpenId,而不是用户名密码了,可以进行加密登录了<br/>                        if (!string.IsNullOrEmpty(this.ReturnURL) && !string.IsNullOrEmpty(userInfo.OpenId))<br/>                        {<br/>                            if (this.ReturnURL.IndexOf('?') > 0)<br/>                            {<br/>                                this.ReturnURL = this.ReturnURL + "&OpenId=" + userInfo.OpenId;<br/>                            }<br/>                            else<br/>                            {<br/>                                this.ReturnURL = this.ReturnURL + "?OpenId=" + userInfo.OpenId;<br/>                            }<br/>                        }<br/>                        Response.Redirect(this.ReturnURL, false);<br/>                    }<br/>                    else<br/>                    {<br/>                        checkInput = "<script>alert('提示信息:" + statusMessage + "');</script>";<br/>                        Page.ClientScript.RegisterStartupScript(this.GetType(), "message", checkInput);<br/>                        this.txtUserName.Focus();<br/>                    }<br/>                }<br/>                catch (System.Exception exception)<br/>                {<br/>                    Page.Response.Write(exception.Message);<br/>                    checkInput = "<script>alert('提示信息:登录失败,请检查你的用户名和密码是否输入有误。');</script>";<br/>                    Page.ClientScript.RegisterStartupScript(this.GetType(), "message", checkInput);<br/>                    this.txtUserName.Focus();<br/>                }<br/>            }<br/>            dirEntry.Close();<br/>        }<br/>        catch (Exception ex)<br/>        {<br/>            Page.Response.Write(ex.Message);<br/>            checkInput = "<script>alert('提示信息:登录失败,请检查你的用户名和密码是否输入有误。');</script>";<br/>            Page.ClientScript.RegisterStartupScript(this.GetType(), "message", checkInput);<br/>            this.txtUserName.Focus();<br/>        }<br/>    }<br/>



坦白的说,这么实现的话,对DotNet.Business部分暴漏出来一个无需密码的LogOnByUserName登录,的确是一个风险,最好的做法是把域验证的部分也放到DotNet.Business,但是这么做,又有缺点,会对不需要域认证的用户早成负担。

Tags:

发布: cuiwenyuan 分类: Web技术 评论: 0 浏览: 1503

ERPLN中明明有库存,却没办法转库

再次感谢Infor的Russell He,帮我前天搞定了一个库存转移的Shortage报错,我这个case是修改whwmd216里面的committed数量来修复的。其实我自己查了半天,对tcibd100 Item Inventory, whinr140 Stock Point Inventory, whwmd215 Item Inventory by Warehouse都做了检查,也重新生成了Planned Inventory Transaction,对这些地方的allocated inventory和committed  inventory都做了检查,没想到是出在whwmd216 Inventory by Warehouse,Item and Effective Unit这个表。

以下是来自Russell的解决思路,记录一下,以后备用。

Hi Troy,

在有可见现有库存的情况下,出库通知报短缺会有以下的原因。

1. 该物料处于周期盘点中 (这个可以通过查周期盘点单whinh5100m000和周期盘点数据whinh5140m000进行排除)

2. 库存已经被其他订单占用 (如果其它订单已经生成了出库通知,则在确认装运前,库存依然会显示在现有库存栏里,这个可以查计划事务处理whinp1500m000查到其他的订单然后看仓单执行到哪步了)

3. 库存承诺 (这个可以在库存承诺whinp2100m000里查)

4. 数据损毁或冗余 (库存相关数据都是存在whwmd开头的表里,其中,如果是现有库存,分配库存,在购库存有数据错误,可以通过修复进程whwmd6290m000进行检查和修复。如果是其他字段比如承诺库存损毁,则需要人工检查,检查范围在whwmd215 - whwmd220)

鉴于此case问题已解决,我在此先将其关闭。您有任何问题,欢迎随时提问。

Best Regards,
Russell He

More...

Tags: ERPLN

发布: cuiwenyuan 分类: Infor ERP LN(BaaN ERP) 评论: 0 浏览: 132

ERP LN中Batch不同步造成的发票没法Post

今天财务销售发票打印之后,发票状态一直是Printed状态,本以为是财务执行Compose/Print/Post Invoice没有选择Post选项,让他们手工Post的时候,他们说报错,我自己运行了一下,报错如下:

<br/>can not update batch status because it is deleted, in termination or terminated<br/>



第一个念头就是Batch被人为删除了,但转念想想不对,这是系统的Batch,不应该呀。无奈之下,官方搜索了一下文档,居然跟以前遇到的问题:《[URL=http://www.cuiwenyuan.com/shanghai/post/ERP-LN-Session-tfcor0214m000-Correction-of-Last-Used-Batch-Number.html]极少有机会用到的ERP LN Session tfcor0214m000 - Correction of Last Used Batch Number[/URL]》,是同一个原因。

官方的解决方案如下,记录一下:

<br/>Sometimes, the Last Used Batch Number in table Last Used Batch (tfgld014) is out-of-sync with the last batch number in table Batch Status (tfgld100). Therefore, a correction program is provided in order to update the Last Used Batch Number in table tfgld014.<br/>



到底什么原因造成的不同步,官方说网络问题,不稳定啥的,其实官方应该有自动保护机制。

Tags: Infor ERPLN

发布: cuiwenyuan 分类: Infor ERP LN(BaaN ERP) 评论: 0 浏览: 86

C#开发中表单提交Ctrl+Enter和Enter快捷键的jQuery实现方式

以前写HRM系统的时候,通过C#代码和javascript实现过文本输入框中Enter提交表单的功能,使用的原理是针对textbox进行Enter键的监控,如果输入了Enter就调用C#的指定Button功能,这里可以支持同一个表单多个button可以任意选择触发其中的某个button。

前端javascript代码如下:

<br/><script type=text/javascript><br/>    function doClick(buttonName, e) {<br/>        //the purpose of this function is to allow the enter key to <br/>        //point to the correct button to click.<br/>        var key;<br/><br/>        if (window.event)<br/>            key = window.event.keyCode;     //IE<br/>        else<br/>            key = e.which;     //firefox<br/><br/>        if (key == 13) {<br/>            //Get the button the user wants to have clicked<br/>            var btn = document.getElementById(buttonName);<br/>            if (btn != null) { //If we find the button click it<br/>                btn.click();<br/>                event.keyCode = 0<br/>            }<br/>        }<br/>    }</script><br/>


后端C#在Page_Load中的if (!IsPostBack)部分加入如下代码:

<br/>txtEmployeeID.Attributes.Add("onKeyPress", "doClick('" + btnSearch.ClientID + "',event)");<br/>



今天在搞OA里面的任务管理开发的时候,希望能后使用通用的Ctrl+Enter进行自动提交任务评论,找到如下完全客户端的解决方案,使用到jQuery库,原文:[URL=http://pangbu.com/jquery-ctrl-enter-submit-form/]http://pangbu.com/jquery-ctrl-enter-submit-form/[/URL],稍作修改代码如下:

<br/>$('body').keypress(function(event){<br/>  if(event.ctrlKey && (event.which == 13 || event.which == 10)) {<br/>    $('#btnSubmit').click();<br/>  }<br/>});<br/>



1、$(‘body’) 是表明焦点在哪里的时候Ctrl+Eenter才有用
2、keypress()是绑定按键按下事件
3、if(event.ctrlKey && (event.which == 13 || event.which == 10))这句很简单,就是检测你是不是同时按下了 Ctrl 和回车(event.which == 13大键盘区回车 、event.which == 10 小键盘区回车 )
4、$(‘#submit’).click();按下哪个按钮

补充阅读:[URL=http://api.jquery.com/event.which/]jQuery event.which[/URL]

Tags: jQuery

发布: cuiwenyuan 分类: Web技术 评论: 0 浏览: 139

好用的jQuery工作进度条

对于进度条,在HTML5下有个新标签就是用来呈现任务的进度,鉴于目前很多旧式浏览器还不完全支持HTML5,大家都喜欢用javascript和css实现进度条的功能。上周我在做OA里面的任务管理时,通过比较jQuery UI自带的[URL=http://jqueryui.com/progressbar]progress bar[/URL]还有jQuery easyui中的[URL=http://www.jeasyui.com/documentation/progressbar.php]progress bar[/URL],发现都不太符合我的需求,最后找到一个特别简单的实现,只需几行代码即可,读懂英文的看这里[URL=http://workshop.rs/2012/12/animated-progress-bar-in-4-lines-of-jquery/]ANIMATED PROGRESS BAR IN 4 LINES OF JQUERY[/URL],也可以看GitHub上的网址:[URL=https://github.com/kopipejst/progressbar]https://github.com/kopipejst/progressbar[/URL]

这里分享一下,我的样式表

<br/>#rateOfProgressBar {<br/>    width: 400px;<br/>    height: 22px;<br/>    border: 1px solid #ccc;<br/>    background-color: #f5f5f5;<br/>        }<br/><br/>        #rateOfProgressBar div {<br/>    height: 100%;<br/>    color: #fff;<br/>    text-align: right;<br/>    line-height: 22px; /* same as #progressBar height if we want text middle aligned */<br/>    width: 0;<br/>    background-color: #00cc33;/*#ff0000*/<br/>        }<br/>



C#页面调用的代码如下,我不喜欢把javascript的调用放在body中,于是放在jQuery的ready事件中,另外我这里的lblRateOfProgress在页面前端做一个display:none的隐藏。

<br/><script type="text/javascript"><br/>        $(document).ready(function () {<br/><br/>            progress($("#lblRateOfProgress").text()*100, $('#rateOfProgressBar'));<br/>        });<br/>function progress(percent, $element) {<br/><br/>    var progressBarWidth = percent * $element.width() / 100;<br/><br/>    $element.find('div').animate({ width: progressBarWidth }, 500).html(percent + "% ");<br/><br/>}<br/>    </script><br/>

你有一百万吨的信念

近期搞OA开发,没想到吧,的确是OA,曾经多年前在第二家公司(马可)搞过,后来就是工作流,然后就是BPM,没想到逃不过轮回,又回到原点。应该是当初没做好OA的缘故吧。不过,近期感觉挺有状态,也挺有进展,现在对OA的认识就是:这东西说起来简单,能设计的好,用得好,对公司有帮助的话,还是相当有挑战的。

More...

Tags:

发布: cuiwenyuan 分类: 五音五色 评论: 0 浏览: 84