Edi Wang

Microsoft MVP for Azure

All Posts

高效程序猿之(一)VS2010快速生成代码模板

一只程序猿的生产效率很重要。生成效率高了,老板喜欢你,妹子崇拜你,你也可以给自己节省很多时间。 加班的一般都是新手程序猿,除了对语言和技术不熟悉,工具也是很影响生成效率的因素。我们知道,猿和其他动物最大的区别在于,猿会使用工具。所以这一系列我将介绍一下如何用好手头的工具来帮助我们提高效率。 今天我们来看看如何在Visual Studio 2010中用内置的模板快速生成代码片段。 代码模板就是预先定义好的一个代码片段。VS中,我们只要输入模板的名称,然后连按两下TAB,VS就可以给我们把代码片段补充完整。 下面列出的这些都是VS2010的预置代码片段 流程控制语句估计大家都知道,这是最常用的“两下tab”: 关键词 生成词 for for(int i = 0; i < length; i++){} foreach foreach (var item in collection) {} …
Visual Studio

LINQ to XML CRUD,并且封装为DAL方法

LINQ非常牛逼,操作数据库和集合对象非常方便,已经得到了非常广泛的应用。好处我不多说了。今天来给大家看看LINQ对XML的增删改查操作,并且封装为DAL类,方便在多层结构的应用程序中使用。以我网站的友情链接模块为例: XML文件的结构如下: 1 XNA Develop http://www.xnadevelop.com/ 1 2 BlogNT 开源.NET博客 http://www.blognt.com/ 2  和以往写ORM一样,我们首先要把对数据的描述抽象为model: public sealed class FriendLink { private int _id; private string _title; private string _ …
C# CRUD XML

ASP.NET List泛型分页代码

2011.11.13修正: 1. 改正页数计算方法,以前的计算公式遇到整除就会多一页 2. 重发关键代码,以前因为编辑器的原因,部分代码会被过滤 3. 新增“转到[]页”功能 我们以前做ASP.NET网站,通常是把DataSet绑定到显示控件上,再用各种手段进行分页,比如PagedDataSource。然而,如果你是从业务层取数据,通常是一个List,这个时候就不能用以往的方法分页了。 一种办法是用ObjectDataSource,绑定GridView、ListView就可以分页,但如果遇到DataList或Repeater,就得自己写分页了。下面是我昨天写的List泛型分页Demo,有图有真相: 下面发代码: List泛型分页通用类: /// /// 泛型分页类 /// /// 类型 public class ListPager : List { …
ASP.NET Generics

ASP.NET中URL重写和Session冲突的问题

今天在改博客系统的一个Bug的时候,程序里用了Session,结果一跑就报错:只有在配置文件或 Page 指令中将 enableSessionState 设置为 true  时,才能使用会话状态。还请确保在应用程序配置的<configuration>\<system.web>\<httpModules>节中包括  System.Web.SessionStateMod 或自定义会话状态模块。然而用VS自带的Web Server调试一点问题都没有。唯独在IIS下跑的时候老报错,错误语句就是那行用了Session的程序。唯一的区别就是VS下调试时,URL没有重写。于是我回到IIS上,用完整的URL试了下,果然木有问题。 我所使用的是URLRewriter.dll,似乎是当年微软提供的,经过一番查找,似乎有很多人和我有同样的问题,不管他们用的是不是URLRewriter.dll。 奇怪的是,并不是 …
ASP.NET Session URL

C#仿魔兽世界密保卡OOP重构版

昨天下午我把《C#仿魔兽世界密保卡简单实现》 中的代码用面向对象的方法重构了一遍,引入了2个类:MatrixCard和Cell。MatrixCard描述的是密保卡,构造函数中会随机生成一个二 维矩阵,所以每次new一个MatrixCard对象,就已经生成了一张密保卡。Cell是单元格的意思,将行号、列号、列名做了封装。 MatrixCard类中保留了之前的大部分静态方法,以便灵活调用。由于本人水平有限,这次的设计并不是非常完美,并且也有一些遗憾。比如现在只能通过Cell[i]的方式来访问单元格,而不可以像Cell["A0"]这样写。有空的时候哥去研究一下重载索引器,争取把它实现。下面发代码:MatrixCard类:using System; using System.Collections.Generic; namespace GeekStudio.Common {    …
C# Refactor

