建立Silverlight2.0控件(Usercontrol)

Silverlight 2.0有一个非常重要的部分,就是控件技术的出现,透过可自行定义开发的控件建立机制,Silverlight ASP.NET一样,可以自行定义可重用的 UserControl,这对于开发人员有着相当重要的意义,这表示对象化的设计、ReUse与大量的开发开始变的可能。

< xml:namespace prefix = o ns = “urn:schemas-microsoft-com:office:office” />

有这些作为基础,我们才有可能真正透过Sivlerlight 2.0建立中大型的应用程序或是RIA,也才有可能确保投资可以延续并且在团队开发当中累积资源。

这么重要的机制,当然要给他试用一下,上图是我尝试建立的traffic light控件,模拟一个红绿灯,一样具有属性、事件、方法……可以跟外部的程序互动,画面中的ButtonTextBox则是Silverlight 2.0当中本来就有的控件,通过.NET Code的开发方式,你可以用C#或是VB,确实比过去1.0时代用JavaScriptAJAX方便很多。

在该控件在被使用者点选之后,会触发一个Click事件,这个事件是我们自己建立出来的,我们可以在这个事件当中改变TextBox内的值(你试用看看就知道)。当然,我们也可以在其他控件(例如按钮)当中来改变灯号(通过traffic light控件的属性),总而言之,这就是一个标准的控件啦。

您可以点选[这里]测试一下这个控件,关于程序代码的说明我会在七月的Run!PC当中介绍,如果您需要Source Code,请私下偷偷Mail给我。

利用oleDB对象,将数据库中全部表转换成XML文件

                                       

ASP.NET Dataset让你在页面中使用XML格式的文件提供了便利。如果您的数据全部都在一个数据库中,该如何进行转换呢?如果你的数据库与OleDb兼容的话,下面就看看如何把数据库中的所有表转换成XML文件。文件名字与数据库中的表的名字相同。本代码包含两个版本:C#版本和VB.NET版本。

C#版本:[测试]

<%@ Page Language=”C#” %>

<%@ import Namespace=”System” %>

<%@ import Namespace=”System.Data” %>

<%@ import Namespace=”System.Data.OleDb” %>

<script runat=”server”>

void Page_Load(object sender, EventArgs e) {

if (!IsPostBack) {

TextBox1.Text = “PROVIDER=SQLOLEDB; Data Source=.; Initial Catalog=pubs;User ID=sa;Password=;”;

Label1.Text = “”;

}

}

void CreateXml(object sender, EventArgs e) {

OleDbConnection dataConn = new OleDbConnection(TextBox1.Text);

Uri Path = Request.Url;

String ServerUrl = Path.ToString();

ServerUrl = ServerUrl.Substring(0,ServerUrl.LastIndexOf(“/”) +1 );

try {

Literal1.Text = “已经在你的相同目录下创建了一下文件:<br/>” ;

dataConn.Open();

DataTable schemaTable = dataConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,new object[] {null, null, null, “TABLE”});

for(int i = 0; i < schemaTable.Rows.Count; i++){

OleDbDataAdapter dbAdapter= new OleDbDataAdapter(“select * from [” + schemaTable.Rows[i].ItemArray[2].ToString() + “]”,dataConn);

DataSet tableData = new DataSet();

dbAdapter.Fill(tableData,schemaTable.Rows[i].ItemArray[2].ToString());

tableData.WriteXml(HttpContext.Current.Server.MapPath(schemaTable.Rows[i].ItemArray[2].ToString() + “.xml”));

Literal1.Text = Literal1.Text + “<a href='” + ServerUrl + schemaTable.Rows[i].ItemArray[2].ToString() + “.xml’>”;

Literal1.Text = Literal1.Text + schemaTable.Rows[i].ItemArray[2].ToString() + “.xml</a><br/>”;

}

}

catch(Exception ex) {

Label1.Text = ex.Message.ToString();

}

finally {

dataConn.Close();

}

}

</script>

<html>

<head>

<title>leDb2XML:数据库转换成XML文件例子</title>

</head>

<body bgcolor=”#FFFFFF”>

<center>

<h2><font face=”宋体”>OleDb2XML:数据库转换成XML文件例子</font>

</h2>

</center>

<form runat=”server” ID=”Form1″>

<font face=”宋体”>

<p align=”center”>请输入OleDb连接字符串,然后点“生成XML文件”按钮。</p>

<p align=”center”>

<asp:TextBox id=”TextBox1″ runat=”server” Width=”600″></asp:TextBox>

</p>

<p align=”center”>

<asp:Button id=”Button1″ onclick=”CreateXml” runat=”server” Text=”生成XML文件”></asp:Button>

</p>

<p align=”center”>

