using BLL; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Data; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using NPOI.HSSF.Util; using NPOI.POIFS.Properties; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System.IO; using System.Security.Policy; using System.Threading; using MiniExcelLibs; namespace FineUIPro.Web.WeldingProcess.WeldingReport { public partial class PipelineTraceList : PageBase { public static DataTable source { get; set; } public static int percent { get; set; } public static string url { get; set; } [System.Web.Services.WebMethod] public static int getPercent() { return percent; } [System.Web.Services.WebMethod] public static string getUrl() { return url; } #region 加载 /// /// 加载页面 /// /// /// protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { this.ddlPageSize.SelectedValue = this.Grid1.PageSize.ToString(); BLL.Project_WorkAreaService.InitWorkAreaDropDownList(this.drpWorkAreaId, true, this.CurrUser.LoginProjectId, string.Empty, string.Empty, string.Empty, Resources.Lan.PleaseSelect);//区域 } } private DataTable GetDataTable() { List listStr = new List(); listStr.Add(new SqlParameter("@projectId", this.CurrUser.LoginProjectId)); if (drpWorkAreaId.SelectedValue != Const._Null && drpWorkAreaId.SelectedValue != null) { string[] areaList = drpWorkAreaId.SelectedValueArray; string workAreaIds = string.Join(",", areaList); listStr.Add(new SqlParameter("@workAreaIds", workAreaIds)); // listStr.Add(new SqlParameter("@workAreaId", this.drpWorkAreaId.SelectedValue)); } if (!string.IsNullOrEmpty(drpPipeLine.SelectedValue) && drpPipeLine.SelectedValue != Const._Null) { string[] pipeList = drpPipeLine.SelectedValueArray; string pipeLineIds = string.Join(",", pipeList); listStr.Add(new SqlParameter("@pipelineIds", pipeLineIds)); } else { listStr.Add(new SqlParameter("@pipelineIds", null)); } if (!string.IsNullOrEmpty(txtTestPackageNo.Text.Trim())) { listStr.Add(new SqlParameter("@TestPackageNo", '%'+txtTestPackageNo.Text.Trim()+"%")); } else { listStr.Add(new SqlParameter("@TestPackageNo", null)); } //if (!string.IsNullOrEmpty(this.drpWorkAreaId.Text.Trim())) //{ // listStr.Add(new SqlParameter("@pipelineCode", this.txtPipelineCode.Text.Trim())); //} //else //{ // listStr.Add(new SqlParameter("@pipelineCode", null)); //} SqlParameter[] parameter = listStr.ToArray(); DataTable dt = SQLHelper.GetDataTableRunProc("sp_rpt_JointComprehensive", parameter); return dt; } /// /// 绑定数据 /// private void BindGrid() { this.Grid1.RecordCount = source.Rows.Count; var table = this.GetPagedDataTable(Grid1, source); Grid1.DataSource = table; Grid1.DataBind(); } protected void drpWorkAreaId_OnSelectedIndexChanged(object sender, EventArgs e) { string[] workAreaIds = drpWorkAreaId.SelectedValueArray; if (workAreaIds.Length == 1) { BLL.Pipeline_PipelineService.InitPipelineDropDownList(drpPipeLine, workAreaIds[0], Resources.Lan.PleaseSelect); } } /// /// 改变索引事件 /// /// /// protected void Grid1_PageIndexChange(object sender, GridPageEventArgs e) { BindGrid(); } /// /// 分页下拉选择事件 /// /// /// protected void ddlPageSize_SelectedIndexChanged(object sender, EventArgs e) { Grid1.PageSize = Convert.ToInt32(ddlPageSize.SelectedValue); BindGrid(); } /// /// 排序 /// /// /// protected void Grid1_Sort(object sender, FineUIPro.GridSortEventArgs e) { this.BindGrid(); } #endregion #region 统计按钮事件 /// /// 统计 /// /// /// protected void BtnAnalyse_Click(object sender, EventArgs e) { source = GetDataTable(); BindGrid(); } #endregion #region 导出按钮 /// 导出按钮 /// /// /// protected void btnOut_Click(object sender, EventArgs e) { percent = 0; url = ""; Thread t = new Thread(new ThreadStart(() => { Export2(); })); t.Start(); PageContext.RegisterStartupScript("showProcessBar()"); //Export2(); } private void Export() { string templatePath = Funs.RootPath + @"File\Excel\HJGL_DataOut\管道追溯表.xlsx"; string path = Funs.RootPath + @"File\Excel\Temp\管道追溯表.xlsx"; path = path.Replace(".xlsx", string.Format("{0:yyyy-MM-dd-HH-mm}", DateTime.Now) + ".xlsx"); DataTable tb = GetDataTable(); DataColumn dc = null; dc = tb.Columns.Add("Index", Type.GetType("System.Int32")); dc = tb.Columns.Add("WeldSilk", Type.GetType("System.String")); dc = tb.Columns.Add("WeldFlux", Type.GetType("System.String")); int totalNum = tb.Rows.Count; var rowIndex = 1; foreach (DataRow row in tb.Rows) { row["Index"] = row.Table.Rows.IndexOf(row) + 1; row["WeldSilk"] = ConvertWeldSilk(row["WeldSilkId"]); row["WeldFlux"] = ConvertWeldFlux(row["WeldSilkId"]); if ((int)(90 * (rowIndex) / totalNum) > percent) { percent = (int)(100 * (rowIndex) / totalNum); } rowIndex++; } tb.TableName = "Data"; var value = new Dictionary() { ["Data"] = tb, }; MiniExcel.SaveAsByTemplate(path, templatePath, value); percent = 100; url = path.Replace(Server.MapPath("~/"), ""); /*string fileName = "管道追溯表.xlsx"; FileInfo info = new FileInfo(path); long fileSize = info.Length; System.Web.HttpContext.Current.Response.Clear(); System.Web.HttpContext.Current.Response.ContentType = "application/x-zip-compressed"; System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8)); System.Web.HttpContext.Current.Response.AddHeader("Content-Length", fileSize.ToString()); System.Web.HttpContext.Current.Response.TransmitFile(path, 0, fileSize); System.Web.HttpContext.Current.Response.Flush(); System.Web.HttpContext.Current.Response.Close(); File.Delete(path);*/ } private void Export2() { string rootPath = Server.MapPath("~/") + Const.ExcelUrl; //模板文件 string TempletFileName = rootPath + "HJGL_DataOut\\管道追溯表.xlsx"; //导出文件 string filePath = rootPath + "Temp\\" + DateTime.Now.ToString("yyyyMMddhhmmss") + "\\"; if (!Directory.Exists(filePath)) { Directory.CreateDirectory(filePath); } string ReportFileName = filePath + "管道追溯表" + DateTime.Now.ToString("yyyyMMddhhmmss") + ".xlsx"; //string ReportFileName = filePath + "out.xlsx"; FileStream file = new FileStream(TempletFileName, FileMode.Open, FileAccess.Read); XSSFWorkbook hssfworkbook = new XSSFWorkbook(file); #region JointComprehensive XSSFSheet reportModel = (XSSFSheet)hssfworkbook.GetSheet("Sheet1"); XSSFFont cs_content_Font1 = (XSSFFont)hssfworkbook.CreateFont(); //创建字体 cs_content_Font1.FontName = "sans-serif";//字体 cs_content_Font1.FontHeightInPoints = 9; //字体大小 ICellStyle style = hssfworkbook.CreateCellStyle(); style.SetFont(cs_content_Font1); style.BorderDiagonalLineStyle=NPOI.SS.UserModel.BorderStyle.Thin; style.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin; style.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin; style.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin; style.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin; XSSFFont cs_content_Font = (XSSFFont)hssfworkbook.CreateFont(); //创建字体 cs_content_Font.FontName = "sans-serif";//字体 cs_content_Font.FontHeightInPoints = 10; //字体大小 cs_content_Font.Color = HSSFColor.Red.Index; IDataFormat dataformat = hssfworkbook.CreateDataFormat(); ICellStyle styleDate = hssfworkbook.CreateCellStyle(); styleDate.SetFont(cs_content_Font1); styleDate.DataFormat = dataformat.GetFormat("yyyy-mm-dd"); // 排序 DataTable tb = GetDataTable(); DataColumn dc = null; dc = tb.Columns.Add("Index", Type.GetType("System.Int32")); dc = tb.Columns.Add("WeldSilk", Type.GetType("System.String")); dc = tb.Columns.Add("WeldFlux", Type.GetType("System.String")); int totalNum = tb.Rows.Count; if (tb.Rows.Count > 0) { var rowIndex = 2; foreach (DataRow row in tb.Rows) { row["Index"] = row.Table.Rows.IndexOf(row) + 1; row["WeldSilk"] = ConvertWeldSilk(row["WeldSilkId"]); row["WeldFlux"] = ConvertWeldFlux(row["WeldSilkId"]); if (reportModel.GetRow(rowIndex) == null) reportModel.CreateRow(rowIndex); #region 列赋值 //序号 if (reportModel.GetRow(rowIndex).GetCell(0) == null) reportModel.GetRow(rowIndex).CreateCell(0); reportModel.GetRow(rowIndex).GetCell(0).SetCellValue((row["Index"].ToString()).ToString()); reportModel.GetRow(rowIndex).GetCell(0).CellStyle = style; //将字体绑定到样式 // 区域 if (reportModel.GetRow(rowIndex).GetCell(1) == null) reportModel.GetRow(rowIndex).CreateCell(1); reportModel.GetRow(rowIndex).GetCell(1).SetCellValue(row["WorkAreaCode"].ToString()); reportModel.GetRow(rowIndex).GetCell(1).CellStyle = style; // 试压包号 if (reportModel.GetRow(rowIndex).GetCell(2) == null) reportModel.GetRow(rowIndex).CreateCell(2); reportModel.GetRow(rowIndex).GetCell(2).SetCellValue(row["TestPackageNo"].ToString()); reportModel.GetRow(rowIndex).GetCell(2).CellStyle = style; // 单线图号 if (reportModel.GetRow(rowIndex).GetCell(3) == null) reportModel.GetRow(rowIndex).CreateCell(3); reportModel.GetRow(rowIndex).GetCell(3).SetCellValue(row["SingleNumber"].ToString()); reportModel.GetRow(rowIndex).GetCell(3).CellStyle = style; // 管线号 if (reportModel.GetRow(rowIndex).GetCell(4) == null) reportModel.GetRow(rowIndex).CreateCell(4); reportModel.GetRow(rowIndex).GetCell(4).SetCellValue(row["PipelineCode"].ToString()); reportModel.GetRow(rowIndex).GetCell(4).CellStyle = style; // PIPClassCode if (reportModel.GetRow(rowIndex).GetCell(5) == null) reportModel.GetRow(rowIndex).CreateCell(5); reportModel.GetRow(rowIndex).GetCell(5).SetCellValue(row["PIPClassCode"].ToString()); reportModel.GetRow(rowIndex).GetCell(5).CellStyle = style; // DrawingsNum if (reportModel.GetRow(rowIndex).GetCell(6) == null) reportModel.GetRow(rowIndex).CreateCell(6); reportModel.GetRow(rowIndex).GetCell(6).SetCellValue(row["DrawingsNum"].ToString()); reportModel.GetRow(rowIndex).GetCell(6).CellStyle = style; // PageNum if (reportModel.GetRow(rowIndex).GetCell(7) == null) reportModel.GetRow(rowIndex).CreateCell(7); reportModel.GetRow(rowIndex).GetCell(7).SetCellValue(row["PageNum"].ToString()); reportModel.GetRow(rowIndex).GetCell(7).CellStyle = style; // WeldJointCode if (reportModel.GetRow(rowIndex).GetCell(8) == null) reportModel.GetRow(rowIndex).CreateCell(8); reportModel.GetRow(rowIndex).GetCell(8).SetCellValue(row["WeldJointCode"].ToString()); reportModel.GetRow(rowIndex).GetCell(8).CellStyle = style; // WeldTypeCode if (reportModel.GetRow(rowIndex).GetCell(9) == null) reportModel.GetRow(rowIndex).CreateCell(9); reportModel.GetRow(rowIndex).GetCell(9).SetCellValue(row["WeldTypeCode"].ToString()); reportModel.GetRow(rowIndex).GetCell(9).CellStyle = style; // WeldingLocationCode if (reportModel.GetRow(rowIndex).GetCell(10) == null) reportModel.GetRow(rowIndex).CreateCell(10); reportModel.GetRow(rowIndex).GetCell(10).SetCellValue(row["WeldingLocationCode"].ToString()); reportModel.GetRow(rowIndex).GetCell(10).CellStyle = style; // Specification if (reportModel.GetRow(rowIndex).GetCell(11) == null) reportModel.GetRow(rowIndex).CreateCell(11); reportModel.GetRow(rowIndex).GetCell(11).SetCellValue(row["Specification"].ToString()); reportModel.GetRow(rowIndex).GetCell(11).CellStyle = style; // MaterialCode1 if (reportModel.GetRow(rowIndex).GetCell(12) == null) reportModel.GetRow(rowIndex).CreateCell(12); reportModel.GetRow(rowIndex).GetCell(12).SetCellValue(row["MaterialCode1"].ToString()); reportModel.GetRow(rowIndex).GetCell(12).CellStyle = style; // MaterialCode2 if (reportModel.GetRow(rowIndex).GetCell(13) == null) reportModel.GetRow(rowIndex).CreateCell(13); reportModel.GetRow(rowIndex).GetCell(13).SetCellValue(row["MaterialCode2"].ToString()); reportModel.GetRow(rowIndex).GetCell(13).CellStyle = style; // PipeAssembly1 if (reportModel.GetRow(rowIndex).GetCell(14) == null) reportModel.GetRow(rowIndex).CreateCell(14); reportModel.GetRow(rowIndex).GetCell(14).SetCellValue(row["PipeAssembly1"].ToString()); reportModel.GetRow(rowIndex).GetCell(14).CellStyle = style; // PipeAssembly2 if (reportModel.GetRow(rowIndex).GetCell(15) == null) reportModel.GetRow(rowIndex).CreateCell(15); reportModel.GetRow(rowIndex).GetCell(15).SetCellValue(row["PipeAssembly2"].ToString()); reportModel.GetRow(rowIndex).GetCell(15).CellStyle = style; // HeartNo1 if (reportModel.GetRow(rowIndex).GetCell(16) == null) reportModel.GetRow(rowIndex).CreateCell(16); reportModel.GetRow(rowIndex).GetCell(16).SetCellValue(row["HeartNo1"].ToString()); reportModel.GetRow(rowIndex).GetCell(16).CellStyle = style; // HeartNo2 if (reportModel.GetRow(rowIndex).GetCell(17) == null) reportModel.GetRow(rowIndex).CreateCell(17); reportModel.GetRow(rowIndex).GetCell(17).SetCellValue(row["HeartNo2"].ToString()); reportModel.GetRow(rowIndex).GetCell(17).CellStyle = style; // BackingWelderCode if (reportModel.GetRow(rowIndex).GetCell(18) == null) reportModel.GetRow(rowIndex).CreateCell(18); reportModel.GetRow(rowIndex).GetCell(18).SetCellValue(row["BackingWelderCode"].ToString()); reportModel.GetRow(rowIndex).GetCell(18).CellStyle = style; // CoverWelderCode if (reportModel.GetRow(rowIndex).GetCell(19) == null) reportModel.GetRow(rowIndex).CreateCell(19); reportModel.GetRow(rowIndex).GetCell(19).SetCellValue(row["CoverWelderCode"].ToString()); reportModel.GetRow(rowIndex).GetCell(19).CellStyle = style; // WeldingMethodName if (reportModel.GetRow(rowIndex).GetCell(20) == null) reportModel.GetRow(rowIndex).CreateCell(20); reportModel.GetRow(rowIndex).GetCell(20).SetCellValue(row["WeldingMethodName"].ToString()); reportModel.GetRow(rowIndex).GetCell(20).CellStyle = style; // MediumName if (reportModel.GetRow(rowIndex).GetCell(21) == null) reportModel.GetRow(rowIndex).CreateCell(21); reportModel.GetRow(rowIndex).GetCell(21).SetCellValue(row["MediumName"].ToString()); reportModel.GetRow(rowIndex).GetCell(21).CellStyle = style; // WeldingDate if (reportModel.GetRow(rowIndex).GetCell(22) == null) reportModel.GetRow(rowIndex).CreateCell(22); reportModel.GetRow(rowIndex).GetCell(22).SetCellValue(row["WeldingDate"].ToString()); reportModel.GetRow(rowIndex).GetCell(22).CellStyle = style; // DetectionTypeCode if (reportModel.GetRow(rowIndex).GetCell(23) == null) reportModel.GetRow(rowIndex).CreateCell(23); reportModel.GetRow(rowIndex).GetCell(23).SetCellValue(row["DetectionTypeCode"].ToString()); reportModel.GetRow(rowIndex).GetCell(23).CellStyle = style; // if_dk if (reportModel.GetRow(rowIndex).GetCell(24) == null) reportModel.GetRow(rowIndex).CreateCell(24); reportModel.GetRow(rowIndex).GetCell(24).SetCellValue(row["if_dk"].ToString()); reportModel.GetRow(rowIndex).GetCell(24).CellStyle = style; // DetectionRateCode if (reportModel.GetRow(rowIndex).GetCell(25) == null) reportModel.GetRow(rowIndex).CreateCell(25); reportModel.GetRow(rowIndex).GetCell(25).SetCellValue(row["DetectionRateCode"].ToString()); reportModel.GetRow(rowIndex).GetCell(25).CellStyle = style; // AcceptLevel if (reportModel.GetRow(rowIndex).GetCell(26) == null) reportModel.GetRow(rowIndex).CreateCell(26); reportModel.GetRow(rowIndex).GetCell(26).SetCellValue(row["AcceptLevel"].ToString()); reportModel.GetRow(rowIndex).GetCell(26).CellStyle = style; // NDEReportNo if (reportModel.GetRow(rowIndex).GetCell(27) == null) reportModel.GetRow(rowIndex).CreateCell(27); reportModel.GetRow(rowIndex).GetCell(27).SetCellValue(row["NDEReportNo"].ToString()); reportModel.GetRow(rowIndex).GetCell(27).CellStyle = style; // IsHotProess if (reportModel.GetRow(rowIndex).GetCell(28) == null) reportModel.GetRow(rowIndex).CreateCell(28); reportModel.GetRow(rowIndex).GetCell(28).SetCellValue(row["IsHotProess"].ToString()); reportModel.GetRow(rowIndex).GetCell(28).CellStyle = style; // HotReportCode if (reportModel.GetRow(rowIndex).GetCell(29) == null) reportModel.GetRow(rowIndex).CreateCell(29); reportModel.GetRow(rowIndex).GetCell(29).SetCellValue(row["HotReportCode"].ToString()); reportModel.GetRow(rowIndex).GetCell(29).CellStyle = style; // WeldSilk if (reportModel.GetRow(rowIndex).GetCell(30) == null) reportModel.GetRow(rowIndex).CreateCell(30); reportModel.GetRow(rowIndex).GetCell(30).SetCellValue(row["WeldSilk"].ToString()); reportModel.GetRow(rowIndex).GetCell(30).CellStyle = style; //WMT_MatCode if (reportModel.GetRow(rowIndex).GetCell(31) == null) reportModel.GetRow(rowIndex).CreateCell(31); reportModel.GetRow(rowIndex).GetCell(31).SetCellValue(row["WMT_MatCode"].ToString()); reportModel.GetRow(rowIndex).GetCell(31).CellStyle = style; // WeldFlux if (reportModel.GetRow(rowIndex).GetCell(32) == null) reportModel.GetRow(rowIndex).CreateCell(32); reportModel.GetRow(rowIndex).GetCell(32).SetCellValue(row["WeldFlux"].ToString()); reportModel.GetRow(rowIndex).GetCell(32).CellStyle = style; // Remark if (reportModel.GetRow(rowIndex).GetCell(33) == null) reportModel.GetRow(rowIndex).CreateCell(33); reportModel.GetRow(rowIndex).GetCell(33).SetCellValue(row["Remark"].ToString()); reportModel.GetRow(rowIndex).GetCell(33).CellStyle = style; #endregion if ((int)(90 * (rowIndex) / totalNum) > percent) { percent = (int)(100 * (rowIndex) / totalNum); } rowIndex++; } } #endregion reportModel.ForceFormulaRecalculation = true; using (FileStream filess = System.IO.File.OpenWrite(ReportFileName)) { hssfworkbook.Write(filess); } percent = 100; url = ReportFileName.Replace(Server.MapPath("~/"), ""); //FileInfo filet = new FileInfo(ReportFileName); //Response.Clear(); //Response.Charset = "GB2312"; //Response.ContentEncoding = System.Text.Encoding.UTF8; //// 添加头信息,为"文件下载/另存为"对话框指定默认文件名 //Response.AddHeader("Content-Disposition", "attachment; filename=焊口综合分析_" + Server.UrlEncode(DateTime.Now.ToString("yyyyMMddhhmmss") + ".xlsx")); //// 添加头信息,指定文件大小,让浏览器能够显示下载进度 //Response.AddHeader("Content-Length", filet.Length.ToString()); //// 指定返回的是一个不能被客户端读取的流,必须被下载 //Response.ContentType = "application/ms-excel"; //// 把文件流发送到客户端 //Response.WriteFile(filet.FullName); //// 停止页面的执行 //Response.End(); } /// /// 导出方法 /// /// /// //private string GetGridTableHtml(Grid grid) //{ // StringBuilder sb = new StringBuilder(); // grid.PageSize = 500000; // BindGrid(); // sb.Append(""); // sb.Append(""); // sb.Append(""); // foreach (GridColumn column in grid.Columns) // { // sb.AppendFormat("", column.HeaderText); // } // sb.Append(""); // foreach (GridRow row in grid.Rows) // { // sb.Append(""); // foreach (GridColumn column in grid.Columns) // { // string html = row.Values[column.ColumnIndex].ToString(); // if (column.ColumnID == "tfNumber") // { // html = (row.FindControl("labNumber") as AspNet.Label).Text; // } // if (column.ColumnID == "tfIsHotProess") // { // html = (row.FindControl("lblIsHotProess") as AspNet.Label).Text; // } // if (column.ColumnID == "tfif_dk") // { // html = (row.FindControl("lblif_dk") as AspNet.Label).Text; // } // sb.AppendFormat("", html); // } // sb.Append(""); // } // sb.Append("
{0}
{0}
"); // return sb.ToString(); //} #endregion #region 格式化字符串 /// /// 是否热处理 /// /// /// protected string ConvertIsHotProess(object isHotProess) { if (isHotProess != null) { if (isHotProess.ToString() == "True") { return Resources.Lan.Yes; } else { return Resources.Lan.No; } } return null; } /// /// 是否点口 /// /// /// protected string Convertif_dk(object if_dk) { if (if_dk != null) { if (if_dk.ToString() == "1") { return Resources.Lan.Yes; } else { return Resources.Lan.No; } } return null; } protected string ConvertWeldSilk(object WeldSilkId) { string weldSilkName = string.Empty; if (WeldSilkId != null) { string[] weldSilkIds = WeldSilkId.ToString().Split(','); if (weldSilkIds.Count() > 0) { foreach (string s in weldSilkIds) { var silk = BLL.Base_ConsumablesService.GetConsumablesByConsumablesId(s); if (silk != null) { weldSilkName = weldSilkName + silk.ConsumablesName + ','; } } if (weldSilkName.Length > 0) { weldSilkName = weldSilkName.Substring(0, weldSilkName.Length - 1); } } } return weldSilkName; } protected string ConvertWeldFlux(object WeldSilkId) { string weldFlux = string.Empty; string[] weldSilkIds = WeldSilkId.ToString().Split(','); if (weldSilkIds.Count() > 0) { foreach (string s in weldSilkIds) { var silk = BLL.Base_ConsumablesService.GetConsumablesByConsumablesId(s); if (silk != null && !string.IsNullOrEmpty(silk.UserFlux)) { weldFlux = weldFlux + silk.UserFlux + ','; } } if (weldFlux.Length > 0) { weldFlux = weldFlux.Substring(0, weldFlux.Length - 1); } } return weldFlux; } #endregion } }