ext.net报表布局
一直想写个技术类的博文,怎耐技术有限,文采也不佳,所以一直拖到现在才开博客。对于博文应该怎么写,写成什么样还是不怎么懂,所以文章中可能出现一些错别字也会在所难免,技术上也说的不一样就对,权当用来做技术交流吧。
关于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秒了,所以在用户进入这个页面的时候给了提示“亲,先去喝杯茶吧,马上就好~”。
好吧,写到这里,基本上贴的是代码,主要是不知道写什么好~大家如果看到有什么问题,提出来,大家一起讨论。
浙公网安备 33010602011771号