来到东之林后,以前一直希望加入一个专业的开发团队,现在终于实现了...
首先接触的是工作流,公司需要一个基于web的图形化的工作流设计器,这个肯定要用js+vml了,由于本人js水平实在有限,以前也没有做过类似的项目,为了不影响公司的项目进度,这个任务就交出去了。
第二个任务是excel文件的导入,这是个基本的功能,以前做过很多次了,打开公司的项目,感觉公司项目的结构还不是很清晰,没有明显的分层,所以我自己建了一个逻辑类,算是业务逻辑层吧,linq算是数据模型,数据操作层就忽略不计了,现在有asp.net mvc,希望公司以后能用上,结构清晰利于项目的可维护性和可扩展性。
以前在写excel文件导入的时候,完成导入的功能就行了,现在我需要从用户的角度考虑,首先要验证excel每列的数据,然后考虑到导入过程中难免会产生错误,干脆把错误作为一个常态,增加一个错误列表,把错误信息也放进去,而且显示出来,这样用户导入后,知道哪些数据导入了,哪些没有导入。
在进行数据验证的时候,每个字段都要一一验证,这样用代码来写感觉太冗长了,以前见过一个表有上百的字段的,难道要写上百段验证代码吗,用xml吧,这样维护起来也灵活一些。。。
这是xml
<?xml version="1.0" encoding="utf-8" ?>
<table>
<fields>
<field isnull="0" fieldType="char">行政区名称</field>
<field isnull="0" fieldType="char">部件小类</field>
<field isnull="0" fieldType="char">部件名称</field>
<field isnull="1" fieldType="date">部件建立时间</field>
<field isnull="0" fieldType="char">主管部门名称</field>
<field isnull="1" fieldType="char">权属单位名称</field>
<field isnull="1" fieldType="char">养护单位名称</field>
<field isnull="1" fieldType="char">部件状态</field>
<field isnull="1" fieldType="char">普查数据来源</field>
<field isnull="1" fieldType="char">备注</field>
</fields>
</table>
首先验证模板

/// <summary>
/// //验证模板
/// </summary>
/// <param name="dt"></param>
/// <param name="strTemplateFile"></param>
/// <returns></returns>
private static bool ValidateTemplate(DataTable dt,string strTemplateFile)
{
XmlDocument xd = new XmlDocument();
strTemplateFile = System.Web.HttpContext.Current.Server.MapPath("") + @"..\..\XMLFile\PartsImportTemplate\" + strTemplateFile;
xd.Load(strTemplateFile);
XmlNodeList xnl = xd.SelectNodes("//field");
string strColumnString = "";
if (dt.Columns.Count != xnl.Count + 1) return false;
foreach(DataColumn dl in dt.Columns)
{
strColumnString += dl.ColumnName;
strColumnString += " ";
}
foreach (XmlNode xn in xnl)
{
if (strColumnString.IndexOf(xn.InnerText) == -1)
{
return false;
}
}
return true;
}
然后验证数据

