C#使用Nvelocity、Json、Ajax读取.csv文件Datatable分页
版权声明:本文为博主原创文章,未经博主允许也可以转载,但是烦请标明博客来源,谢谢。https://blog.****.net/qq_40128550/article/details/88638881
引用dll文件:Ajax.dll;Jayrock.Json.dll;NVelocity.dll;NVelocityTemplateEngine.dll
.csv表格数据600多条,这里直截图样式
**
aspx.cs类
**
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Jayrock.Json;
using NVelocityTemplateEngine.Interfaces;
using NVelocityTemplateEngine;
using Jayrock.Json.Conversion;
using System.Collections;
using System.Data;
namespace Dome
{
public partial class _Defualt : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Ajax.Utility.RegisterTypeForAjax(typeof(_Defualt));
}
/// <summary>
/// </summary>
/// <param name="page">每页的数据</param>
/// <returns></returns>
[Ajax.AjaxMethod()]
public string GetList(int page)
{
//调用构造函数
var myinfodal = new InfoModel();
var data = myinfodal.GetList(page);
JsonTextWriter writer = new JsonTextWriter();
Jayrock.Json.Conversion.JsonConvert.Export(data, writer);
string jsonStr = writer.ToString();
jsonStr = "{\"list\":" + jsonStr + "}";
//引用模板
INVelocityEngine fileEngine = NVelocityEngineFactory.CreateNVelocityFileEngine(Server.MapPath("~/Model/"), true);
JsonObject jsonObj = (JsonObject)JsonConvert.Import(jsonStr);
JsonArray jagroup = (JsonArray)jsonObj["list"];
IDictionary ht = new Hashtable();
ht.Add("infos", jagroup);
//ht.Add("Common", new Common());
string multiJsonResult = fileEngine.Process(ht, "index.htm");
return multiJsonResult;
}
[Ajax.AjaxMethod()]
public int GetCount()
{
string file = "C:\\Users\\mt\\Desktop\\Dome\\Dome\\Model\\Data.csv";
//调用构造函数
InfoModel cv = new InfoModel();
DataTable dt = cv.Csv(file);
//查询总数
int count = Convert.ToInt32(dt.Rows.Count);
return count;
}
}
}
**
Info.cs
**
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Text.RegularExpressions;
using System.IO;
namespace Dome
{
[Serializable]
public class _Info
{
private int _id;
private string _name;
DateTime _createtime;
/// <summary>
///
/// </summary>
public int id
{
set { _id = value; }
get { return _id; }
}
/// <summary>
///
/// </summary>
public string name
{
set { _name = value; }
get { return _name; }
}
public DateTime createtime
{
set { _createtime = value; }
get { return _createtime; }
}
}
public class InfoModel
{
public List<_Info> GetList(int n)
{
List<_Info> info = new List<_Info>();
string file = "C:\\Users\\mt\\Desktop\\Dome\\Dome\\Model\\Data.csv";
DataTable st = Csv(file);
//获取数据总条数
int count = Convert.ToInt32(st.Rows.Count);
//每页10条数据获取总页数
int pagecount = count / 10;
//如果有一页不满10条数据自动加一页
if (count % 10 != 0)
{
pagecount++;
}
//该页面最后一条显示的数据
int a = n * 10;
//该页面第一条显示的数据
int b = (n - 1) * 10;
DataTable dt = new DataTable();
//克隆表结构
dt = st.Clone();
//如果总页数大于输入的页数
if (pagecount >= n)
{
if (a > count)
{ //循环添加最后一页的数据
for (int i = b; i < count; i++)
{
//将最后的几条的数据复制到新的datatable里面
dt.ImportRow(st.Rows[i]);
}
}
else
{
//循环添加指定的行数信息
for (int i = b; i < a; i++)
{ //将指定条数的数据复制到新的datatable里面
dt.ImportRow(st.Rows[i]);
}
}
}
//将datatable中的数据循环放在inface类的list数组中
foreach (DataRow item in dt.Rows)
{
_Info fc = new _Info();
fc.id = Convert.ToInt32(item["ID"]);
fc.name = Convert.ToString(item["Name"]);
fc.createtime = Convert.ToDateTime(item["Createtime"]);
info.Add(fc);
}
//返回筛选好的inface类的list数组
return info;
}
/// <summary>
/// 读取Csv文件返回DataSet
/// </summary>
/// <returns>Csv内容</returns>
public DataTable Csv(string filePath)
{
filePath = "C:\\Users\\mt\\Desktop\\Dome\\Dome\\Model\\Data.csv";
int n = 0;
DataTable dt = new DataTable();
String csvSplitBy = "(?<=^|,)(\"(?:[^\"]|\"\")*\"|[^,]*)";
//读取文件
StreamReader reader = new StreamReader(filePath, System.Text.Encoding.Default, false);
int i = 0, m = 0;
//返回下一个字符
reader.Peek();
//如果返回的下一个字符大于零
while (reader.Peek() > 0)
{ //m自身加一
m = m + 1;
//读取一行数据
string str = reader.ReadLine();
//如果m大于等于n+1
if (m >= n + 1)
{
if (m == n + 1) //如果是字段行,则自动加入字段。
{
MatchCollection mcs = Regex.Matches(str, csvSplitBy);
foreach (Match mc in mcs)
{
dt.Columns.Add(mc.Value); //增加列标题
}
}
else
{
MatchCollection mcs = Regex.Matches(str, "(?<=^|,)(\"(?:[^\"]|\"\")*\"|[^,]*)");
i = 0;
System.Data.DataRow dr = dt.NewRow();
foreach (Match mc in mcs)
{
dr[i] = mc.Value;
i++;
}
dt.Rows.Add(dr); //DataTable 增加一行
}
}
}
return dt;
}
}
}
**
Nvelocity模板获取数据
**
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>无标题页</title>
<link href="../js/pagination.css" rel="stylesheet" type="text/css" />
<style type="text/css">
body{font-size:84%; color:#333333; line-height:1.4;}
a{color:#34538b;}
#Searchresult{width:300px; height:100px; padding:20px; background:#f0f3f9;}
</style>
<script src="jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
</script>
</head>
<body>
<!--begin main-->
<div id="main">
<div class="list">
<ul>
<b> </b>
#set( $pagesize = 10 )
#foreach($info in $infos)
<li>$info.id $info.name $info.createtime.substring(0,10)</li>
##
#set($value = $velocityCount)
#end
</ul>
</div>
</div>
<!--end main-->
</body>
</html>
**
前台分页及获取数据
**
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Defualt.aspx.cs" Inherits="Dome._Defualt" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>ajax分页</title>
<style type="text/css">
.pagination {font-family: Tahoma;font-size: 12px;height: 22px;margin: 5px 10px;text-align: left;}
.pagination a,.page-cur,.page-start,.page-end,.page-disabled,.page-skip {
height:22px;line-height:22px;margin:0 3px 0 0;text-align:center;vertical-align:middle;white-space:nowrap;}
.pagination input {border-width: 1px;}
.page-start, .pagination a, .page-end, .page-disabled {border: 1px solid #CCCCCC;padding: 0 5px;}
.pagination a {text-decoration: none;}
.page-cur {background-color: #FFEDE1;border: 1px solid #FD6D01;color: #FD6D01;font-weight: 700;padding: 0 5px;}
.page-disabled {color: #CCCCCC;}
.page-skip {color: #666666;padding: 0 3px;}
</style>
</head>
<body>
<form id="Form1" runat="server">
<h3>Nvelocity、Json、Ajax读取.csv分页</h3>
<div id="list" ></div>
<div id="pageNav"></div>
</form>
</body>
</html>
<script type="text/javascript" language="javascript">
//同步调用
function Getjson(curPage) {
var _data = _Defualt.GetList(curPage).value;
document.getElementById("list").innerHTML = _data;
}
//异步调用
function GetPageList(curPage) {
_Defualt.GetList(curPage, callback);
}
function callback(responseObj) {
//渲染到dom中
document.getElementById("list").innerHTML = responseObj.value;
}
</script>
<script type="text/javascript">
testPage(1);
function testPage(curPage) {
var count = _Defualt.GetCount().value;
var pageSize = 10;
GetPageList(curPage);
supage('pageNav', 'testPage', '', curPage, count, pageSize);
// alert(count);
}
/**
* @param {String} divName 分页导航渲染到的dom对象ID
* @param {String} funName 点击页码需要执行后台查询数据的JS函数
* @param {Object} params 后台查询数据函数的参数,参数顺序就是该对象的顺序,当前页面一定要设置在里面的
* @param {String} total 后台返回的总记录数
* @param {Boolean} pageSize 每页显示的记录数,默认是10
*/
function supage(divId, funName, params, curPage, total, pageSize) {
var output = '<div class="pagination">';
var pageSize = parseInt(pageSize) > 0 ? parseInt(pageSize) : 10;
if (parseInt(total) == 0 || parseInt(total) == 'NaN') return;
var totalPage = Math.ceil(total / pageSize) + 1;
var curPage = parseInt(curPage) > 0 ? parseInt(curPage) : 1;
//从参数对象中解析出来各个参数
var param_str = '';
if (typeof params == 'object') {
for (o in params) {
if (typeof params[o] == 'string') {
param_str += '\'' + params[o] + '\',';
}
else {
param_str += params[o] + ',';
}
}
//alert(111);
}
//设置起始页码
if (totalPage > 10) {
if ((curPage - 5) > 0 && curPage < totalPage - 5) {
var start = curPage - 5;
var end = curPage + 5;
}
else if (curPage >= (totalPage - 5)) {
var start = totalPage - 10;
var end = totalPage;
}
else {
var start = 1;
var end = 10;
}
}
else {
var start = 1;
var end = totalPage;
}
//首页控制
if (curPage > 1) {
output += '<a href="javascript:' + funName + '(' + param_str + '1);" title="第一页" class="page-first">首页</a>';
}
else {
output += '<span class="page-disabled">首页</span> ';
}
//上一页菜单控制
if (curPage > 1) {
output += '<a href="javascript:' + funName + '(' + param_str + (curPage - 1) + ');" title="上一页" class="page-previous">上一页</a>';
}
else {
output += '<span class="page-disabled">上一页</span>';
}
//页码展示
for (i = start; i <= end; i++) {
if (i == curPage) {
output += '<a href="javascript:;" class="page-cur">' + curPage + '</a>';
}
else {
output += '<a href="javascript:' + funName + '(' + param_str + i + ');">' + i + '</a>';
}
}
//下一页菜单控制
if (totalPage > 1 && curPage < totalPage) {
output += '<a title="下一页" href="javascript:' + funName + '(' + param_str + (curPage + 1) + ');" class="page-next">下一页</a>';
}
else {
output += '<span class="page-disabled">下一页</span>';
}
//最后页控制
if (curPage < totalPage) {
output += '<a title="最后页" href="javascript:' + funName + '(' + param_str + totalPage + ');" class="page-end">末页</a>';
}
else {
output += '<span class="page-disabled">末页</span>';
}
output += '</div>';
//渲染到dom中
document.getElementById(divId).innerHTML = output;
};
</script>
只要头发在,代码不停敲。