<asp:Label id=”Label1″ runat=”server” Font-Bold=”True” ForeColor=”Red”></asp:Label>

</p>

<p align=”center”>

<asp:Literal id=”Literal1″ runat=”server”></asp:Literal>

</p>

</font>

</form>

</body>

</html>

VB.NET版本:[测试]

<%@ import Namespace=”System.Data.OleDb” %>

<%@ import Namespace=”System.Data” %>

<%@ import Namespace=”System” %>

<%@ Page Language=”VB” %>

<HTML>

<HEAD>

<title>leDb2XML:数据库转换成XML文件例子</title>

<script runat=”server”>

Sub Page_Load(sender As Object, e As EventArgs)

If Not IsPostBack Then

‘TextBox1.Text = “Provider=SqlOLEDB; Data Source=.; Initial Catalog=pubs;User ID=sa;Password=;”

Label1.Text = “”

TextBox1.Text = “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=” + Server.MapPath(“Test.mdb”)

End If

End Sub

Sub CreateXml(sender As Object, e As EventArgs)

Dim dataConn As New OleDbConnection(TextBox1.Text)

Dim Path As Uri = Request.Url

Dim ServerUrl As String = Path.ToString()

ServerUrl = ServerUrl.Substring(0,ServerUrl.LastIndexOf(“/”) + 1 )

Try

Literal1.Text = “已经在你的相同目录下创建了一下文件:<br/>”

dataConn.Open()

Dim schemaTable As DataTable

schemaTable = dataConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, “TABLE”})

Dim i As Integer

For i = 0 To schemaTable.Rows.Count – 1

Dim dbAdapter As New OleDbDataAdapter(“select * from [” + schemaTable.Rows(i).ItemArray(2).ToString() + “]”, dataConn)

Dim tableData As New DataSet()

dbAdapter.Fill(tableData, schemaTable.Rows(i).ItemArray(2).ToString())

tableData.WriteXml(HttpContext.Current.Server.MapPath((schemaTable.Rows(i).ItemArray(2).ToString() + “.xml”)))

Literal1.Text = Literal1.ext + “<a href='” + ServerUrl + schemaTable.Rows(i).ItemArray(2).ToString() + “.xml’>”

Literal1.Text = Literal1.Text + schemaTable.Rows(i).ItemArray(2).ToString() + “.xml</a><br/>”

Next i

Catch ex As Exception

Label1.Text = ex.Message.ToString()

Finally

dataConn.Close()

End Try

End Sub

</script>

</HEAD>

<body bgcolor=”#ffffff”>

<h2 align=center><font face=”宋体”>OleDb2XML:数据库转换成XML文件例子</font></h2>

<form runat=”server” ID=”Form1″>

<font face=”宋体”>

<p align=”center”>请输入OleDb连接字符串,然后点“生成XML文件”按钮。</p>

<p align=”center”>

<asp:TextBox id=”TextBox1″ runat=”server” Width=”600″></asp:TextBox>

</p>

<p align=”center”>

<asp:Button id=”Button1″ onclick=”CreateXml” runat=”server” Text=”生成XML文件”></asp:Button>

</p>

<p align=”center”>

<asp:Label id=”Label1″ runat=”server” Font-Bold=”True” ForeColor=”Red”></asp:Label>

</p>

<p align=”center”>

<asp:Literal id=”Literal1″ runat=”server”></asp:Literal>

</p>

</font>

</form>

</body>

</HTML>

对于数据量大的数据库,处理可能会需要更多的时间,因此有可能需要更改machine.config文件中processModel的responseDeadlockInterval 属性,比如为5分钟,默认为3分钟。

<processModel

enable=”true”

timeout=”Infinite”

idleTimeout=”Infinite”

shutdownTimeout=”0:00:05″

requestLimit=”Infinite”

requestQueueLimit=”5000″

restartQueueLimit=”10″

memoryLimit=”60″

webGarden=”false”

cpuMask=”0xffffffff”

userName=”machine”

password=”AutoGenerate”

logLevel=”Errors”

clientConnectedCheck=”0:00:05″

comAuthenticationLevel=”Connect”

comImpersonationLevel=”Impersonate”

responseRestartDeadlockInterval=”00:09:00″

responseDeadlockInterval=”00:05:00″ default is 00:03:00

maxWorkerThreads=”25″

maxIoThreads=”25″ />

代码生成器集合(整理)

1:CodeSmith
  一款人气很旺国外的基于模板的dotnet代码生成器
官方网站:http://www.codesmithtools.com
官方论坛:http://forum.codesmithtools.com/default.aspx
版权形式:30天试用
开源:否
需要先注册确认后才能下载
2:MyGenerator
  MyGenerator是又一个国外很不错的代码生成工具,有人觉得比CodeSmith简单、好用。所有api可以在帮助菜单中找到。