C#仿魔兽世界密保卡简单实现

昨天拿C#写了个简单的密保卡程序(Console的,偷懒了一下 哈哈),实现了随机生成5x5矩阵卡、转换为字符串、从字符串读取矩阵卡以及简单验证的功能。不过我写的比较草率,代码结构不是很好,也没有体现OOP的思想,这几天有空会重构一下。先把代码发出来:public class MatrixCardManager      {          public static int[,] ReadMatrixCardFromString(string matrixStr)          {              int[,] arr1 = new int[5, 5];              int[] tempArr = new int[25];              int k = 0;              string[] tempArrStr =  …
C#

ASP.NET读写Web.Config

先说下,我写的很多技术类文章都是面向初学者的,为了便于他们理解,我会写的尽量详细,包括很多最基础的操作步骤,并且有些说法可能不太严谨,高手请勿追究。以前我做网站设置模块的时候,总喜欢把设置都写在一个xml文件里,然后用程序去读写这个xml文件。虽然.NET对XML的支持很好(现在有Linq To XML了),并且我也使用了一个XML工具类,但总体来说,自己手动读写一个xml文件,还是有点蛋疼的。一不小心就容易出错。 今天我突然想到,我们曾经无数次在Web.Config里读取过连接字符串,那么为何不把网站的设置信息也保存在Web.Config中呢?只要使用System.Configuration下的ConfigurationManager类就可以操作Web.Config了,微软都给我们封装好了! 为了验证这一点的可行性,我写
ASP.NET Web.Config

ASP.NET GridView超链接列取值

场景:开发一个简单的Web文件管理功能,第一列是指向文件的超链接,最后一列放一个删除按钮。现在要求按删除按钮后,删除对应的文件。 思路:获取当前行的第一列的值,然后调用File.Delete()方法。 按照以往的写法,我们会在GridView的SelectedIndexChanged事件中,先找到当前行: int i = GridView1.SelectedIndex; 然后通过 GridView1.Rows[i].Cells[0].Text来访问当前行第一列的数据。 但是,如果不幸遇到超链接列,这种写法取出的缺是空串。我研究了好久,最后发现,HyperLink Field在GridView中要当作Web Control来处理。所以必须先转换为HyperLink,然后才能访问其Text属性。写法如下: ((HyperLink)GridView1.Rows[i].Cells[0]. …
ASP.NET GridView

ASP.NET Repeater控件绑定List<T>泛型的写法

我们在开发分成架构的Web应用程序时,常常把数据库中的记录放到一个List中,做到了良好的封装。调用业务逻辑的程序猿也无需知道库表结构就可以直接使用“Model.属性”来访问各个字段的数据了。但在做显示的时候,初学者可能会碰到一些问题。以往大家在显示控件(如Repeater)上绑定的都是DataSet,ASPX页面里写的是“<%# Eval("字段名")%>”。那如何绑定一个List泛型呢? 其实,Repeater控件是支持绑定到业务对象的,并且我们也不再用Eval表达式了。看一个例子: 后台代码: GeekStudio.BLL.Blog optBlog = new GeekStudio.BLL.Blog(); Repeater1.DataSource = optBlog.GetModelList(); Repeater1.DataBind(); 其中,GetModelList()返回的是 …
ASP.NET Generics

Search and Destroy Process using C#

Recently, I saw an exam system that has a feature to monitor the process. As soon as prohibited software such as Communicator.exe is found, the process is immediately killed and reported to the server. I looked into it a little bit, and this feature is actually quite simple to implement. It is to use ManagementObjectSearcher to get a list of processes, then put them in a Collection, and then you can do it according to your own logic. Here's an example: get a list of processes, create a list of "banned" processes, find and kill processes. Note that you need to add a reference to System.Management in your project first.
C# Process