自定义分页组件,数据量比较少的时候可以用DataTable作为参数
using
System;
using System.IO;
using System.Xml;
using System.Text;
using System.Data;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Design;
[assembly:TagPrefix( " JJ.Web.UI " , " JJ " )]
namespace JJ.Web.UI
... {
/**//// <summary>
/// JJDZDataGrid 的摘要说明。
/// </summary>
[ToolboxData("<{0}:dtDataGrid runat=server></{0}:dtDataGrid>")]
public class dtDataGrid : DataGrid
...{
//所有数据
private DataTable dtDataTable;
//当前页数据
private DataTable dtDataView;
//翻页数据
private TableInfo tiTableInfo;
//保存的文件窗口
private string sSaveWindow;
//保存文件的路径
private string sSavePath;
//EnableViewState提示信息
private string sViewState = "<font color='##FF0000'>控件属性EnableViewState现在被设置为false,无法实现翻页及导出功能!</font>";
//行数过多提示信息
private string sMoreRow = "<font color='##FF0000'>查询数据行数过多,实现翻页及导出功能将十分缓慢!</font>";
[
Description("获得或者设置是否显示保存按钮"),
Category("自定义类别"),
Bindable(true),
DefaultValue(true)
]
public virtual bool IsShowSave
...{
get
...{
object b = (object)ViewState["IsShowSave"];
return (b == null) ? true : (bool)b;
}
set...{this.ViewState["IsShowSave"] = value;}
}
[
Description("获得或者设置是否显示合计"),
Category("自定义类别"),
Bindable(true),
DefaultValue(false)
]
public virtual bool IsShowSum
...{
get
...{
object b = (object)ViewState["IsShowSum"];
return (b == null) ? false : (bool)b;
}
set...{this.ViewState["IsShowSum"] = value;}
}
[
Description("获得或者设置显示合计的字段"),
Category("自定义类别"),
Bindable(true),
DefaultValue("")
]
public virtual string SumColumn
...{
get
...{
string s = (string)ViewState["SumColumn"];
return (s == null) ? "" : s;
}
set...{this.ViewState["SumColumn"] = value;}
}
[
Description("获得或者设置标题的字段"),
Category("自定义类别"),
Bindable(true),
DefaultValue("")
]
public virtual string Title
...{
get
...{
string s = (string)ViewState["Title"];
return (s == null) ? "" : s;
}
set...{this.ViewState["Title"] = value;}
}
/**//// <summary>
/// 初始化
/// </summary>
public dtDataGrid():base()
...{
this.dtDataView = new DataTable();
this.sSaveWindow = "";
this.sSavePath = "JJDZFILES";
}
/**//// <summary>
/// 退出
/// </summary>
public override void Dispose()
...{
if(dtDataTable != null)
dtDataTable.Dispose();
if(dtDataView != null)
dtDataView.Dispose();
base.Dispose();
}
/**//****************************
/// <summary>
/// OnInit控件初始化
/// </summary>
/// <param name="e"></param>
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
}
*****************************/
/**//// <summary>
/// LoadViewState取缓存信息
/// </summary>
/// <param name="savedState"></param>
protected override void LoadViewState(object savedState)
...{
base.LoadViewState(savedState);
this.dtDataTable = (DataTable)this.ViewState["DataSource"];
this.tiTableInfo = (TableInfo)this.ViewState["TableInfo"];
}
/**//// <summary>
/// OnItemCreated
/// </summary>
/// <param name="e"></param>
protected override void OnItemCreated(DataGridItemEventArgs e)
...{
// 为标题定义显示风格
if(e.Item.ItemType == ListItemType.Header)
...{
e.Item.HorizontalAlign = HorizontalAlign.Center;
}
// 为分页区域添加自定义分页控件
if(e.Item.ItemType == ListItemType.Pager)
...{
e.Item.Cells[0].Controls.Clear();
this.CreatePager(e.Item.Cells[0]);
e.Item.BackColor = System.Drawing.Color.AliceBlue;
}
base.OnItemCreated(e);
}
/**//// <summary>
/// DataBind
/// </summary>
public override void DataBind()
...{
//保存数据到缓存
this.dtDataTable = (DataTable)this.DataSource;
this.ViewState["DataSource"] = this.dtDataTable;
//没有指定数据源
if(this.dtDataTable == null)
return;
//保存页数数据
if(this.tiTableInfo == null)
...{
this.tiTableInfo = new TableInfo();
this.tiTableInfo.AllowPaging = this.AllowPaging;
this.tiTableInfo.PageSize = this.PageSize;
}
this.tiTableInfo.CurrentPageIndex = this.CurrentPageIndex;
this.tiTableInfo.RecordCount = this.dtDataTable.Rows.Count;
this.tiTableInfo.PageCount = Convert.ToInt32(Math.Ceiling(this.dtDataTable.Rows.Count * 1.0 / this.tiTableInfo.PageSize));
this.ViewState["TableInfo"] = this.tiTableInfo;
//默认属性
this.AllowPaging = true;
this.ShowHeader = true;
this.ShowFooter = false;
this.GetCurPageData();
this.DataSource = this.dtDataView;
base.DataBind();
}
/**//// <summary>
/// OnItemDataBound
/// </summary>
/// <param name="e"></param>
protected override void OnItemDataBound(DataGridItemEventArgs e)
...{
base.OnItemDataBound (e);
if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
...{
e.Item.Attributes.Add("onmouseover","this.bgColor='#C1D2EE'");
e.Item.Attributes.Add("onmouseout","this.bgColor='#FFFFFF'");
for(int i = 0; i < e.Item.Cells.Count; i++)
...{
string sDataType = ((System.Data.DataRowView)e.Item.DataItem).Row.ItemArray[i].GetType().FullName;
if((sDataType == "System.Int16")||(sDataType == "System.Int32")||(sDataType == "System.Int64")||
(sDataType == "System.UInt16")||(sDataType == "System.UInt32")||(sDataType == "System.UInt64")||
(sDataType == "System.Decimal")||(sDataType == "System.Double")||(sDataType == "System.Single"))
...{
e.Item.Cells[i].HorizontalAlign = HorizontalAlign.Right;
}
}
}
}
/**//// <summary>
/// SaveViewState保存缓存信息
/// </summary>
/// <param name="savedState"></param>
protected override object SaveViewState()
...{
return base.SaveViewState();
}
/**//*****************************************
/// <summary>
/// 将此控件呈现给指定的输出参数。
/// </summary>
/// <param name="output"> 要写出到的 HTML 编写器 </param>
protected override void Render(HtmlTextWriter writer)
{
base.Render(writer);
}
********************************************/
/**//// <summary>
/// RenderContents
/// </summary>
/// <param name="writer"></param>
protected override void RenderContents(HtmlTextWriter writer)
...{
base.RenderContents(writer);
//保存数据时弹出窗口保存文件
if(this.IsShowSave)
writer.Write(this.sSaveWindow);
//EnableViewState提示信息
if(!this.EnableViewState)
writer.Write(this.sViewState);
if(this.tiTableInfo != null)
if(this.dtDataTable.Rows.Count > 1000)
writer.Write(this.sMoreRow);
}
/**//// <summary>
/// 当DataGrid上有动作的时候激发,这里值捕捉分页的命令,所以在使用的时候最好你的按钮的CommandName和这里面的一样
/// </summary>
/// <param name="e"></param>
protected override void OnItemCommand(DataGridCommandEventArgs e)
...{
string strCommandName = e.CommandName;
if(e.CommandName == null)
return;
strCommandName = string.IsInterned(strCommandName);
switch(e.CommandName)
...{
case "FirstPAGE":
...{
this.GoToPage(0);
break;
}
case "PrevPAGE":
...{
this.GoToPage(Math.Max((this.tiTableInfo.CurrentPageIndex - 1), 0));
break;
}
case "NextPAGE":
...{
this.GoToPage(Math.Min((this.tiTableInfo.CurrentPageIndex + 1), (this.tiTableInfo.PageCount - 1)));
break;
}
case "LastPAGE":
...{
this.GoToPage((this.tiTableInfo.PageCount - 1));
break;
}
}
base.OnItemCommand(e);
}
/**//// <summary>
/// 跳转到指定的页
/// </summary>
/// <param name="pageIndex"></param>
private void GoToPage(int pageIndex)
...{
this.tiTableInfo.CurrentPageIndex = pageIndex;
this.GetCurPageData();
this.DataSource = this.dtDataView;
base.DataBind();
}
/**//// <summary>
/// 取当前显示页面数据到DataView
/// </summary>
private void GetCurPageData()
...{
//是否分页
if(!this.tiTableInfo.AllowPaging)
...{
//多一行为合计预留
this.PageSize = this.dtDataTable.Rows.Count + 1;
this.dtDataView = this.dtDataTable.Copy();
}
else
...{
//多两行,为本页合计与总合计预留
this.PageSize = this.tiTableInfo.PageSize + 2;
//取当前页的数据
this.dtDataView = this.dtDataTable.Clone();
for(int i = 0; i < this.tiTableInfo.PageSize; i++)
...{
if((i + this.tiTableInfo.CurrentPageIndex * this.tiTableInfo.PageSize) < this.dtDataTable.Rows.Count)
this.dtDataView.ImportRow(this.dtDataTable.Rows[i + this.tiTableInfo.CurrentPageIndex * this.tiTableInfo.PageSize]);
}
}
//显示合计
if(this.IsShowSum)
...{
//合计的列
string[] arrSumColumn = this.SumColumn.Split('|');
//分页合计与总合计的值
long[] iSumValue = new long[arrSumColumn.Length];
long[] iPageSumValue = new long[arrSumColumn.Length];
double[] dSumValue = new double[arrSumColumn.Length];
double[] dPageSumValue = new double[arrSumColumn.Length];
int iStringColumn = -1;
DataRow row;
//计算合计值
for(int i = 0; i < arrSumColumn.Length; i++)
...{
//判断当前列名是否在数据表中
if(this.dtDataView.Columns.Contains(arrSumColumn[i]))
...{
string sDataType = this.dtDataView.Columns[arrSumColumn[i]].DataType.FullName;
//计算整数
if((sDataType == "System.Int16")||(sDataType == "System.Int32")||(sDataType == "System.Int64")||
(sDataType == "System.UInt16")||(sDataType == "System.UInt32")||(sDataType == "System.UInt64"))
...{
//当前页合计数
iPageSumValue[i] = 0;
for(int j = 0; j < this.dtDataView.Rows.Count; j++)
...{
iPageSumValue[i] += Convert.ToInt64(this.dtDataView.Rows[j][arrSumColumn[i]]);
}
//总合计数
iSumValue[i] = 0;
for(int j = 0; j < this.dtDataTable.Rows.Count; j++)
...{
iSumValue[i] += Convert.ToInt64(this.dtDataTable.Rows[j][arrSumColumn[i]]);
}
}
//计算小数
if((sDataType == "System.Decimal")||(sDataType == "System.Double")||(sDataType == "System.Single"))
...{
//当前页合计数
dPageSumValue[i] = 0.0;
for(int j = 0; j < this.dtDataView.Rows.Count; j++)
...{
dPageSumValue[i] += Convert.ToDouble(this.dtDataView.Rows[j][arrSumColumn[i]]);
}
//总合计数
dSumValue[i] = 0.0;
for(int j = 0; j < this.dtDataTable.Rows.Count; j++)
...{
dSumValue[i] += Convert.ToDouble(this.dtDataTable.Rows[j][arrSumColumn[i]]);
}
}
}
}
//取得第一列String字段编号,用于放置“合计”
for(int i = 0; i < this.dtDataView.Columns.Count; i++)
...{
string sDataType = this.dtDataView.Columns[i].DataType.FullName;
if(this.dtDataView.Columns[i].DataType.FullName == "System.String")
...{
iStringColumn = i;
break;
}
}
//判断是否有本页合计
if((this.tiTableInfo.AllowPaging) && (this.tiTableInfo.PageCount > 1))
...{
row = this.dtDataView.NewRow();
row.BeginEdit();
if(iStringColumn >= 0)
row[iStringColumn] = "本页合计";
//按对应的列放置合计数
for(int i = 0; i < arrSumColumn.Length; i++)
...{
if(this.dtDataView.Columns.Contains(arrSumColumn[i]))
...{
row[arrSumColumn[i]] = Math.Max(iPageSumValue[i], dPageSumValue[i]);
}
}
row.EndEdit();
this.dtDataView.Rows.Add(row);
}
//汇总和计
row = this.dtDataView.NewRow();
row.BeginEdit();
if(iStringColumn >= 0)
row[iStringColumn] = "汇总和计";
//按对应的列放置合计数
for(int i = 0; i < arrSumColumn.Length; i++)
...{
if(this.dtDataView.Columns.Contains(arrSumColumn[i]))
...{
row[arrSumColumn[i]] = Math.Max(iSumValue[i], dSumValue[i]);
}
}
row.EndEdit();
this.dtDataView.Rows.Add(row);
}
}
/**//// <summary>
/// 在指定的单元格里面创建分页控件,此方法类似于设计模式里面的Builder
/// </summary>
/// <param name="cell"></param>
private void CreatePager(TableCell cell)
...{
// 分页控件的父控件容器
Table tblContent= new Table();
tblContent.Font.Name = this.Font.Name;
tblContent.Font.Size = FontUnit.Point(10);
tblContent.BorderStyle = this.BorderStyle;
tblContent.BorderWidth = Unit.Parse("0");
tblContent.BorderColor = this.BorderColor;
tblContent.Width = Unit.Parse("100%");
tblContent.BackColor = this.PagerStyle.BackColor;
tblContent.ForeColor = this.ForeColor;
tblContent.CellPadding = 0;
tblContent.CellSpacing = 0;
// 为父控件tblContent添加一个行和列用来放置产生的UI。
// 只添加一行。
TableRow rowFirst= new TableRow();
tblContent.Rows.Add(rowFirst);
// 导出数据部分=========================
if(this.IsShowSave)
...{
TableCell cellExportData = new TableCell();
this.BuildExportDataUI(cellExportData);
rowFirst.Cells.Add(cellExportData);
}
// 添加记录数量信息=========================
TableCell cellRowInfo = new TableCell();
cellRowInfo.Attributes["align"] = "center";
if(this.tiTableInfo.AllowPaging)
...{
cellRowInfo.Text = "第 " + (this.tiTableInfo.CurrentPageIndex + 1).ToString() + "/" +
this.tiTableInfo.PageCount.ToString() + " 页 " +
"每页 " + this.tiTableInfo.PageSize.ToString() + " 条 " +
"共 " + this.tiTableInfo.RecordCount.ToString() + " 条记录";
}
else
...{
cellRowInfo.Text = "共 " + this.tiTableInfo.RecordCount.ToString() + " 条记录";
}
rowFirst.Cells.Add(cellRowInfo);
// 添加翻页信息=========================
if(this.tiTableInfo.AllowPaging)
...{
cellRowInfo = new TableCell();
cellRowInfo.HorizontalAlign = HorizontalAlign.Right;
this.BuildNextPrevUI(cellRowInfo);
rowFirst.Cells.Add(cellRowInfo);
}
cell.Controls.Add(tblContent);
}
/**//// <summary>
/// 在指定的单元格里面创建向前或者向后的UI界面
/// </summary>
/// <param name="cell">需要创建向前或者向后UI的单元格</param>
private void BuildNextPrevUI(TableCell cell)
...{
// 判断是否需要创建翻页的UI如果只有一页的信息则不需要创建了
bool bIsBuildNextPrevUI = ((this.tiTableInfo.CurrentPageIndex < 0) ? false: ((this.tiTableInfo.CurrentPageIndex > (this.tiTableInfo.PageCount - 1)) == false));;
// 判断当前是不是第一页
bool bIsFirstPage = (this.tiTableInfo.CurrentPageIndex > 0);
// 判断当前是不是最后一页
bool bIsLastPage = (this.tiTableInfo.CurrentPageIndex < (this.tiTableInfo.PageCount - 1));
// 要创建的四个翻页控件的UI
// 创建转到第一页的控件
LinkButton btnFirst= new LinkButton();
btnFirst.ID = "First";
btnFirst.CommandName = "FirstPAGE";
btnFirst.Font.Name = this.Font.Name;
btnFirst.Font.Size = FontUnit.Point(10);
btnFirst.ForeColor = this.ForeColor;
btnFirst.ToolTip = "转到第一页";
btnFirst.Text = "首页";
// 确定转向第一页的按钮是否可用
btnFirst.Enabled = (!bIsBuildNextPrevUI ? false : bIsFirstPage);
cell.Controls.Add(btnFirst);
cell.Controls.Add(new LiteralControl(" "));
// 创建向前翻页的控件
LinkButton btnPrev = new LinkButton();
btnPrev.ID = "Prev";
btnPrev.CommandName = "PrevPAGE";
btnPrev.Font.Name = this.Font.Name;
btnPrev.Font.Size = FontUnit.Point(10);
btnPrev.ForeColor = this.ForeColor;
btnPrev.ToolTip = "转到前一页";
btnPrev.Text = "上一页";
btnPrev.Enabled = (!bIsBuildNextPrevUI ? false : bIsFirstPage);
cell.Controls.Add(btnPrev);
cell.Controls.Add(new LiteralControl(" "));
// 创建向后翻页的控件
LinkButton btnNext = new LinkButton();
btnNext.ID = "Next";
btnNext.CommandName = "NextPAGE";
btnNext.Font.Name = this.Font.Name;
btnNext.Font.Size = FontUnit.Point(10);
btnNext.ForeColor = this.ForeColor;
btnNext.ToolTip = "转到下一页";
btnNext.Text = "下一页";
btnNext.Enabled = (!bIsBuildNextPrevUI ? false : bIsLastPage);
cell.Controls.Add(btnNext);
cell.Controls.Add(new LiteralControl(" "));
// 创建翻到最后一页的控件
LinkButton btnLast = new LinkButton();
btnLast.ID = "Last";
btnLast.CommandName = "LastPAGE";
btnLast.Font.Name = this.Font.Name;
btnLast.Font.Size = FontUnit.Point(10);
btnLast.ForeColor = this.ForeColor;
btnLast.ToolTip = "转到最后一页";
btnLast.Text = "尾页";
btnLast.Enabled = (!bIsBuildNextPrevUI ? false : bIsLastPage);
cell.Controls.Add(btnLast);
}
/**//// <summary>
/// 创建数据导出的单元格
/// </summary>
/// <param name="cell"></param>
private void BuildExportDataUI(TableCell cell)
...{
Literal lable = new Literal();
lable.Text = "导出文件为:";
Style cssStyle = new Style();
cssStyle.BorderStyle = BorderStyle.Solid;
cssStyle.BorderWidth = Unit.Pixel(1);
cssStyle.BorderColor = Color.FromName("#000066");
cssStyle.Height = Unit.Pixel(20);
cssStyle.Font.Size = FontUnit.Point(8);
DropDownList ddlExportFileType = new DropDownList();
ddlExportFileType.ID = "ddlExportFileType";
ddlExportFileType.Items.Add(new ListItem("Html文件","html"));
ddlExportFileType.Items.Add(new ListItem("Txt文件","txt"));
ddlExportFileType.Items.Add(new ListItem("Excel文件","xls"));
ddlExportFileType.Items.Add(new ListItem("XML文件","xml"));
ddlExportFileType.ApplyStyle(cssStyle);
Button btnSave = new Button();
btnSave.Text = "保存";
// 事件处理函数
btnSave.Click +=new EventHandler(btnSave_Click);
btnSave.ApplyStyle(cssStyle);
cell.HorizontalAlign = HorizontalAlign.Left;
cell.VerticalAlign = VerticalAlign.Middle;
cell.Controls.Add(lable);
cell.Controls.Add(ddlExportFileType);
cell.Controls.Add(btnSave);
}
/**//// <summary>
/// 处理保存
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSave_Click(object sender, EventArgs e)
...{
//默认的保存类型是html
string strSaveType = "html";
Control control = this.GetControl(((Button)sender).Parent.Controls,"ddlExportFileType");
if(control != null)
...{
strSaveType = ((DropDownList)control).SelectedValue;
}
if(this.dtDataTable == null)
return;
DataTable dt = this.dtDataTable.Copy();
//显示合计
if(this.IsShowSum)
...{
//合计的列
string[] arrSumColumn = this.SumColumn.Split('|');
//分页合计与总合计的值
long[] iSumValue = new long[arrSumColumn.Length];
double[] dSumValue = new double[arrSumColumn.Length];
int iStringColumn = -1;
DataRow row;
//计算合计值
for(int i = 0; i < arrSumColumn.Length; i++)
...{
//判断当前列名是否在数据表中
if(dt.Columns.Contains(arrSumColumn[i]))
...{
string sDataType = dt.Columns[arrSumColumn[i]].DataType.FullName;
//计算整数
if((sDataType == "System.Int16")||(sDataType == "System.Int32")||(sDataType == "System.Int64")||
(sDataType == "System.UInt16")||(sDataType == "System.UInt32")||(sDataType == "System.UInt64"))
...{
//总合计数
iSumValue[i] = 0;
for(int j = 0; j < dt.Rows.Count; j++)
...{
iSumValue[i] += Convert.ToInt64(dt.Rows[j][arrSumColumn[i]]);
}
}
//计算小数
if((sDataType == "System.Decimal")||(sDataType == "System.Double")||(sDataType == "System.Single"))
...{
//总合计数
dSumValue[i] = 0.0;
for(int j = 0; j < dt.Rows.Count; j++)
...{
dSumValue[i] += Convert.ToDouble(dt.Rows[j][arrSumColumn[i]]);
}
}
}
}
//取得第一列String字段编号,用于放置“合计”
for(int i = 0; i < dt.Columns.Count; i++)
...{
string sDataType = dt.Columns[i].DataType.FullName;
if(dt.Columns[i].DataType.FullName == "System.String")
...{
iStringColumn = i;
break;
}
}
//汇总和计
row = dt.NewRow();
row.BeginEdit();
if(iStringColumn >= 0)
row[iStringColumn] = "汇总和计";
//按对应的列放置合计数
for(int i = 0; i < arrSumColumn.Length; i++)
...{
if(dt.Columns.Contains(arrSumColumn[i]))
...{
row[arrSumColumn[i]] = Math.Max(iSumValue[i], dSumValue[i]);
}
}
row.EndEdit();
dt.Rows.Add(row);
}
switch(strSaveType)
...{
case "txt":
this.sSaveWindow = this.DataTableToTxt(dt);
break;
case "xls":
this.sSaveWindow = this.DataTableToXls(dt);
break;
case "xml":
this.sSaveWindow = this.DataTableToXml(dt);
break;
default:
this.sSaveWindow = this.DataTableToHtml(dt);
break;
}
dt.Dispose();
}
/**//// <summary>
/// 在指定的控件集合中查找指定名称的控件
/// </summary>
/// <param name="controls">控件集合</param>
/// <param name="controlName">要查找的控件的名字ID</param>
/// <returns></returns>
private Control GetControl(ControlCollection controls,string controlName)
...{
foreach(Control control in controls)
...{
if(control.ID == controlName)
...{
return control;
}
//递归
if(control.HasControls())
return GetControl(control.Controls,controlName);
}
return null;
}
/**//// <summary>
/// 导出文件为TXT文件,需要小心特殊字符的处理
/// </summary>
/// <param name="dv"></param>
/// <returns></returns>
private string DataTableToTxt(DataTable dv)
...{
string sFilePath = this.Page.Request.PhysicalApplicationPath + this.sSavePath + "/";
if(!Directory.Exists(sFilePath))
...{
Directory.CreateDirectory(sFilePath);
}
string sFileName = Guid.NewGuid().ToString()+".txt";
FileStream fs = new FileStream(sFilePath + sFileName, FileMode.CreateNew, FileAccess.Write, FileShare.None);
StreamWriter swExportWriter = new StreamWriter(fs,Encoding.UTF8);
swExportWriter.WriteLine(this.Title);
for(int i = 0; i < dv.Columns.Count; i++)
...{
swExportWriter.Write(dv.Columns[i].ColumnName);
swExportWriter.Write(" ");
}
swExportWriter.WriteLine("");
for(int i = 0; i < dv.Rows.Count; i++)
...{
for(int j = 0; j < dv.Columns.Count; j++)
...{
swExportWriter.Write(dv.Rows[i][j].ToString());
swExportWriter.Write(" ");
}
swExportWriter.WriteLine("");
}
swExportWriter.Close();
fs.Close();
return "<script language='javascript'>window.open('"+ this.Page.Request.ApplicationPath + "/" + this.sSavePath + "/" + sFileName+ "')</script>";
}
/**//// <summary>
/// 导出文件为Xls文件,需要小心特殊字符的处理
/// </summary>
/// <param name="dv"></param>
/// <returns></returns>
private string DataTableToXls(DataTable dv)
...{
string sFilePath = this.Page.Request.PhysicalApplicationPath + this.sSavePath + "/";
if(!Directory.Exists(sFilePath))
...{
Directory.CreateDirectory(sFilePath);
}
string sFileName = Guid.NewGuid().ToString()+".xls";
FileStream fs = new FileStream(sFilePath + sFileName, FileMode.CreateNew, FileAccess.Write, FileShare.None);
StreamWriter swExportWriter = new StreamWriter(fs,Encoding.UTF8);
HtmlTextWriter hwExportWriter = new HtmlTextWriter(swExportWriter);
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Html);
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Head);
hwExportWriter.WriteLine("<Title>" + dv.TableName + "</Title>");
hwExportWriter.RenderEndTag();
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Body);
hwExportWriter.AddAttribute("border","1");
hwExportWriter.AddAttribute("borderColor","#000000");
hwExportWriter.AddAttribute("cellpadding","0");
hwExportWriter.AddAttribute("cellspacing","0");
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Table);
hwExportWriter.AddAttribute("align","center");
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Tr);
hwExportWriter.AddAttribute("colspan",dv.Columns.Count.ToString());
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Td);
hwExportWriter.Write(this.Title);
hwExportWriter.RenderEndTag();
hwExportWriter.RenderEndTag();
hwExportWriter.AddAttribute("align","center");
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Tr);
for(int j = 0; j < dv.Columns.Count; j++)
...{
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Td);
hwExportWriter.Write(dv.Columns[j].ColumnName);
hwExportWriter.RenderEndTag();
}
hwExportWriter.RenderEndTag();
for(int i = 0; i < dv.Rows.Count; i++)
...{
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Tr);
for(int j = 0; j < dv.Columns.Count; j++)
...{
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Td);
hwExportWriter.Write(dv.Rows[i][j].ToString());
hwExportWriter.RenderEndTag();
}
hwExportWriter.RenderEndTag();
}
hwExportWriter.RenderEndTag();
hwExportWriter.RenderEndTag();
hwExportWriter.RenderEndTag();
hwExportWriter.Close();
swExportWriter.Close();
fs.Close();
return "<script language='javascript'>window.open('"+ this.Page.Request.ApplicationPath + "/" + this.sSavePath + "/" + sFileName+ "')</script>";
}
/**//// <summary>
/// 导出文件为XML文件,需要小心特殊字符的处理
/// </summary>
/// <param name="dv"></param>
/// <returns></returns>
private string DataTableToXml(DataTable dv)
...{
string sFilePath = this.Page.Request.PhysicalApplicationPath + this.sSavePath + "/";
if(!Directory.Exists(sFilePath))
...{
Directory.CreateDirectory(sFilePath);
}
string sFileName = Guid.NewGuid().ToString()+".xml";
FileStream fs = new FileStream(sFilePath + sFileName, FileMode.CreateNew, FileAccess.Write, FileShare.None);
XmlTextWriter xwExportWriter = new XmlTextWriter(fs,Encoding.UTF8);
xwExportWriter.WriteStartDocument();
xwExportWriter.WriteStartElement(dv.TableName);
for(int i = 0; i < dv.Rows.Count; i++)
...{
xwExportWriter.WriteStartElement("ROW" + i.ToString());
for(int j = 0; j < dv.Columns.Count; j++)
...{
xwExportWriter.WriteElementString(dv.Columns[j].ColumnName, dv.Rows[i][j].ToString());
}
xwExportWriter.WriteEndElement();
}
xwExportWriter.WriteEndElement();
xwExportWriter.WriteEndDocument();
xwExportWriter.Close();
fs.Close();
return "<script language='javascript'>window.open('"+ this.Page.Request.ApplicationPath + "/" + this.sSavePath + "/" + sFileName+ "')</script>";
}
/**//// <summary>
/// 导出文件为Html文件,需要小心特殊字符的处理
/// </summary>
/// <param name="dv"></param>
/// <returns></returns>
private string DataTableToHtml(DataTable dv)
...{
string sFilePath = this.Page.Request.PhysicalApplicationPath + this.sSavePath + "/";
if(!Directory.Exists(sFilePath))
...{
Directory.CreateDirectory(sFilePath);
}
string sFileName = Guid.NewGuid().ToString()+".html";
FileStream fs = new FileStream(sFilePath + sFileName, FileMode.CreateNew, FileAccess.Write, FileShare.None);
StreamWriter swExportWriter = new StreamWriter(fs,Encoding.UTF8);
HtmlTextWriter hwExportWriter = new HtmlTextWriter(swExportWriter);
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Html);
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Head);
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Title);
hwExportWriter.Write(this.Title);
hwExportWriter.RenderEndTag();
hwExportWriter.AddAttribute("Charset","UTF-8");
hwExportWriter.AddAttribute("ContentType","Application/ms-excel");
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Meta);
hwExportWriter.RenderEndTag();
hwExportWriter.RenderEndTag();
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Body);
hwExportWriter.AddAttribute("border","1");
hwExportWriter.AddAttribute("borderColor","#000000");
hwExportWriter.AddAttribute("cellpadding","0");
hwExportWriter.AddAttribute("cellspacing","0");
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Table);
hwExportWriter.AddAttribute("align","center");
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Tr);
hwExportWriter.AddAttribute("colspan",dv.Columns.Count.ToString());
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Td);
hwExportWriter.Write(this.Title);
hwExportWriter.RenderEndTag();
hwExportWriter.RenderEndTag();
hwExportWriter.AddAttribute("align","center");
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Tr);
for(int j = 0; j < dv.Columns.Count; j++)
...{
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Td);
hwExportWriter.Write(dv.Columns[j].ColumnName);
hwExportWriter.RenderEndTag();
}
hwExportWriter.RenderEndTag();
for(int i = 0; i < dv.Rows.Count; i++)
...{
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Tr);
for(int j = 0; j < dv.Columns.Count; j++)
...{
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Td);
hwExportWriter.Write(dv.Rows[i][j].ToString() + " ");
hwExportWriter.RenderEndTag();
}
hwExportWriter.RenderEndTag();
}
hwExportWriter.RenderEndTag();
hwExportWriter.RenderEndTag();
hwExportWriter.RenderEndTag();
hwExportWriter.Close();
swExportWriter.Close();
fs.Close();
return "<script language='javascript'>window.open('"+ this.Page.Request.ApplicationPath + "/" + this.sSavePath + "/" + sFileName+ "')</script>";
}
}
}
using System.IO;
using System.Xml;
using System.Text;
using System.Data;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Design;
[assembly:TagPrefix( " JJ.Web.UI " , " JJ " )]
namespace JJ.Web.UI
... {
/**//// <summary>
/// JJDZDataGrid 的摘要说明。
/// </summary>
[ToolboxData("<{0}:dtDataGrid runat=server></{0}:dtDataGrid>")]
public class dtDataGrid : DataGrid
...{
//所有数据
private DataTable dtDataTable;
//当前页数据
private DataTable dtDataView;
//翻页数据
private TableInfo tiTableInfo;
//保存的文件窗口
private string sSaveWindow;
//保存文件的路径
private string sSavePath;
//EnableViewState提示信息
private string sViewState = "<font color='##FF0000'>控件属性EnableViewState现在被设置为false,无法实现翻页及导出功能!</font>";
//行数过多提示信息
private string sMoreRow = "<font color='##FF0000'>查询数据行数过多,实现翻页及导出功能将十分缓慢!</font>";
[
Description("获得或者设置是否显示保存按钮"),
Category("自定义类别"),
Bindable(true),
DefaultValue(true)
]
public virtual bool IsShowSave
...{
get
...{
object b = (object)ViewState["IsShowSave"];
return (b == null) ? true : (bool)b;
}
set...{this.ViewState["IsShowSave"] = value;}
}
[
Description("获得或者设置是否显示合计"),
Category("自定义类别"),
Bindable(true),
DefaultValue(false)
]
public virtual bool IsShowSum
...{
get
...{
object b = (object)ViewState["IsShowSum"];
return (b == null) ? false : (bool)b;
}
set...{this.ViewState["IsShowSum"] = value;}
}
[
Description("获得或者设置显示合计的字段"),
Category("自定义类别"),
Bindable(true),
DefaultValue("")
]
public virtual string SumColumn
...{
get
...{
string s = (string)ViewState["SumColumn"];
return (s == null) ? "" : s;
}
set...{this.ViewState["SumColumn"] = value;}
}
[
Description("获得或者设置标题的字段"),
Category("自定义类别"),
Bindable(true),
DefaultValue("")
]
public virtual string Title
...{
get
...{
string s = (string)ViewState["Title"];
return (s == null) ? "" : s;
}
set...{this.ViewState["Title"] = value;}
}
/**//// <summary>
/// 初始化
/// </summary>
public dtDataGrid():base()
...{
this.dtDataView = new DataTable();
this.sSaveWindow = "";
this.sSavePath = "JJDZFILES";
}
/**//// <summary>
/// 退出
/// </summary>
public override void Dispose()
...{
if(dtDataTable != null)
dtDataTable.Dispose();
if(dtDataView != null)
dtDataView.Dispose();
base.Dispose();
}
/**//****************************
/// <summary>
/// OnInit控件初始化
/// </summary>
/// <param name="e"></param>
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
}
*****************************/
/**//// <summary>
/// LoadViewState取缓存信息
/// </summary>
/// <param name="savedState"></param>
protected override void LoadViewState(object savedState)
...{
base.LoadViewState(savedState);
this.dtDataTable = (DataTable)this.ViewState["DataSource"];
this.tiTableInfo = (TableInfo)this.ViewState["TableInfo"];
}
/**//// <summary>
/// OnItemCreated
/// </summary>
/// <param name="e"></param>
protected override void OnItemCreated(DataGridItemEventArgs e)
...{
// 为标题定义显示风格
if(e.Item.ItemType == ListItemType.Header)
...{
e.Item.HorizontalAlign = HorizontalAlign.Center;
}
// 为分页区域添加自定义分页控件
if(e.Item.ItemType == ListItemType.Pager)
...{
e.Item.Cells[0].Controls.Clear();
this.CreatePager(e.Item.Cells[0]);
e.Item.BackColor = System.Drawing.Color.AliceBlue;
}
base.OnItemCreated(e);
}
/**//// <summary>
/// DataBind
/// </summary>
public override void DataBind()
...{
//保存数据到缓存
this.dtDataTable = (DataTable)this.DataSource;
this.ViewState["DataSource"] = this.dtDataTable;
//没有指定数据源
if(this.dtDataTable == null)
return;
//保存页数数据
if(this.tiTableInfo == null)
...{
this.tiTableInfo = new TableInfo();
this.tiTableInfo.AllowPaging = this.AllowPaging;
this.tiTableInfo.PageSize = this.PageSize;
}
this.tiTableInfo.CurrentPageIndex = this.CurrentPageIndex;
this.tiTableInfo.RecordCount = this.dtDataTable.Rows.Count;
this.tiTableInfo.PageCount = Convert.ToInt32(Math.Ceiling(this.dtDataTable.Rows.Count * 1.0 / this.tiTableInfo.PageSize));
this.ViewState["TableInfo"] = this.tiTableInfo;
//默认属性
this.AllowPaging = true;
this.ShowHeader = true;
this.ShowFooter = false;
this.GetCurPageData();
this.DataSource = this.dtDataView;
base.DataBind();
}
/**//// <summary>
/// OnItemDataBound
/// </summary>
/// <param name="e"></param>
protected override void OnItemDataBound(DataGridItemEventArgs e)
...{
base.OnItemDataBound (e);
if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
...{
e.Item.Attributes.Add("onmouseover","this.bgColor='#C1D2EE'");
e.Item.Attributes.Add("onmouseout","this.bgColor='#FFFFFF'");
for(int i = 0; i < e.Item.Cells.Count; i++)
...{
string sDataType = ((System.Data.DataRowView)e.Item.DataItem).Row.ItemArray[i].GetType().FullName;
if((sDataType == "System.Int16")||(sDataType == "System.Int32")||(sDataType == "System.Int64")||
(sDataType == "System.UInt16")||(sDataType == "System.UInt32")||(sDataType == "System.UInt64")||
(sDataType == "System.Decimal")||(sDataType == "System.Double")||(sDataType == "System.Single"))
...{
e.Item.Cells[i].HorizontalAlign = HorizontalAlign.Right;
}
}
}
}
/**//// <summary>
/// SaveViewState保存缓存信息
/// </summary>
/// <param name="savedState"></param>
protected override object SaveViewState()
...{
return base.SaveViewState();
}
/**//*****************************************
/// <summary>
/// 将此控件呈现给指定的输出参数。
/// </summary>
/// <param name="output"> 要写出到的 HTML 编写器 </param>
protected override void Render(HtmlTextWriter writer)
{
base.Render(writer);
}
********************************************/
/**//// <summary>
/// RenderContents
/// </summary>
/// <param name="writer"></param>
protected override void RenderContents(HtmlTextWriter writer)
...{
base.RenderContents(writer);
//保存数据时弹出窗口保存文件
if(this.IsShowSave)
writer.Write(this.sSaveWindow);
//EnableViewState提示信息
if(!this.EnableViewState)
writer.Write(this.sViewState);
if(this.tiTableInfo != null)
if(this.dtDataTable.Rows.Count > 1000)
writer.Write(this.sMoreRow);
}
/**//// <summary>
/// 当DataGrid上有动作的时候激发,这里值捕捉分页的命令,所以在使用的时候最好你的按钮的CommandName和这里面的一样
/// </summary>
/// <param name="e"></param>
protected override void OnItemCommand(DataGridCommandEventArgs e)
...{
string strCommandName = e.CommandName;
if(e.CommandName == null)
return;
strCommandName = string.IsInterned(strCommandName);
switch(e.CommandName)
...{
case "FirstPAGE":
...{
this.GoToPage(0);
break;
}
case "PrevPAGE":
...{
this.GoToPage(Math.Max((this.tiTableInfo.CurrentPageIndex - 1), 0));
break;
}
case "NextPAGE":
...{
this.GoToPage(Math.Min((this.tiTableInfo.CurrentPageIndex + 1), (this.tiTableInfo.PageCount - 1)));
break;
}
case "LastPAGE":
...{
this.GoToPage((this.tiTableInfo.PageCount - 1));
break;
}
}
base.OnItemCommand(e);
}
/**//// <summary>
/// 跳转到指定的页
/// </summary>
/// <param name="pageIndex"></param>
private void GoToPage(int pageIndex)
...{
this.tiTableInfo.CurrentPageIndex = pageIndex;
this.GetCurPageData();
this.DataSource = this.dtDataView;
base.DataBind();
}
/**//// <summary>
/// 取当前显示页面数据到DataView
/// </summary>
private void GetCurPageData()
...{
//是否分页
if(!this.tiTableInfo.AllowPaging)
...{
//多一行为合计预留
this.PageSize = this.dtDataTable.Rows.Count + 1;
this.dtDataView = this.dtDataTable.Copy();
}
else
...{
//多两行,为本页合计与总合计预留
this.PageSize = this.tiTableInfo.PageSize + 2;
//取当前页的数据
this.dtDataView = this.dtDataTable.Clone();
for(int i = 0; i < this.tiTableInfo.PageSize; i++)
...{
if((i + this.tiTableInfo.CurrentPageIndex * this.tiTableInfo.PageSize) < this.dtDataTable.Rows.Count)
this.dtDataView.ImportRow(this.dtDataTable.Rows[i + this.tiTableInfo.CurrentPageIndex * this.tiTableInfo.PageSize]);
}
}
//显示合计
if(this.IsShowSum)
...{
//合计的列
string[] arrSumColumn = this.SumColumn.Split('|');
//分页合计与总合计的值
long[] iSumValue = new long[arrSumColumn.Length];
long[] iPageSumValue = new long[arrSumColumn.Length];
double[] dSumValue = new double[arrSumColumn.Length];
double[] dPageSumValue = new double[arrSumColumn.Length];
int iStringColumn = -1;
DataRow row;
//计算合计值
for(int i = 0; i < arrSumColumn.Length; i++)
...{
//判断当前列名是否在数据表中
if(this.dtDataView.Columns.Contains(arrSumColumn[i]))
...{
string sDataType = this.dtDataView.Columns[arrSumColumn[i]].DataType.FullName;
//计算整数
if((sDataType == "System.Int16")||(sDataType == "System.Int32")||(sDataType == "System.Int64")||
(sDataType == "System.UInt16")||(sDataType == "System.UInt32")||(sDataType == "System.UInt64"))
...{
//当前页合计数
iPageSumValue[i] = 0;
for(int j = 0; j < this.dtDataView.Rows.Count; j++)
...{
iPageSumValue[i] += Convert.ToInt64(this.dtDataView.Rows[j][arrSumColumn[i]]);
}
//总合计数
iSumValue[i] = 0;
for(int j = 0; j < this.dtDataTable.Rows.Count; j++)
...{
iSumValue[i] += Convert.ToInt64(this.dtDataTable.Rows[j][arrSumColumn[i]]);
}
}
//计算小数
if((sDataType == "System.Decimal")||(sDataType == "System.Double")||(sDataType == "System.Single"))
...{
//当前页合计数
dPageSumValue[i] = 0.0;
for(int j = 0; j < this.dtDataView.Rows.Count; j++)
...{
dPageSumValue[i] += Convert.ToDouble(this.dtDataView.Rows[j][arrSumColumn[i]]);
}
//总合计数
dSumValue[i] = 0.0;
for(int j = 0; j < this.dtDataTable.Rows.Count; j++)
...{
dSumValue[i] += Convert.ToDouble(this.dtDataTable.Rows[j][arrSumColumn[i]]);
}
}
}
}
//取得第一列String字段编号,用于放置“合计”
for(int i = 0; i < this.dtDataView.Columns.Count; i++)
...{
string sDataType = this.dtDataView.Columns[i].DataType.FullName;
if(this.dtDataView.Columns[i].DataType.FullName == "System.String")
...{
iStringColumn = i;
break;
}
}
//判断是否有本页合计
if((this.tiTableInfo.AllowPaging) && (this.tiTableInfo.PageCount > 1))
...{
row = this.dtDataView.NewRow();
row.BeginEdit();
if(iStringColumn >= 0)
row[iStringColumn] = "本页合计";
//按对应的列放置合计数
for(int i = 0; i < arrSumColumn.Length; i++)
...{
if(this.dtDataView.Columns.Contains(arrSumColumn[i]))
...{
row[arrSumColumn[i]] = Math.Max(iPageSumValue[i], dPageSumValue[i]);
}
}
row.EndEdit();
this.dtDataView.Rows.Add(row);
}
//汇总和计
row = this.dtDataView.NewRow();
row.BeginEdit();
if(iStringColumn >= 0)
row[iStringColumn] = "汇总和计";
//按对应的列放置合计数
for(int i = 0; i < arrSumColumn.Length; i++)
...{
if(this.dtDataView.Columns.Contains(arrSumColumn[i]))
...{
row[arrSumColumn[i]] = Math.Max(iSumValue[i], dSumValue[i]);
}
}
row.EndEdit();
this.dtDataView.Rows.Add(row);
}
}
/**//// <summary>
/// 在指定的单元格里面创建分页控件,此方法类似于设计模式里面的Builder
/// </summary>
/// <param name="cell"></param>
private void CreatePager(TableCell cell)
...{
// 分页控件的父控件容器
Table tblContent= new Table();
tblContent.Font.Name = this.Font.Name;
tblContent.Font.Size = FontUnit.Point(10);
tblContent.BorderStyle = this.BorderStyle;
tblContent.BorderWidth = Unit.Parse("0");
tblContent.BorderColor = this.BorderColor;
tblContent.Width = Unit.Parse("100%");
tblContent.BackColor = this.PagerStyle.BackColor;
tblContent.ForeColor = this.ForeColor;
tblContent.CellPadding = 0;
tblContent.CellSpacing = 0;
// 为父控件tblContent添加一个行和列用来放置产生的UI。
// 只添加一行。
TableRow rowFirst= new TableRow();
tblContent.Rows.Add(rowFirst);
// 导出数据部分=========================
if(this.IsShowSave)
...{
TableCell cellExportData = new TableCell();
this.BuildExportDataUI(cellExportData);
rowFirst.Cells.Add(cellExportData);
}
// 添加记录数量信息=========================
TableCell cellRowInfo = new TableCell();
cellRowInfo.Attributes["align"] = "center";
if(this.tiTableInfo.AllowPaging)
...{
cellRowInfo.Text = "第 " + (this.tiTableInfo.CurrentPageIndex + 1).ToString() + "/" +
this.tiTableInfo.PageCount.ToString() + " 页 " +
"每页 " + this.tiTableInfo.PageSize.ToString() + " 条 " +
"共 " + this.tiTableInfo.RecordCount.ToString() + " 条记录";
}
else
...{
cellRowInfo.Text = "共 " + this.tiTableInfo.RecordCount.ToString() + " 条记录";
}
rowFirst.Cells.Add(cellRowInfo);
// 添加翻页信息=========================
if(this.tiTableInfo.AllowPaging)
...{
cellRowInfo = new TableCell();
cellRowInfo.HorizontalAlign = HorizontalAlign.Right;
this.BuildNextPrevUI(cellRowInfo);
rowFirst.Cells.Add(cellRowInfo);
}
cell.Controls.Add(tblContent);
}
/**//// <summary>
/// 在指定的单元格里面创建向前或者向后的UI界面
/// </summary>
/// <param name="cell">需要创建向前或者向后UI的单元格</param>
private void BuildNextPrevUI(TableCell cell)
...{
// 判断是否需要创建翻页的UI如果只有一页的信息则不需要创建了
bool bIsBuildNextPrevUI = ((this.tiTableInfo.CurrentPageIndex < 0) ? false: ((this.tiTableInfo.CurrentPageIndex > (this.tiTableInfo.PageCount - 1)) == false));;
// 判断当前是不是第一页
bool bIsFirstPage = (this.tiTableInfo.CurrentPageIndex > 0);
// 判断当前是不是最后一页
bool bIsLastPage = (this.tiTableInfo.CurrentPageIndex < (this.tiTableInfo.PageCount - 1));
// 要创建的四个翻页控件的UI
// 创建转到第一页的控件
LinkButton btnFirst= new LinkButton();
btnFirst.ID = "First";
btnFirst.CommandName = "FirstPAGE";
btnFirst.Font.Name = this.Font.Name;
btnFirst.Font.Size = FontUnit.Point(10);
btnFirst.ForeColor = this.ForeColor;
btnFirst.ToolTip = "转到第一页";
btnFirst.Text = "首页";
// 确定转向第一页的按钮是否可用
btnFirst.Enabled = (!bIsBuildNextPrevUI ? false : bIsFirstPage);
cell.Controls.Add(btnFirst);
cell.Controls.Add(new LiteralControl(" "));
// 创建向前翻页的控件
LinkButton btnPrev = new LinkButton();
btnPrev.ID = "Prev";
btnPrev.CommandName = "PrevPAGE";
btnPrev.Font.Name = this.Font.Name;
btnPrev.Font.Size = FontUnit.Point(10);
btnPrev.ForeColor = this.ForeColor;
btnPrev.ToolTip = "转到前一页";
btnPrev.Text = "上一页";
btnPrev.Enabled = (!bIsBuildNextPrevUI ? false : bIsFirstPage);
cell.Controls.Add(btnPrev);
cell.Controls.Add(new LiteralControl(" "));
// 创建向后翻页的控件
LinkButton btnNext = new LinkButton();
btnNext.ID = "Next";
btnNext.CommandName = "NextPAGE";
btnNext.Font.Name = this.Font.Name;
btnNext.Font.Size = FontUnit.Point(10);
btnNext.ForeColor = this.ForeColor;
btnNext.ToolTip = "转到下一页";
btnNext.Text = "下一页";
btnNext.Enabled = (!bIsBuildNextPrevUI ? false : bIsLastPage);
cell.Controls.Add(btnNext);
cell.Controls.Add(new LiteralControl(" "));
// 创建翻到最后一页的控件
LinkButton btnLast = new LinkButton();
btnLast.ID = "Last";
btnLast.CommandName = "LastPAGE";
btnLast.Font.Name = this.Font.Name;
btnLast.Font.Size = FontUnit.Point(10);
btnLast.ForeColor = this.ForeColor;
btnLast.ToolTip = "转到最后一页";
btnLast.Text = "尾页";
btnLast.Enabled = (!bIsBuildNextPrevUI ? false : bIsLastPage);
cell.Controls.Add(btnLast);
}
/**//// <summary>
/// 创建数据导出的单元格
/// </summary>
/// <param name="cell"></param>
private void BuildExportDataUI(TableCell cell)
...{
Literal lable = new Literal();
lable.Text = "导出文件为:";
Style cssStyle = new Style();
cssStyle.BorderStyle = BorderStyle.Solid;
cssStyle.BorderWidth = Unit.Pixel(1);
cssStyle.BorderColor = Color.FromName("#000066");
cssStyle.Height = Unit.Pixel(20);
cssStyle.Font.Size = FontUnit.Point(8);
DropDownList ddlExportFileType = new DropDownList();
ddlExportFileType.ID = "ddlExportFileType";
ddlExportFileType.Items.Add(new ListItem("Html文件","html"));
ddlExportFileType.Items.Add(new ListItem("Txt文件","txt"));
ddlExportFileType.Items.Add(new ListItem("Excel文件","xls"));
ddlExportFileType.Items.Add(new ListItem("XML文件","xml"));
ddlExportFileType.ApplyStyle(cssStyle);
Button btnSave = new Button();
btnSave.Text = "保存";
// 事件处理函数
btnSave.Click +=new EventHandler(btnSave_Click);
btnSave.ApplyStyle(cssStyle);
cell.HorizontalAlign = HorizontalAlign.Left;
cell.VerticalAlign = VerticalAlign.Middle;
cell.Controls.Add(lable);
cell.Controls.Add(ddlExportFileType);
cell.Controls.Add(btnSave);
}
/**//// <summary>
/// 处理保存
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSave_Click(object sender, EventArgs e)
...{
//默认的保存类型是html
string strSaveType = "html";
Control control = this.GetControl(((Button)sender).Parent.Controls,"ddlExportFileType");
if(control != null)
...{
strSaveType = ((DropDownList)control).SelectedValue;
}
if(this.dtDataTable == null)
return;
DataTable dt = this.dtDataTable.Copy();
//显示合计
if(this.IsShowSum)
...{
//合计的列
string[] arrSumColumn = this.SumColumn.Split('|');
//分页合计与总合计的值
long[] iSumValue = new long[arrSumColumn.Length];
double[] dSumValue = new double[arrSumColumn.Length];
int iStringColumn = -1;
DataRow row;
//计算合计值
for(int i = 0; i < arrSumColumn.Length; i++)
...{
//判断当前列名是否在数据表中
if(dt.Columns.Contains(arrSumColumn[i]))
...{
string sDataType = dt.Columns[arrSumColumn[i]].DataType.FullName;
//计算整数
if((sDataType == "System.Int16")||(sDataType == "System.Int32")||(sDataType == "System.Int64")||
(sDataType == "System.UInt16")||(sDataType == "System.UInt32")||(sDataType == "System.UInt64"))
...{
//总合计数
iSumValue[i] = 0;
for(int j = 0; j < dt.Rows.Count; j++)
...{
iSumValue[i] += Convert.ToInt64(dt.Rows[j][arrSumColumn[i]]);
}
}
//计算小数
if((sDataType == "System.Decimal")||(sDataType == "System.Double")||(sDataType == "System.Single"))
...{
//总合计数
dSumValue[i] = 0.0;
for(int j = 0; j < dt.Rows.Count; j++)
...{
dSumValue[i] += Convert.ToDouble(dt.Rows[j][arrSumColumn[i]]);
}
}
}
}
//取得第一列String字段编号,用于放置“合计”
for(int i = 0; i < dt.Columns.Count; i++)
...{
string sDataType = dt.Columns[i].DataType.FullName;
if(dt.Columns[i].DataType.FullName == "System.String")
...{
iStringColumn = i;
break;
}
}
//汇总和计
row = dt.NewRow();
row.BeginEdit();
if(iStringColumn >= 0)
row[iStringColumn] = "汇总和计";
//按对应的列放置合计数
for(int i = 0; i < arrSumColumn.Length; i++)
...{
if(dt.Columns.Contains(arrSumColumn[i]))
...{
row[arrSumColumn[i]] = Math.Max(iSumValue[i], dSumValue[i]);
}
}
row.EndEdit();
dt.Rows.Add(row);
}
switch(strSaveType)
...{
case "txt":
this.sSaveWindow = this.DataTableToTxt(dt);
break;
case "xls":
this.sSaveWindow = this.DataTableToXls(dt);
break;
case "xml":
this.sSaveWindow = this.DataTableToXml(dt);
break;
default:
this.sSaveWindow = this.DataTableToHtml(dt);
break;
}
dt.Dispose();
}
/**//// <summary>
/// 在指定的控件集合中查找指定名称的控件
/// </summary>
/// <param name="controls">控件集合</param>
/// <param name="controlName">要查找的控件的名字ID</param>
/// <returns></returns>
private Control GetControl(ControlCollection controls,string controlName)
...{
foreach(Control control in controls)
...{
if(control.ID == controlName)
...{
return control;
}
//递归
if(control.HasControls())
return GetControl(control.Controls,controlName);
}
return null;
}
/**//// <summary>
/// 导出文件为TXT文件,需要小心特殊字符的处理
/// </summary>
/// <param name="dv"></param>
/// <returns></returns>
private string DataTableToTxt(DataTable dv)
...{
string sFilePath = this.Page.Request.PhysicalApplicationPath + this.sSavePath + "/";
if(!Directory.Exists(sFilePath))
...{
Directory.CreateDirectory(sFilePath);
}
string sFileName = Guid.NewGuid().ToString()+".txt";
FileStream fs = new FileStream(sFilePath + sFileName, FileMode.CreateNew, FileAccess.Write, FileShare.None);
StreamWriter swExportWriter = new StreamWriter(fs,Encoding.UTF8);
swExportWriter.WriteLine(this.Title);
for(int i = 0; i < dv.Columns.Count; i++)
...{
swExportWriter.Write(dv.Columns[i].ColumnName);
swExportWriter.Write(" ");
}
swExportWriter.WriteLine("");
for(int i = 0; i < dv.Rows.Count; i++)
...{
for(int j = 0; j < dv.Columns.Count; j++)
...{
swExportWriter.Write(dv.Rows[i][j].ToString());
swExportWriter.Write(" ");
}
swExportWriter.WriteLine("");
}
swExportWriter.Close();
fs.Close();
return "<script language='javascript'>window.open('"+ this.Page.Request.ApplicationPath + "/" + this.sSavePath + "/" + sFileName+ "')</script>";
}
/**//// <summary>
/// 导出文件为Xls文件,需要小心特殊字符的处理
/// </summary>
/// <param name="dv"></param>
/// <returns></returns>
private string DataTableToXls(DataTable dv)
...{
string sFilePath = this.Page.Request.PhysicalApplicationPath + this.sSavePath + "/";
if(!Directory.Exists(sFilePath))
...{
Directory.CreateDirectory(sFilePath);
}
string sFileName = Guid.NewGuid().ToString()+".xls";
FileStream fs = new FileStream(sFilePath + sFileName, FileMode.CreateNew, FileAccess.Write, FileShare.None);
StreamWriter swExportWriter = new StreamWriter(fs,Encoding.UTF8);
HtmlTextWriter hwExportWriter = new HtmlTextWriter(swExportWriter);
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Html);
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Head);
hwExportWriter.WriteLine("<Title>" + dv.TableName + "</Title>");
hwExportWriter.RenderEndTag();
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Body);
hwExportWriter.AddAttribute("border","1");
hwExportWriter.AddAttribute("borderColor","#000000");
hwExportWriter.AddAttribute("cellpadding","0");
hwExportWriter.AddAttribute("cellspacing","0");
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Table);
hwExportWriter.AddAttribute("align","center");
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Tr);
hwExportWriter.AddAttribute("colspan",dv.Columns.Count.ToString());
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Td);
hwExportWriter.Write(this.Title);
hwExportWriter.RenderEndTag();
hwExportWriter.RenderEndTag();
hwExportWriter.AddAttribute("align","center");
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Tr);
for(int j = 0; j < dv.Columns.Count; j++)
...{
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Td);
hwExportWriter.Write(dv.Columns[j].ColumnName);
hwExportWriter.RenderEndTag();
}
hwExportWriter.RenderEndTag();
for(int i = 0; i < dv.Rows.Count; i++)
...{
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Tr);
for(int j = 0; j < dv.Columns.Count; j++)
...{
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Td);
hwExportWriter.Write(dv.Rows[i][j].ToString());
hwExportWriter.RenderEndTag();
}
hwExportWriter.RenderEndTag();
}
hwExportWriter.RenderEndTag();
hwExportWriter.RenderEndTag();
hwExportWriter.RenderEndTag();
hwExportWriter.Close();
swExportWriter.Close();
fs.Close();
return "<script language='javascript'>window.open('"+ this.Page.Request.ApplicationPath + "/" + this.sSavePath + "/" + sFileName+ "')</script>";
}
/**//// <summary>
/// 导出文件为XML文件,需要小心特殊字符的处理
/// </summary>
/// <param name="dv"></param>
/// <returns></returns>
private string DataTableToXml(DataTable dv)
...{
string sFilePath = this.Page.Request.PhysicalApplicationPath + this.sSavePath + "/";
if(!Directory.Exists(sFilePath))
...{
Directory.CreateDirectory(sFilePath);
}
string sFileName = Guid.NewGuid().ToString()+".xml";
FileStream fs = new FileStream(sFilePath + sFileName, FileMode.CreateNew, FileAccess.Write, FileShare.None);
XmlTextWriter xwExportWriter = new XmlTextWriter(fs,Encoding.UTF8);
xwExportWriter.WriteStartDocument();
xwExportWriter.WriteStartElement(dv.TableName);
for(int i = 0; i < dv.Rows.Count; i++)
...{
xwExportWriter.WriteStartElement("ROW" + i.ToString());
for(int j = 0; j < dv.Columns.Count; j++)
...{
xwExportWriter.WriteElementString(dv.Columns[j].ColumnName, dv.Rows[i][j].ToString());
}
xwExportWriter.WriteEndElement();
}
xwExportWriter.WriteEndElement();
xwExportWriter.WriteEndDocument();
xwExportWriter.Close();
fs.Close();
return "<script language='javascript'>window.open('"+ this.Page.Request.ApplicationPath + "/" + this.sSavePath + "/" + sFileName+ "')</script>";
}
/**//// <summary>
/// 导出文件为Html文件,需要小心特殊字符的处理
/// </summary>
/// <param name="dv"></param>
/// <returns></returns>
private string DataTableToHtml(DataTable dv)
...{
string sFilePath = this.Page.Request.PhysicalApplicationPath + this.sSavePath + "/";
if(!Directory.Exists(sFilePath))
...{
Directory.CreateDirectory(sFilePath);
}
string sFileName = Guid.NewGuid().ToString()+".html";
FileStream fs = new FileStream(sFilePath + sFileName, FileMode.CreateNew, FileAccess.Write, FileShare.None);
StreamWriter swExportWriter = new StreamWriter(fs,Encoding.UTF8);
HtmlTextWriter hwExportWriter = new HtmlTextWriter(swExportWriter);
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Html);
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Head);
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Title);
hwExportWriter.Write(this.Title);
hwExportWriter.RenderEndTag();
hwExportWriter.AddAttribute("Charset","UTF-8");
hwExportWriter.AddAttribute("ContentType","Application/ms-excel");
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Meta);
hwExportWriter.RenderEndTag();
hwExportWriter.RenderEndTag();
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Body);
hwExportWriter.AddAttribute("border","1");
hwExportWriter.AddAttribute("borderColor","#000000");
hwExportWriter.AddAttribute("cellpadding","0");
hwExportWriter.AddAttribute("cellspacing","0");
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Table);
hwExportWriter.AddAttribute("align","center");
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Tr);
hwExportWriter.AddAttribute("colspan",dv.Columns.Count.ToString());
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Td);
hwExportWriter.Write(this.Title);
hwExportWriter.RenderEndTag();
hwExportWriter.RenderEndTag();
hwExportWriter.AddAttribute("align","center");
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Tr);
for(int j = 0; j < dv.Columns.Count; j++)
...{
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Td);
hwExportWriter.Write(dv.Columns[j].ColumnName);
hwExportWriter.RenderEndTag();
}
hwExportWriter.RenderEndTag();
for(int i = 0; i < dv.Rows.Count; i++)
...{
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Tr);
for(int j = 0; j < dv.Columns.Count; j++)
...{
hwExportWriter.RenderBeginTag(HtmlTextWriterTag.Td);
hwExportWriter.Write(dv.Rows[i][j].ToString() + " ");
hwExportWriter.RenderEndTag();
}
hwExportWriter.RenderEndTag();
}
hwExportWriter.RenderEndTag();
hwExportWriter.RenderEndTag();
hwExportWriter.RenderEndTag();
hwExportWriter.Close();
swExportWriter.Close();
fs.Close();
return "<script language='javascript'>window.open('"+ this.Page.Request.ApplicationPath + "/" + this.sSavePath + "/" + sFileName+ "')</script>";
}
}
}