官方网站:http://www.mygenerationsoftware.com/portal/default.aspx
官方论坛:
版权形式:免费
开源:否 下载
3:NHibernate.
  NHibernate是Hibernate公司在Java自动生成领域取得巨大成功后推出的一款ORM工具.
官方网站:http://www.hibernate.org/
官方论坛:
版权形式:免费
开源:否 下载
4:湛蓝.Net代码生成器
  一款基于软件自动生成理念,能直接生成应用的dotnet代码生成器
官方网站:http://www.dotnetcoding.net
官方论坛:http://dotnetcoding.cnblogs.com/
版权形式:免费
开源:否 下载
5:动软.NET代码自动生成器
  一款人气很旺的免费C#代码生成器
官方网站:http://www.maticsoft.com
官方论坛:
版权形式:免费
开源:否 下载
6:CodePlus
  专为sql server c#语言设计的代码生成器,功能还是很强大
官方网站:http://www.CodePlus.com
官方论坛:
版权形式:需要少量的注册费用
开源:否
下载地址很神秘
7:CodeMaker
  asp,jsp,php代码生成工具,自动生成维护数据库信息的动态网页的代码生成器。它可以帮助ASP、JSP、PHP开发人员快速的开发简单的数据库维护程序。无需任何编码,只需将数据库结构导入到CodeMaker中并做简单的设置,CodeMaker即可生成完整的数据库操作页面。用CodeMaker可以简单快速的创建网站后台维护程序。提高开发效率数十倍以上。
官方网站:http://www.mhua.com
官方论坛:
版权形式:免费
开源:否 下载
8:非非.Net代码生成器
  可以使用本工具生成VB.Net和C#语言的代码,以及三层架构与ORM架构代码,并且使用的ORM持久化组件是开源的,您可以在本软件的安装目录下找到它
官方网站:
官方论坛:
版权形式:免费
开源:否 下载
9: BMW业务模型及代码生成器
  一款人气很旺的免费C#代码生成器
官方网站:
官方论坛:
版权形式:免费
开源:否 下载
10:飞鹰CoolCoder
  专门为采用nhibernate做关系对象影射架构的系统提供代码的工具,简单易用,虽然不提供源码,我们可以用反编译工具对其反编译看源码。这是个很不错的学习机会。

官方网站:
官方论坛:
版权形式:免费
开源:否 下载