/// <summary>
/// //根据配置文件验证
/// </summary>
/// <param name="dr"></param>
/// <returns></returns>
private static string ValidateInfo(DataRow dr,string strFile)
{
string strError = "";
XmlDocument xd = new XmlDocument();
strFile = System.Web.HttpContext.Current.Server.MapPath("") + @"..\..\XMLFile\PartsImportTemplate\" + strFile;
xd.Load(strFile);
//验证必填项
XmlNodeList xnl = xd.SelectNodes("//field[@isnull='0']");
foreach(XmlNode xn in xnl)
{
if ("" == dr[xn.InnerText].ToString().Trim())
{
strError = xn.InnerText + "不能为空!";
return strError;
}
}
//验证整数
xnl = xd.SelectNodes("//field[@fieldType='int']");
foreach (XmlNode xn in xnl)
{
Regex rx = new Regex(@"^([1-9][0-9]*)$");
if (dr[xn.InnerText].ToString().Trim().Length > 0 && !rx.IsMatch(dr[xn.InnerText].ToString().Trim()))
{
strError = xn.InnerText + "格式应为数字!";
return strError;
}
}
//验证浮点数
xnl = xd.SelectNodes("//field[@fieldType='float']");
foreach (XmlNode xn in xnl)
{
if (dr[xn.InnerText].ToString().Trim().Length > 0)
{
try
{
float fl = Convert.ToSingle(dr[xn.InnerText].ToString().Trim());
//return strError;
}
catch
{
strError = xn.InnerText + "格式应为数字或小数!";
return strError;
}
}
}
//验证日期
xnl = xd.SelectNodes("//field[@fieldType='date']");
foreach (XmlNode xn in xnl)
{
if (dr[xn.InnerText].ToString().Trim().Length > 0)
{
try
{
DateTime fl = Convert.ToDateTime(dr[xn.InnerText].ToString().Trim());
//return strError;
}
catch
{
strError = xn.InnerText + "格式应为日期!";
return strError;
}
}
}
return strError;
}
这样代码看起来轻盈多了,维护起来也方便一些…,当然这个功能还能继续扩展,做的更加灵活…,由此觉得公司应该有通用验证类,c#版和js版的,这个应该是基本的…
后面的任务就都是一些基本的增删改查了,用到了公司自己的linq api 感觉很好,很大程度提高了生产效率,以前用ado.net存储过程,要搞一大堆参数,很耗时间。当然存储过程还是有用的,基本的增删改查用linq足够了,如果涉及后台数据复杂计算和统计那还是要用存储过程效率高一些。值得提及的是ajax,用了ajaxPro,感觉很方便,这个是在家里面做的,刚开始不起作用,代码里面该写的都写了,后来要在项目里面引用ajaxPro才行。里面有个小问题,在垃圾清运费用里面,用户输入重量的时候,应收金额文本框自动根据收费标准和用户输入的重量计算并显示相应的值,这个起先是没有问题的,可是后来在测试的时候,如果输入重量时,用户选择了文本自动提示的历史数据,就不触发文本框的相关事件了,这样会造成应收金额计算错误,必须把这个提示屏蔽掉:
document.getElementById("Wage").setAttribute('autocomplete','off');
还有一点就是,用户确认提示框,在某个功能里面需要在后台捕获用户confirm提示框的返回值,这里需要在页面添加一个linkbutton,然后添加代码:
String scriptString = "<script>if (confirm('该社区该月收入已存在,是否更新?')) __doPostBack('LinkButton1','')</script>";
ClientScript.RegisterClientScriptBlock(this.GetType(), "clientScript", scriptString);
这个时候,confirm方法返回true就会触发linkbutton的后台事件,将相应的代码写在linkbutton的click事件里面就ok了,这个里面不能把linkbutton的visible设为false,否则将失效。
还有一个任务是数据整理,这个主要是excel的格式比较复杂,不能直接返回DataTable,要用DataReader逐条读取,然后是整理,整理过程比较复杂,写了四页sql,很遗憾这些sql被我无意识删掉了。
最后在测试后做了异常处理,先是要在每个页面加,后来就干脆写在BasePage里面吧:
protected override void OnError(EventArgs e)
{
string returnPagePath = GetRootPath("Error.aspx");
Exception ex = Server.GetLastError();
Server.Transfer(returnPagePath + "?error=" + ex.Message);
}只要继承BasePage就能处理未截获的异常了。这样更加人性化一些,当然还有一种方法是在webconfig里面进行配置,更加简单。
谈一下分页吧,项目里面感觉还是假分页,使用的是分页控件,需要把数据先全部load,数据量小可以,数据量大的话会影响运行效率,以前真分页是用存储过程实现的,现在用linq,linq也有分页方法,以后数据量大的页面肯定还是要用真分页的。
虽然都是一些很肤浅的技术,但还是尽量做好吧,希望以后和大家多些交流和沟通…大家一起与时俱进…
一、简单排序
1.直接插入排序
在插入元素时直接进行排序。
2.冒泡排序
代码如下:

Code
void bubbleSort(int data[],int n)
/*将数组中的N个整数按照非递减有序的方式进行排列*/
{
int i,j,temp,tag;
/*tag等于1表示上一趟排序存在交换处理*/
for(i = 0,tag = 1;tag == 1 && i < n-1;i++)
{
tag = 0;
for(j = 0;j < n - i - 1;j++)
if(data[j] > data[j+1])
{
temp = data[j];
data[j] = data[j+1];
data[j+1] = temp;
tag = 1;
}/*if*/
}/*for*/
}/*bubbleSort*/
3.简单选择排序
代码如下:

Code
void selectSort(int data[],int n)
{
int i,j,k,temp;
for(i = 0;i < n-1;i++)
{
k = i;
for(j = i + 1;j < n;j++)
{
if(data[j] < data[k])
k = j;
if(k != i)
{
temp = data[i];
data[i] = data[j];
data[j] = temp;
}/*if*/
}/*for*/
}/*for*/
}/*selectSort*/
4.希尔排序
希尔排序又称“最小缩量排序”,是对直接插入排序方法的改进。

一、哈希表的构造
哈希表的构造方法包括直接定址法、数字分析法、平方取中法、折叠法、随机数法和除留余数法。
二、处理冲突



上图哈希表进行成功查找的平均查找长度为:
ASL = (6×1+3×2)/9 = 1.34
摘要: 一、二叉树的性质二、二叉树的分类三、二叉树的遍历else{PostOrder(root->lchild);PostOrder(root->rchild);printf("d%",root->data);}
阅读全文
摘要: 则称之为稀疏矩阵。稀疏矩阵的三元组表的顺序存储结构为三元顺序表,常用的三元组表的链式存储结构是十字链表。
阅读全文
摘要: 二维数组:按行存储和按列存储,数组元素存储位置的计算:
阅读全文
摘要: 1.栈的应用:栈的典型应用包括表达式求值、括号匹配等。在计算机语言的实现以及将递归过程转变为非递归过程的处理中,栈有重要的作用。典型案例求解:迷宫求解问题2.队列:允许插入元素的一端成为队尾(rear),允许删除的一端成为队首(front)
阅读全文
摘要: 1.简述线性结构、树形结构、图状结构的逻辑特点线性结构:每个结点只有一个前驱和一个后继;树形结构:每个结点有一个前驱和多个个后继;图状结构:每个结点有一个前驱和多个个后继;2.简述顺序存储方法和链接存储方法的优缺点顺序存储:优点>节省存储空间,缺点>不便于修改(插入、删除结点)链接存储:优点>便于修改(插入、删除结点),缺点>存储效率不高3.设一维数组V中存有n个整数,(1...
阅读全文