(共3步)首先在需要计算时间范围内天数的表单源代码中放置如下代码:(步骤1完全复制,不需修改)#region ValidateInputDate[AjaxPro.AjaxMethod(AjaxPro.HttpSessionStateRequirement.Read)]public string ValidateInputDate(string strDtS, string strDtE) {UserInfoClass tUserInfo = (UserInfoClass)Session["UserInfo"];string userId = tUserInfo.LoginId;string tLanguageType = nguage;DateTime dtS;DateTime dtE;try{dtS = Convert.ToDateTime(strDtS);dtE = Convert.ToDateTime(strDtE);}catch (Exception ex){return ex.Message;}string errorMsg = String.Empty;if (dtS.ToString("yyyyMMdd") == dtE.ToString("yyyyMMdd")){WorkDateObj workDateObj =GetWorkDateDataObj(dtS.ToString("yyyy-MM-dd"), userId);if (workDateObj == null){//errorMsg += "Object is null [lable one]\n";errorMsg += MultiLanguage.GetComment("FD", "STD002AND4", "errorD", tLanguageType) + Environment.NewLine;errorMsg += MultiLanguage.GetComment("FD", "STD002AND4", "errorE", tLanguageType) + Environment.NewLine;}else{if (!workDateObj.ValidateBusinessLeaveDate(dtS)){//起始時間不符行事曆工作時間!errorMsg += MultiLanguage.GetComment("FD", "STD002AND4","errorB", tLanguageType) + Environment.NewLine;//errorMsg += "Inside ValidateBusinessLeaveDate [lable two]\n";}if (!workDateObj.ValidateBusinessLeaveDate(dtE)){//截止時間不符行事曆工作時間!errorMsg += MultiLanguage.GetComment("FD", "STD002AND4", "errorC", tLanguageType) + Environment.NewLine;}}}else{//DateTime dtS0 = new DateTime(dtS.Year, dtS.Month, dtS.Day);//DateTime dtE0 = new DateTime(dtE.Year, dtE.Month, dtE.Day);WorkDateObj workDateObjS =GetWorkDateDataObj(dtS.ToString("yyyy-MM-dd"), userId);WorkDateObj workDateObjE =GetWorkDateDataObj(dtE.ToString("yyyy-MM-dd"), userId);if (workDateObjS == null){//起始時間不存在於行事曆!errorMsg += MultiLanguage.GetComment("FD", "STD002AND4", "errorD", tLanguageType) + Environment.NewLine;}if (workDateObjE == null){//截止時間不存在於行事曆!errorMsg += MultiLanguage.GetComment("FD", "STD002AND4", "errorE", tLanguageType) + Environment.NewLine;}if (workDateObjS != null && workDateObjE != null){if (!workDateObjS.ValidateBusinessLeaveDate(dtS)){//起始時間不符行事曆工作時間!errorMsg += MultiLanguage.GetComment("FD", "STD002AND4", "errorB", tLanguageType) + Environment.NewLine;}if (!workDateObjE.ValidateBusinessLeaveDate(dtE)){//截止時間不符行事曆工作時間!errorMsg += MultiLanguage.GetComment("FD", "STD002AND4", "errorC", tLanguageType) + Environment.NewLine;}}}if (errorMsg != String.Empty){//錯誤!errorMsg = MultiLanguage.GetComment("FD", "STD002AND4", "errorF", tLanguageType) + Environment.NewLine + errorMsg;}return errorMsg;}#endregion#region CountBusinessLeaveHours[AjaxPro.AjaxMethod]public string CountBusinessLeaveHours(string strDtS, string strDtE, string userId) { DateTime dtS = Convert.ToDateTime(strDtS);DateTime dtE = Convert.ToDateTime(strDtE);if (dtS.ToString("yyyyMMdd") == dtE.ToString("yyyyMMdd")){WorkDateObj workDateObj =GetWorkDateDataObj(dtS.ToString("yyyy-MM-dd"), userId);double totalHours = workDateObj.CountWorkDayHours(dtS, dtE);DateTime dtS0 = new DateTime(dtS.Year, dtS.Month, dtS.Day);double perDayWorkHours = GetPerWorkHours(dtS0, userId);int day = Convert.ToInt32(Math.Floor(totalHours / perDayWorkHours));double hour = totalHours - perDayWorkHours * day;return day.ToString() + "@" + hour.ToString("##0.0");}else{DateTime dtS0 = new DateTime(dtS.Year, dtS.Month, dtS.Day);DateTime dtE0 = new DateTime(dtE.Year, dtE.Month, dtE.Day);//取得出差日之間的小時數double hoursBetween = 0;//大於一天才撈SQL 算BetweenTimeSpan ts = dtE0 - dtS0;if (ts.Days > 1){hoursBetween = CountLeaveDays(dtS0.AddDays(1),dtE0.AddDays(-1), userId);}WorkDateObj workDateObjS =GetWorkDateDataObj(dtS0.ToString("yyyy-MM-dd"), userId);WorkDateObj workDateObjE =GetWorkDateDataObj(dtE0.ToString("yyyy-MM-dd"), userId);double hoursS = workDateObjS.CountWorkDayHours(dtS, true);double hoursE = workDateObjE.CountWorkDayHours(dtE, false);double totalHours = hoursS + hoursBetween + hoursE;double perDayWorkHours = GetPerWorkHours(dtS0, userId);int day = Convert.ToInt32(Math.Floor(totalHours / perDayWorkHours));double hour = totalHours - perDayWorkHours * day;return day.ToString() + "@" + hour.ToString("##0.0");}}#endregion#region GetPerWorkHours 取得每天工作時數private double GetPerWorkHours(DateTime dt, string userId) {DBCommand dbCommand = DscDBData.GetDataDBCommand();string cmdTxt;cmdTxt = @"SELECT resaj005FROM EFNETDB..resajWHERE resaj002 = @resaj002AND resaj001 = (SELECT resak010FROM EFNETDB..resakWHERE resak001 = @userId)";dbCommand.AddParameter("resaj002", dt);dbCommand.AddParameter("userId", userId);DataTable dataTable = dbCommand.Query(cmdTxt);double hours = 0;if (dataTable.Rows.Count == 1){hours = Convert.ToDouble(dataTable.Rows[0]["resaj005"]);}return hours;}#endregion#region CountLeaveDays 計算出差總時數private double CountLeaveDays(DateTime dtS, DateTime dtE, string userId) { double hours = 0;DBCommand dbCommand = DscDBData.GetDataDBCommand();string cmdTxt;//2008/03/06:1.2.1.03:Joseph:A01-970305008:時間計算有誤cmdTxt = @"SELECT ISNULL( SUM(resaj005),0) AS leaveCountFROM EFNETDB..resajWHERE resaj002 >= @leaveDateS AND resaj002 <=@leaveDateEAND resaj001 = (SELECT resak010FROM EFNETDB..resakWHERE resak001 = @userId)";dbCommand.AddParameter("leaveDateS", dtS);dbCommand.AddParameter("leaveDateE", dtE);dbCommand.AddParameter("userId", userId);DataTable dt = dbCommand.Query(cmdTxt);if (dt.Rows.Count == 1){hours = Convert.ToDouble(dt.Rows[0]["leaveCount"]);}return hours;}#endregion#region GetWorkDateDataObj 取得行事曆物件///<summary>///取得行事曆物件///</summary>///<param name="workDate">工作天</param>///<param name="userId">使用者代號</param>///<returns></returns>private WorkDateObj GetWorkDateDataObj(string workDate, string userId) { try{DBCommand dbCommand = DscDBData.GetDataDBCommand(); string tSQL = " SELECT resaj003 as dateWorkS, resaj004 as dateWorkE, resaj006 as dateRestS,resaj007 as dateRestE,resaj.resaj002 FROM EFNETDB..resaj as resaj left join EFNETDB..resak as resak on resaj.resaj001=resak.resak010 WHERE resaj002 = '" + workDate + "' AND resak001 ='" + userId + "'";DataTable dt = dbCommand.Query(tSQL.ToString());// duration.Text="12";if (dt.Rows.Count > 0){DataRow dr = dt.Rows[0];WorkDateObj workDataObj = new WorkDateObj();workDataObj.dateWorkS = Convert.ToDateTime(dr["dateWorkS"]);workDataObj.dateWorkE = Convert.ToDateTime(dr["dateWorkE"]);workDataObj.dateRestS = Convert.ToDateTime(dr["dateRestS"]);workDataObj.dateRestE = Convert.ToDateTime(dr["dateRestE"]);return workDataObj;}else { return null; }}catch (Exception ex){throw ex;}}#endregion#region WorkDateObj 工作天物件(方便用於計算小時)///<summary>///工作天物件(方便用於計算小時)///</summary>class WorkDateObj{public DateTime dateWorkS;public DateTime dateWorkE;public DateTime dateRestS;public DateTime dateRestE;#region HoursAM 上午工作時數//上午工作時數public double HoursAM {get {TimeSpan ts = dateRestS - dateWorkS; //午休起- 上班起double hours = (ts.TotalMinutes) / 60.0;return hours;}}#endregion#region HoursPM 下午工作時數public double HoursPM {get {TimeSpan ts = dateWorkE - dateRestE; //上班訖- 午休訖double hours = (ts.TotalMinutes) / 60.0;return hours;}}#endregion#region ValidateBusinessLeaveDate 驗證出差日期是否合法(出差日期要在上班時間)//驗證出差日期是否合法(出差日期要在上班時間)public bool ValidateBusinessLeaveDate(DateTime dtWork) {//介於上班時間if ((dtWork >= dateWorkS) && (dtWork <= dateWorkE)){//而且不是在休息時間if ((dtWork <= dateRestS) || (dtWork >= dateRestE)){return true;}}return false;}#endregion#region CountWorkDayHours 計算工作小時(不同天)///<summary>///計算工作小時(不同天)///</summary>///<param name="dtWork">請假、出差工作時間</param>///<param name="IsWrokStart">是否為起始(否:截止)</param>///<returns></returns>public double CountWorkDayHours(DateTime dtWork, bool IsWrokStart) {//請假起if (IsWrokStart){//大於午休時間if (dtWork > dateRestE){TimeSpan ts = dateWorkE - dtWork; //下班- 出差時double hours = (ts.TotalMinutes) / 60.0;return hours;}else{TimeSpan ts = dateRestS - dtWork; //午休起- 出差+ 下午上班時間double hours = (ts.TotalMinutes) / 60.0;return hours + HoursPM;}}else{//大於午休時間if (dtWork > dateRestE){TimeSpan ts = dtWork - dateRestE; // 出差時-午休訖+ 上午上班時間double hours = (ts.TotalMinutes) / 60.0;return hours + HoursAM;}else{TimeSpan ts = dtWork - dateWorkS; //午休起- 出差時double hours = (ts.TotalMinutes) / 60.0;return hours;}}}#endregion#region CountWorkDayHours 計算工作小時(同一天)///<summary>///計算工作小時(同一天)///</summary>///<param name="dtWorkS">起始</param>///<param name="dtWorkE">截止</param>///<returns></returns>public double CountWorkDayHours(DateTime dtWorkS, DateTime dtWorkE) { //2008/03/06:Joseph:A01-970305008:時間計算有誤,判斷是否小於午休時間或大於午休結束時間if ((dtWorkS <= dateRestS && dtWorkE <= dateRestS) ||(dtWorkS >= dateRestE && dtWorkE >= dateRestE)){TimeSpan ts = dtWorkE - dtWorkS; //出差訖- 出差起double hours = (ts.TotalMinutes) / 60.0;return hours;}else{TimeSpan tsS = dateRestS - dtWorkS; //午休起- 出差起double hoursS = (tsS.TotalMinutes) / 60.0;TimeSpan tsE = dtWorkE - dateRestE; //出差訖- 午休訖double hoursE = (tsE.TotalMinutes) / 60.0;if (hoursE > 0) { return (hoursS + hoursE); }else {return hoursS;}}}#endregion}#endregion(步骤2)接着在代码中找到如下方法.protected override void settingClientFunction();在里面添加下列代码:(注意加粗部分的代码,一定要替换成对应控件的名称.)//起始時間//this.startdate.HtmImg.Attributes.Add("onclick", "if( validateDate() ){ computeDate(); }");this.startdate.TxtInput.Attributes.Add("onblur", "if( validateDate() ){ computeDate(); }");this.startdate.TxtInput.Attributes.Add("onchange", "AddtoHash('" +startdate.TxtInput.ClientID + "')");//截止時間//this.enddate.HtmImg.Attributes.Add("onclick", "if( validateDate() ){ computeDate(); }");this.enddate.TxtInput.Attributes.Add("onblur", "if( validateDate() ){ computeDate(); }");this.enddate.TxtInput.Attributes.Add("onchange", "AddtoHash('"+ enddate.TxtInput.ClientID + "')");(步骤3)最后在同名的脚本文件中添加以下代码:(同样,注意加粗部分代码,需要替换成相应的值.)function validateDate() {var errorMsg = '';var dateS =document.getElementById("MasterPage_MasterPageContent_startdate_txt").value;var dateE =document.getElementById("MasterPage_MasterPageContent_enddate_txt").value;var userId =document.getElementById("MasterPage_MasterPageContent_applicant_txt").value;// var langType =document.getElementById('MasterPage$MasterPageContent$hiddenLanguageType').value;if (dateS == "" || dateE == "") {return false;}if (dateS != '' && dateE != '') {//截至日期需要大于起始日期.if (dateS > dateE) {errorMsg = getI18NForSpecial('FD', 'STD002', 'MSG002','../../_Common/PlatFormUtil/KernelPage/I18N/I18NForJs.aspx')//var Edate =.dsc.easyflowDotNet.forms.OAHR003.GetEndDate(dateS).value//document.getElementById("MasterPage_MasterPageContent_enddate_txt").value = Edate;//alert(errorMsg);//return true}else {errorMsg =.dsc.easyflowDotNet.forms.OAHR003.ValidateInputDate(dateS, dateE).value;}}if (errorMsg != '') {alert(errorMsg);document.getElementById("MasterPage_MasterPageContent_leavedays_txt").value = ''; document.getElementById("MasterPage_MasterPageContent_leavehours_txt").value = '';return false;}return true;}//計算天數function computeDate() {//开始时间var dateS =document.getElementById("MasterPage_MasterPageContent_startdate_txt").value;//结束时间var dateE =document.getElementById("MasterPage_MasterPageContent_enddate_txt").value;//员工IDvar userId =document.getElementById("MasterPage_MasterPageContent_applicant_txt").value;var result =.dsc.easyflowDotNet.forms.OAHR003.CountBusinessLeaveHours(dateS, dateE, userId).value.split('@');document.getElementById("MasterPage_MasterPageContent_leavedays_txt").value = result[0];document.getElementById("MasterPage_MasterPageContent_leavehours_txt").value =result[1]; }。