一直想写个技术类的博文,怎耐技术有限,文采也不佳,所以一直拖到现在才开博客。对于博文应该怎么写,写成什么样还是不怎么懂,所以文章中可能出现一些错别字也会在所难免,技术上也说的不一样就对,权当用来做技术交流吧。
关于ext.net报表的布局参考了 雪雁的博客 《Ext.NET之动态绑定GridPanel》,大家也可以去该博客看,毕竟我这也是从他哪里学来的。
首先先来看效果吧。
截图没截全的,大概意思就是这么个意思,采用的是ext.net 强大的GridPane, 列是动态一个月的天数,分为2个头的,用来合并2列,ext.net官网的例子也差不多,但看的头大。
下面说说如何实现吧。
前台代码:
<ext:GridPanel ID="GridPanel1" AutoScroll="true" TrackMouseOver="true" runat="server" ColumnLines="true" StripeRows="true" AutoHeight="true" Icon="Date" Width="6300"> <TopBar> <ext:Toolbar ID="Toolbar1" runat="server"> <Items> <ext:Button ID="BtnSchedul" runat="server" Text="生成月排班计划" Icon="CogGo"> <Listeners> <Click Fn="BtnSchedul_OnClick" /> </Listeners> </ext:Button> <ext:Button ID="btnxls" runat="server" Text="导出Excel" Icon="PageExcel"> <Listeners> <Click Handler="submitValue(#{GridPanel1}, #{FormatType}, 'xls');" /> </Listeners> </ext:Button> <ext:Button ID="Button1" runat="server" Text="打印" Icon="Printer" OnClientClick="window.print();" /> </Items> </ext:Toolbar> </TopBar> <Store> <%--<ext:Store ID="Store1" ShowWarningOnFailure="false" AutoLoad="true" runat="server" />--%> <ext:Store ID="Store1" ShowWarningOnFailure="false" AutoLoad="true" runat="server" OnSubmitData="Store1_Submit" /> </Store> <LoadMask ShowMask="true" /> <ColumnModel ID="ctl120" /> <View> <ext:GroupingView ID="gvColumns" runat="server" /> </View> </ext:GridPanel>
后台代码:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { try { //获取数据源到DataTable中 DataTable Scheduldt = asdbll.BuildDataTable(Schedulds.Tables[0]); #region 绑定数据 BingData(Scheduldt.AsEnumerable().AsDataView(), GridPanel1, Store1); int RuleNum = asdbll.GetAllRule(Schedulds.Tables[0]).Count(); GridPanel1.Title = Year.ToString() + "年" + Month.ToString() + "月客运车间排班表"; #endregion #region 设置列头 if (GridPanel1.ColumnModel.Columns.Count >= 28) { GridPanel1.ColumnModel.Columns[0].Header = "作业区域"; for (int i = 0; i < GridPanel1.ColumnModel.Columns.Count - 2; i++) { if (RuleNum == 2) { GridPanel1.ColumnModel.Columns[i + 1].Header = "白班"; GridPanel1.ColumnModel.Columns[i + 2].Header = "夜班"; GridPanel1.ColumnModel.Columns[i + 1].Align = Alignment.Center; GridPanel1.ColumnModel.Columns[i + 2].Align = Alignment.Center; } else if (RuleNum == 3) { GridPanel1.ColumnModel.Columns[i + 1].Header = "早班"; GridPanel1.ColumnModel.Columns[i + 2].Header = "中班"; GridPanel1.ColumnModel.Columns[i + 3].Header = "晚班"; GridPanel1.ColumnModel.Columns[i + 1].Align = Alignment.Center; GridPanel1.ColumnModel.Columns[i + 2].Align = Alignment.Center; GridPanel1.ColumnModel.Columns[i + 3].Align = Alignment.Center; } i++; } } #endregion #region 设置合并的列头 var _headGroupRow = new HeaderGroupRow() { Columns = { new HeaderGroupColumn() { Header = "<font class='headRows1'></font>", Align = Alignment.Center, ColSpan = 1 } } }; for (int i = 1; i <= DateTime.DaysInMonth(Year, Month); i++) { _headGroupRow.Columns.Add(new HeaderGroupColumn() { Header = string.Format("<font class='headRows2'>{0}</font>", Month.ToString() + "月" + i.ToString() + "日"), Align = Alignment.Center, ColSpan = RuleNum }); } gvColumns.HeaderGroupRows.Add(_headGroupRow); #endregion } catch (Exception) { throw; } } } #region 生成字段和列,并绑定数据源 /// <summary> /// 生成字段和列,并绑定数据源 /// </summary> /// <param name="_rptData"></param> /// <param name="_gp"></param> /// <param name="_store"></param> private void BingData(System.Data.DataView _rptData, GridPanel _gp, Store _store) { var _jsonReader = new JsonReader(); foreach (DataColumn _dataColumn in _rptData.Table.Columns) { _jsonReader.Fields.Add(new RecordField(_dataColumn.ColumnName)); //创建列 var _column = new Column { Header = _dataColumn.ColumnName, DataIndex = _dataColumn.ColumnName, }; _column.Renderer.Args = new string[] { "value" }; _gp.ColumnModel.Columns.Add(_column); } _store.Reader.Add(_jsonReader); _store.DataSource = _rptData; _store.DataBind(); } #endregion
这里说2句吧,BingData方法主要是用来动态绑定数据源到store的,合并列是在Page_Load里写的,
#region 设置合并的列头 var _headGroupRow = new HeaderGroupRow() { Columns = { new HeaderGroupColumn() { Header = "<font class='headRows1'></font>", Align = Alignment.Center, ColSpan = 1 } } }; for (int i = 1; i <= DateTime.DaysInMonth(Year, Month); i++) { _headGroupRow.Columns.Add(new HeaderGroupColumn() { Header = string.Format("<font class='headRows2'>{0}</font>", Month.ToString() + "月" + i.ToString() + "日"), Align = Alignment.Center, ColSpan = RuleNum }); } gvColumns.HeaderGroupRows.Add(_headGroupRow); #endregion
因为这个项目后台数据访问是利用IBatisNet操作数据的,那个速度...还有就是本子也不给力!
一个月的数据显示出来我这里算了下,生成一年的计划花了5秒,数据显示花了10秒,IBatisNet连接访问花了15秒,业务处理花了2秒,加起来快30秒了,所以在用户进入这个页面的时候给了提示“亲,先去喝杯茶吧,马上就好~”。
好吧,写到这里,基本上贴的是代码,主要是不知道写什么好~大家如果看到有什么问题,提出来,大家一起讨论。