11:AutoCoder自动代码生成器
  AutoCoder自动代码生成器是一个根据模板自动生成代码的代码生成工具,根据模板的不同,可以生成任何语言(如:ASP、C#、C++BUILDER、DELPHI、JAVA、JSP、PHP、VB、VC.NET……),不同层次结构(B/S、C/S、n-tiger……),基于不同数据库(ORACLE、MSSQL、MYSQL、DB2、ACCESS、ODBC、OLE……)的代码和开发文档。开发人员无需任何编码,只需将数据库结构导入到AutoCoder中,并做简单的设置即可生成所需的代码,可以大幅度地提高开发效率!!!系统同时也提供了一个模板制作工具ModeMaker,用户可以方便的制作或修改模板,使得生成的代码更适合您使用!系统附带了十几个模板,基本上可以满足用户多方位的需求
官方网站:
官方论坛:
版权形式:免费
开源:否 下载
12:wawa Code Pro代码生成器
  一款开源的用VBScript写的代码生成器
官方网站:
官方论坛:
版权形式:免费
开源:是 下载

 

.net面试题

1.1.1 Visual Studio.NET 有几个集成开发环境?
○ A.一个 ○ B.两个 ○ C.三个 ○ D.四个
1.1.2 我们称.NET编程架构是什么?
○ A..NET Framework ○ B.VS.NET ○ C.XML Web Service ○ D. 开发工具
1.1.3 以下那些标准是与Web Service相关的
○ A..SOAP ○ B. WSDL ○ C.UDDI ○ D. 以上都是
1.1.4 SOAP标准是谁来制定的 
○ A. Microsoft ○ B. W3C ○ C.IBM ○ D. SUN
1.1.5 Visual Studio.NET 会支持多少种开发语言?
○ A. 两种 ○ B. 三种 ○ C.四种 ○ D. 多种
1.1.6 ASP.NET 是用来开发何种应用的?
○ A. Windows应用 ○ B. .NET组件类 ○ C. Web应用 ○ D. 命令行应用程序
1.1.7 C#编译器将C#程序编译成什么样的代码?
A. 汇编语言代码
B. 机器语言代码
C. 微软中间语言代码
D. 二进制代码
答案:C
1.2 B 类题
1.2.1 所有的.NET基类库是用什么语言编写的?
○ A. C++ ○ B. C# ○ C. VB.NET ○ D. 汇编
1.2.2 什么语言提供了对XML注释的支持?
○ A. C++ ○ B. C# ○ C. VB.NET ○ D. Jscript
1.2.3 关于微软中间语言,下面什么说法错误的?
A. 它是解释执行的。
B. 在执行时,它被转化为机器代码。
C. 它是处理器无关的指令集。
D. 它允许真正的跨语言集成。
1.2.4 . ASP.NET比ASP相比较,下列哪个是不正确的?
A. 支持更多编程语言
B. 可以同时存在于一个应用程序里
C. 用户界面和代码分离,大大提高编程质量
D. 都支持页面级和应用程序级的跟踪调试
1.2.5 关于VB.NET,与C#(发音,C sharp)比较,下列哪项是不正确的?
A. 都是类型安全的编程语言。
B. 都支持自动垃圾收集。
C. 都是面向对象的语言。
D. VB.NET不支持API调用。
1.2.6 微软在VS.NET默认安装中提供了几种编程语言的开发环境?
A. 2种
B. 3种
C. 4种
D. 5种

CodeSmith基础(四)

CodeSmith基础(四)

本文是翻译的第四篇,内容为在CodeSmith中使用的语法和标签的参考。

CodeSmith模板语法参考
本文的目的是在编写一个CodeSmith模板时遇到的各种类型的变量和对象提供参考。本文的目的不是要介绍CodeSmith,如果您想快速了解CodeSmith请查看我翻译的CodeSmith基础(一)和CodeSmith基础(二)。

标签
标签一般出现在模板的头部,被用做设置许多不同的属性。
代码模板的声明(CodeTemplate Directive
这个是模板中唯一必须的声明,包含一些模板特殊的属性,包含模板使用的语言、生成的语言和一些对于模板的描述。
例:
参数的介绍:
Language
:在开发编写模板时使用的语言,例如C#VB.NETJscript等。
TargetLanguage
:只是对模板代码的一个分类,不会影响生成的代码语言。是模板的一个属性,说明模板要基于那种语言生成相应的代码。例如你可以用CodeSmith从任何一种语言生成C#代码。
Description
:对于模板的一些说明信息,在CodeSmith Explorer中选中该模板时会显示这里的信息。
Inherits
:所有CodeSmith模板默认继承自CodeSmith.Engine.CodeTemplate,这个类提供模板使用的一些基本功能,像ASP.NET页面的Page类,这些被继承的类的属性可以被修改,但是这些新的类也必须继承CodeSmith.Engine.CodeTemplateCodeSmith也同样可以找到这个类,当然你要引入一个组件包含这个类。
Src
:在某些方面Src和继承Inherits比较相似,它们都允许你从其他的类包含一些功能进模板。这两个属性的区别是,Src可以让类与你的模板被动态编译,而Inherits仅允许你提供一个已经编译好的类或组件。
Debug
:可以确定是否在模板中可以包含调试符号。如果将这个属性设置为True,则可以使用System.Diagnostics.Debugger.Break()方法来设置断点。
LinePragmas
:设置为True,模板的错误将被指向到模板的源代码。设置为False,模板的错误将被指向到编译的源代码。

属性的声明(Property Directive
属性被用做在模板运行时声明一个使用的参数,例:

<%@CodeTemplateLanguage=”C#”TargetLanguage=”C#”Description=”Generatesaclass.”%>

<%@PropertyName=”ClassName”Type=”String”Default=”Class1″Category=”Context”Description=”Thenameoftheclasstogenerate”Optional=”true”%>

属性参数的介绍:

Name:模版使用的参数的名称。
Type
:参数类型可以是任何.NET有效的数据类型,例如简单的String类型或者是CodeSmithSchemaExplorer.DatabaseSchema类型。注意,类型必须是基类库的类型,例如用String或者Int32代替stringint
Default
:设置默认值。
Category
:用来说明这个属性在CodeSmith Explorer的属性面板中显示成什么类型,例如下拉选择、直接输入等。
Description
:在属性面板中对于这个属性的描述。
Optional
:设置这个属性是否是必须的,设置为True表明这个参数值可有可无,设置为False则这个参数必须有值。
Editor
:表明在属性面板中输入这个属性的值时使用何种GUI(图形界面编辑器)编辑器。
EditorBase
:编辑器使用的基本类型,如果没有被说明,UITypeEditor为默认编辑器。
Serializer
:这块我的水平不太会犯疑:)The serializer parameter specifies the IPropertySerializer type to use when serializing the properties values. This is equivalent to using a [PropertySerializerAttribute].

XML属性声明(XmlProperty Directive
例:属性的参数:
Name
:名称。
Schema
:这个参数用来指定一个X<rtx w:st=”on”>SD</rtx>文件,创建一个强类型对象模型。如果这个计划被指定,编译器会尝试分析这个X<rtx w:st=”on”>SD</rtx>文件并为这个计划生成一个强类型对象模型,这样可以在模版中使用强类型和智能与XML协同工作。如果这个计划没有被设定,这个参数将为XmlDocument类型并且将使用XML DOM去导航到一个XML内容并生成代码。
Category
:在CodeSmith属性面板中的类别。
Description
:描述。
Optional
:这个参数是否是必须的,如果设置为True,则参数不是必须的,反之False则为必须的。在设置为False时,如果用户没有提供参数则CodeSmith不能继续运行。

注册的声明(Register Directive
这个属性通常被用作引入另一个模版文件并与当前的模版文件同时被编译。这是一种使用子模版的交互方法。
例:
模版一旦被注册,就可以建立一个模版的实例,然后象这样设置它的属性:注册的参数:
Name
:代表被引入的模版的名称。它可以被用作创建一个模版的实例。
Template
:被引入模版文件的相对路径,它可以与当前的模版一起被动态的编译。
MergeProperties
:设置成True时,所有被引用的面板的属性将被动态的添加到当前模版中。
ExcludePorperties
:当使用MergeProperties时,你可能不需要某些属性被添加到当前模版中。将不需要的属性以逗号分隔放在这里,*号可以被用作通配符使用。

组件的声明(Assembly Directive
用作在模版中引用一个外部部组件,或者包含一个编译好的源文件。
例:
CodeSmith自动加载一些不同的组件:System, System.Diagnostics, System.ComponentModel, Microsoft.VisualBasic, CodeSmith.Engine

组件的参数:
Name
:需要引用组件的名称,组建必须存在于Global Assembly Cache,与CodeSmith在同一路径下或与模版文件在同一路径下。
Src
:要包含文件的相对路径。

引入的声明(Import Directive
在模版中引入一个命名空间,这个与VB.NET中的ImportsC#中的using相同。
例:
引入的参数:
NameSpace
:被引入的命名空间的名字。记住同时必须要加载包含这个命名空间的相应组件,除非这个组件是被默认加载的。

<%@XmlPropertyName=”EntityMap”Schema=”EntityMap.xsd”Optional=”False”Category=”Context”Description=”EntityMapXMLfiletobasetheoutputon.”%>

XML

<%@RegisterName=”MySubTemplate”Template=”MySubTemplate.cst”MergeProperties=”True”ExcludeProperties=”SomeExcludedPropertyName,SomeProperties*”%>

1<scriptrunat=template>
2publicvoidOutputSubTemplate()
3{
4MySubTemplatemySubTemplate=newMySubTemplate();
5
6//setanindividualpropertiesvalue.
7mySubTemplate.SomeExcludedPropertyName=SomeValue;
8
9//copyallpropertieswithmatchingnameandtypetothesubtemplateinstance.
10this.CopyPropertiesTo(mySubTemplate);
11
12//renderthetemplatetothecurrenttemplatesResponseobject.
13mySubTemplate.Render(this.Response);
14
15//renderthetemplatetoafile.
16mySubTemplate.RenderToFile(C:\SomeFile.txt);
17}
18</script>
<%@AssemblyName=”SchemaExplorer”%>
<%@AssemblySrc=”MySourceFile.cs”%>
<%@ImportNamespace=”SchemaExplorer”%>

HttpResponse..::.OutputStream属性

启用到输出 HTTP 内容主体的二进制输出。

示例

<!—->

下面的示例调用 Save 方法将一个 Bitmap 对象保存到 OutputStream 属性中,并将图像转换为 JPEG 格式。然后,代码调用 Bitmap 对象和 Graphics 对象的 Dispose 方法,释放它们正在使用的资源。最后,代码调用 Flush 方法将响应的内容发送到请求客户端。

有关完整示例,请参见 HttpResponse 类。

Visual Basic
<%@ Page Language="VB" %>
<%@ import Namespace="System.Drawing" %>
<%@ import Namespace="System.Drawing.Imaging" %>
<%@ import Namespace="System.Drawing.Drawing2D" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">

   Private Sub Page_Load(sender As Object, e As EventArgs)
      ' Set the page's content type to JPEG files
      ' and clear all response headers.
      Response.ContentType = "image/jpeg"
      Response.Clear()

      ' Buffer response so that page is sent
      ' after processing is complete.
      Response.BufferOutput = True

      ' Create a font style.
      Dim rectangleFont As New Font( _
          "Arial", 10, FontStyle.Bold)

      ' Create integer variables.
      Dim height As Integer = 100
      Dim width As Integer = 200

      ' Create a random number generator and create
      ' variable values based on it.
      Dim r As New Random()
      Dim x As Integer = r.Next(75)
      Dim a As Integer = r.Next(155)
      Dim x1 As Integer = r.Next(100)

      ' Create a bitmap and use it to create a
      ' Graphics object.
      Dim bmp As New Bitmap( _
          width, height, PixelFormat.Format24bppRgb)
      Dim g As Graphics = Graphics.FromImage(bmp)

      g.SmoothingMode = SmoothingMode.AntiAlias
      g.Clear(Color.LightGray)

      ' Use the Graphics object to draw three rectangles.
      g.DrawRectangle(Pens.White, 1, 1, width - 3, height - 3)
      g.DrawRectangle(Pens.Aquamarine, 2, 2, width - 3, height - 3)
      g.DrawRectangle(Pens.Black, 0, 0, width, height)

      ' Use the Graphics object to write a string
      ' on the rectangles.
      g.DrawString("ASP.NET Samples", rectangleFont, SystemBrushes.WindowText, New PointF(10, 40))

      ' Apply color to two of the rectangles.
      g.FillRectangle( _
          New SolidBrush( _
              Color.FromArgb(a, 255, 128, 255)), _
          x, 20, 100, 50)

      g.FillRectangle( _
          New LinearGradientBrush( _
              New Point(x, 10), _
              New Point(x1 + 75, 50 + 30), _
              Color.FromArgb(128, 0, 0, 128), _
              Color.FromArgb(255, 255, 255, 240)), _
          x1, 50, 75, 30)

      ' Save the bitmap to the response stream and
      ' convert it to JPEG format.
      bmp.Save(Response.OutputStream, ImageFormat.Jpeg)

      ' Release memory used by the Graphics object
      ' and the bitmap.
      g.Dispose()
      bmp.Dispose()

      ' Send the output to the client.
      Response.Flush()
   End Sub 'Page_Load

</script>
<html  >
<head>
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" runat="server">
    </form>
</body>
</html>

<%@ Page Language="C#" %>
<%@ import Namespace="System.Drawing" %>
<%@ import Namespace="System.Drawing.Imaging" %>
<%@ import Namespace="System.Drawing.Drawing2D" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">

    private void Page_Load(object sender, EventArgs e)
    {
        // Set the page's content type to JPEG files
        // and clear all response headers.
        Response.ContentType = "image/jpeg";
        Response.Clear();

        // Buffer response so that page is sent
        // after processing is complete.
        Response.BufferOutput = true;

        // Create a font style.
        Font rectangleFont = new Font(
            "Arial", 10, FontStyle.Bold);

        // Create integer variables.
        int height = 100;
        int width = 200;

        // Create a random number generator and create
        // variable values based on it.
        Random r = new Random();
        int x = r.Next(75);
        int a = r.Next(155);
        int x1 = r.Next(100);

        // Create a bitmap and use it to create a
        // Graphics object.
        Bitmap bmp = new Bitmap(
            width, height, PixelFormat.Format24bppRgb);
        Graphics g = Graphics.FromImage(bmp);

        g.SmoothingMode = SmoothingMode.AntiAlias;
        g.Clear(Color.LightGray);

        // Use the Graphics object to draw three rectangles.
        g.DrawRectangle(Pens.White, 1, 1, width-3, height-3);
        g.DrawRectangle(Pens.Aquamarine, 2, 2, width-3, height-3);
        g.DrawRectangle(Pens.Black, 0, 0, width, height);

        // Use the Graphics object to write a string
        // on the rectangles.
        g.DrawString(
            "ASP.NET Samples", rectangleFont,
            SystemBrushes.WindowText, new PointF(10, 40));

        // Apply color to two of the rectangles.
        g.FillRectangle(
            new SolidBrush(
                Color.FromArgb(a, 255, 128, 255)),
            x, 20, 100, 50);

        g.FillRectangle(
            new LinearGradientBrush(
                new Point(x, 10),
                new Point(x1 + 75, 50 + 30),
                Color.FromArgb(128, 0, 0, 128),
                Color.FromArgb(255, 255, 255, 240)),
            x1, 50, 75, 30);

        // Save the bitmap to the response stream and
        // convert it to JPEG format.
        bmp.Save(Response.OutputStream, ImageFormat.Jpeg);

        // Release memory used by the Graphics object
        // and the bitmap.
        g.Dispose();
        bmp.Dispose();

        // Send the output to the client.
        Response.Flush();
    }

</script>
<html  >
<head>
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" runat="server">
    </form>
</body>
</html>

Asp.netValidateImageCheck…

Asp.net Validate Image Check

-Draw Serial Number Validate Image. ( GenerateValidateImage.aspx.vb )

-Input Validate Number Match Show’s Serial Number ( CheckValidateImage.aspx.vb )

GenerateValidateImage.aspx.vb (-Draw Serial Number Validate Image Page)

Imports System.Web

Imports System.Web.Security

imports System.Web.UI

imports System.Web.UI.WebControls

imports System.Web.UI.WebControls.WebParts

imports System.Web.UI.HtmlControls

imports System.Drawing.Drawing2D

imports System.Drawing.Imaging

imports System.Drawing.Text

imports System.Drawing

Partial Class GenerateValidateImage

Inherits System.Web.UI.Page

Private ReadOnly Lstg_ImagePath As String = “Image/Validator.jpg”

Private Lstg_Validator As String = “”

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

If Not Request.Params(“Validator”) Is Nothing Then

Lstg_Validator = Request.Params(“Validator”).ToString()

End If

‘–Create Bmp

Dim Lbit_MapImage As Bitmap = New System.Drawing.Bitmap(Server.MapPath(Lstg_ImagePath))

Dim Lgrp_GraphicImage As Graphics = Graphics.FromImage(Lbit_MapImage)

‘–Set Pen Output Mode

Lgrp_GraphicImage.SmoothingMode = SmoothingMode.AntiAlias

‘–Add Text String

Lgrp_GraphicImage.DrawString((Lstg_Validator), New Font(“Arial”, 12, FontStyle.Bold), SystemBrushes.WindowText, New Point(0, 0))

‘–Set graphics Image Output Format

Response.ContentType = “image/jpeg”

Lbit_MapImage.Save(Response.OutputStream, ImageFormat.Jpeg)

‘—Dispose Resource

Lgrp_GraphicImage.Dispose()

Lbit_MapImage.Dispose()

End Sub

End Class

CheckValidateImage.aspx.vb (Check Page,Input Validate Number Match Show’s Serial Number)

Partial Class CheckValidateImage

Inherits System.Web.UI.Page

Private Shared Lstg_Validator As String

Private ReadOnly Last_ValidatorImageUrl As String = “GenerateValidateImage.aspx Validator=”

Private Function GetGenerageValidateNo() As String

Dim Lrnd_Random = New Random()

Return (Lrnd_Random.Next(100000,  9).ToString())

End Function

Protected Sub Button_Check_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button_Check.Click

If Page.IsValid Then

If Me.TextBox_Validate.Text <> CheckValidateImage.Lstg_Validator Then

‘Response.Write(“<script>alert(‘Input Validate Numer invalid !’);</script>”)

Me.Label_Message.Text = “Input Validate Numer invalid !”

Lstg_Validator = GetGenerageValidateNo()

Me.Image_Validate.ImageUrl = Last_ValidatorImageUrl + Lstg_Validator

Return

Else

Me.Label_Message.Text = “Input Validate Numer Success!”

End If

Else

Lstg_Validator = GetGenerageValidateNo()

Me.Image_Validate.ImageUrl = Last_ValidatorImageUrl + Lstg_Validator

Me.Label_Message.Text = “Input Validate Numer Error !”

End If

End Sub

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

If Not IsPostBack Then

Lstg_Validator = GetGenerageValidateNo()

Me.Image_Validate.ImageUrl = Last_ValidatorImageUrl + Lstg_Validator

End If

End Sub

End Class

–Result–

程序员的十个习惯(读书笔记)

要专业而不是自我,凡事对事不对人。一个需要紧密合作的开发团队中,如果能稍加注意礼貌对待他人,将会有益于整个团队关注真正有价值的问题,而不是勾心斗角,误入歧途。我们每个人都能有一些极好的创新想法,同样也会萌生一些很愚蠢的想法。在团队中,一个人只是智商高是没有用的,如果他还很顽固并且拒绝合作,那就更糟糕。在这样的团队中,生产率和创新都会频临灭亡的边缘。可能我们的建议不被采纳,或者被全盘否定,因为害怕这些而不去勇于表达自己的想法就不会有人知道你是怎么想的,当你总是保持沉默,最后连你也没有思路了。你就成了一个专门走别人的路的只会复制别人想法的人,最后也就失去你自己了。用Les Brown的一句话说就是:“你不需要很出色才能起步,但是你必须起步才能变得很出色。”

“软件技术的变化如此之快,势不可挡,这是它的本性。继续用你熟悉的语言做你的老本行吧,你不可能跟上技术变化的脚步。”赫拉克利特说过:“唯有变化是永恒的。”历史已经证明了这句真理,在当今快速发展的IT时代尤其如此。就以Java为例,你掌握了Java语言及其一系列的最新特性。接着,你要掌握Swing、Servlet、JSP 、Struts、Tapestry、JSF、JDBC、JDO、Hibernate、JMS、EJB、Lucene、Spring……还可以列举很多。如果你使用的是微软的技术,要掌握VB、Visual C++、MFC、COM、ATL、.NET、C#、VB.NET、ASP.NET、ADO.NET、WinForm、Enterprise Service、Biztalk……并且,不要忘记还有UML、Ruby、XML、DOM、SAX、JAXP、JDOM、XSL、Schema、SOAP、Web Service、SOA,同样还可以继续列举下去(我们将会用光所有的缩写字母)。不幸的是,如果只是掌握了工作中需要的技术并不够。那样的工作也许几年之后就不再有了——它会被外包或者会过时,那么你也将会出局。所以迭代和增量式的学习是个不错的选择,每天进步一点点。对于十年甚至二十年后的自己是一笔巨大的财富。也可以参加一些用户组的活动,甚至讲座,技术论坛,阅读等等,这些的最终目的就是让你追踪变化。(注意:你不需要精通所有技术,但需要清楚知道行业的动向,从而规划你的项目和职业生涯)

让设计指导而不是操纵开发。设计是系统开发必不可少的步骤,他能帮助你快速了解到系统的细节问题,并指导子系统和部件的关系,指导你的实现。但是一定要注意的一点:设计满足实现即可,不必过于详细(Design should be only as detailed as needed to)。好设计是一张地图,它也会进化。设计指引你向正确的方向前进,它不是殖民地,它不应该标识具体的路线。你不要被设计(或者设计师)操纵。

提早实现自动化部署。质量保证人员要像测试应用一样测试部署。

度量真实的工作进度。这样你会对整个进度有个很清晰的认识。很清楚的知道做了哪些,还有哪些没有做。

如果代码太杂乱以至于无法阅读,就应该使用注释来说明。不用管为什么要这样编码,只要告诉我们到底是怎么做的就好了。但是并不是说要用注释来包裹代码,注释不能代替优秀的代码。源代码可以被读懂,不是因为其中的注释,而应该是由于它本身优雅而清晰——变量名运用正确、空格使用得当、逻辑分离清晰,以及表达式非常简洁。在《地海巫师》(The Wizard of Earthsea)系列书籍中,知道一件事物的真实名称可以让一个人对它实施完全的控制。通过名称来进行魔法控制,是文学和神话中一种常用的主题,在软件开发中也是如此。

要编写内聚的代码。内聚性用来评估一个组件(包、模块或配件)中成员的功能相关性。内聚程度高,表明各个成员共同完成了一个功能特性或是一组功能特性。内聚程度低的话,表明各个成员提供的功能是互不相干的。假定把所有的衣服都扔到一个抽屉里面。当需要找一双袜子的时候,要翻遍里面所有的衣服——裤子、内衣、T恤等——才能找到。这很麻烦,特别是在赶时间的时候。现在,假定把所有的袜子都放在一个抽屉里面(而且是成双放置的),全部的T恤放在另外一个抽屉中,其他衣服也分门别类。要找到一双袜子,只要打开正确的抽屉就可以了。(这个例子很好的说明了这个问题)。与此类似,如何组织一个组件中的代码,会对开发人员的生产力和全部代码的可维护性产生重要影响。在决定创建一个类的时候,问问自己,这个类的功能是不是与组件中其他某个类的功能类似,而且功能紧密相关。这就是组件级的内聚性。类也要遵循内聚性。如果一个类的方法和属性共同完成了一个功能(或是一系列紧密相关的功能),这个类就是内聚的。

根据契约进行替换。Liskov替换原则[Lis88]告诉我们:任何继承后得到的派生类对象,必须可以替换任何被使用的基类对象,而且使用者不必知道任何差异。换句话说,某段代码如果使用了基类中的方法,就必须能够使用派生类的对象,并且自己不必进行任何修改。这句话是什么意思呢?就是说:如果你需要其他类的函数,直接继承它们就好了!不要担心你创建的新类会造成破坏,你的调用者可以改变他们的代码。这是他们的问题,而不是你的问题。通过替换遵循接口契约的类,来添加并改进功能特性。要多使用委托而不是继承。

处理或是向上传播所有的异常。不要将它们压制不管,就算是临时这样做也不行。在写代码时要估计到会发生的问题。

要寻找深藏不露的程序bug,正式地进行代码检查,其效果是任何已知形式测试的两倍,而且是移除80%缺陷的唯一已知方法。——Capers Jones的《估算软件成本》[Jon98]

管理层担心进行代码复查所耗费的时间。他们不希望团队停止编码,而去参加长时间的代码复查会议。开发人员对代码复查感到担心,允许别人看他们的代码,会让他们有受威胁的感觉。这影响了他们的自尊心。他们担心在情感上受到打击。

总结:编程应该是艺术的,代码也应该是严谨的。相信真正理会了这些,一定会编出让自己满意也会让别人满意的代码来。一下午的时间来阅读这本来自infoQ的书,很值。