??xml version="1.0" encoding="utf-8" standalone="yes"?> 例子代码Q?/span> Program static void Main(string[] args) int obj = 2; Test<int> test = new Test<int>(obj); Console.WriteLine("int:" + test.obj); string obj2 = "hello world"; Test<string> test1 = new Test<string>(obj2); Console.WriteLine("String:" + test1.obj); Console.Read(); class Test<T> public T obj; public Test(T obj) this.obj = obj; 输出l果是: Test如果T被实例化为int型,那么成员变量obj是int型的Q如果T被实例化为string型,那么obj是stringcd的?/span> Ҏ不同的类型,上面的程序显C出不同的倹{?/span> 泛型机制Q?/span> 泛型能力有CLR在运行时支持QC#泛型代码在编译ؓIL代码和元数据Ӟ采用Ҏ的占位符来表C型类型,q用专有的IL指o支持泛型操作。而真正的泛型实例化工作以“on-demand”的方式,发生在JIT~译时?/span> .method private hidebysig static void Main(string[] args) cil managed { .entrypoint // Code size 79 (0x4f) .maxstack 2 .locals init ([0] int32 obj, [1] class CSharpStudy1.Test`1<int32> test, [2] string obj2, [3] class CSharpStudy1.Test`1<string> test1) IL_0000: nop IL_0001: ldc.i4.2 IL_0002: stloc.0 IL_0003: ldloc.0 IL_0004: newobj instance void class CSharpStudy1.Test`1<int32>::.ctor(!0) IL_0009: stloc.1 IL_000a: ldstr "int:" IL_000f: ldloc.1 IL_0010: ldfld !0 class CSharpStudy1.Test`1<int32>::obj IL_0015: box [mscorlib]System.Int32 IL_001a: call string [mscorlib]System.String::Concat(object, object) IL_001f: call void [mscorlib]System.Console::WriteLine(string) IL_0024: nop IL_0025: ldstr "hello world" IL_002a: stloc.2 IL_002b: ldloc.2 IL_002c: newobj instance void class CSharpStudy1.Test`1<string>::.ctor(!0) IL_0031: stloc.3 IL_0032: ldstr "String:" IL_0037: ldloc.3 IL_0038: ldfld !0 class CSharpStudy1.Test`1<string>::obj IL_003d: call string [mscorlib]System.String::Concat(string, string) IL_0042: call void [mscorlib]System.Console::WriteLine(string) IL_0047: nop IL_0048: call int32 [mscorlib]System.Console::Read() IL_004d: pop IL_004e: ret } // end of method Program::Main .method public hidebysig specialname rtspecialname instance void .ctor(!T obj) cil managed { // Code size 17 (0x11) .maxstack 8 IL_0000: ldarg.0 IL_0001: call instance void [mscorlib]System.Object::.ctor() IL_0006: nop IL_0007: nop IL_0008: ldarg.0 IL_0009: ldarg.1 IL_000a: stfld !0 class ConsoleCSharpTest1.Test`1<!T>::obj IL_000f: nop IL_0010: ret } // end of method Test`1::.ctor 、第一轮编译时Q编译器只ؓTest<T>cd产生“泛型?#8221;的IL代码与元数据——ƈ不进行泛型的实例化,T在中间只充当占位W。例如:Testcd元数据中昄?lt;!T> 、JIT~译Ӟ当JIT~译器第一ơ遇到Test<int>Ӟ用int替换“范型?#8221;IL代码与元数据中的T——进行泛型类型的实例化。例如:Main函数中显C的<int> 、CLR为所有类型参Cؓ“引用cd”的泛型类型生同一份代码;但是如果cd参数?#8220;值类?#8221;Q对每一个不同的“值类?#8221;QCLRؓ其生一份独立的代码。因为实例化一个引用类型的泛型Q它在内存中分配的大是一LQ但是当实例化一个值类型的时候,在内存中分配的大是不一L?/span> 泛型特点Q?/span> 、如果实例化泛型cd的参数相同,那么JIT~辑器会重复使用该类型,因此C#的动态泛型能力避免了C++静态模板可能导致的代码膨胀的问题?/span> 、C#泛型cd携带有丰富的元数据,因此C#的泛型类型可以应用于强大的反技术?/span> 、C#的泛型采?#8220;基类、接口、构造器Q值类?引用cd”的约束方式来实现对类型参数的“昄U束”Q提高了cd安全的同Ӟ也׃C++模板Z“{”的隐式约束所h的高灉|?/span> 泛型l承Q?/span> 除了可以单独声明泛型cdQ包括类与结构)外,也可以在基类中包含泛型类型的声明。但基类如果是泛型类Q它的类型要么以实例化,要么来源于子c(同样是泛型类型)声明的类型参敎ͼ看如下类?/span> 非法 cd为Ccd提供了U、VQ也是上面说的来源于子c?/span> cdl承于C<string,int>Q个为可以看成Fl承一个非泛型的类 cd为非法的Q因为Gcd不是泛型QC是泛型,G无法lC提供泛型的实例化 、C#泛型机制只支?#8220;在方法声明上包含cd参数”——即泛型Ҏ?/span> 、C#泛型机制不支持在除方法外的其他成员(包括属性、事件、烦引器、构造器、析构器Q的声明上包含类型参敎ͼ但这些成员本w可以包含在泛型cd中,q用泛型类型的cd参数?/span> 、泛型方法既可以包含在泛型类型中Q也可以包含在非泛型cd中?/span> Ҏ是合法的Q约束被默认l承 Ҏ是非法的Q指定Q何约束都是多余的 、C#泛型要求?#8220;所有泛型类型或泛型Ҏ的类型参?#8221;的Q何假定,都要Z“昑ּ的约?#8221;Q以l护C#所要求的类型安全?/span> ?#8220;昑ּU束”由where子句表达Q可以指?#8220;基类U束”Q?#8220;接口U束”Q?#8220;构造器U束”Q?#8220;值类?引用cdU束”共四U约束?/span> ?#8220;昑ּU束”q必须Q如果没有指?#8220;昑ּU束”Q范型类型参数将只能讉KSystem.Objectcd中的公有Ҏ。例如:在开始的例子中,定义的那个obj成员变量。比如我们在开始的那个例子中加入一个Test1c,在它当中定义两个公共ҎFunc1、Func2Q如下图Q?/span> A public void Func1() class B public void Func2() class C<S, T> where S : A where T : B public C(S s,T t) //S//T IA<T> interface IB void Func2(); interface IC<T> class MyClass<T, V> where T : IA<T> where V : IB, IC<V> public MyClass(T t,V v) //T//V A public A() class B public B(int i) class C<T> where T : new() public C() new T(); class D public void Func() C<A> c = new C<A>(); 对象在编译时报错QThe type B must have a public parameterless constructor in order to use it as parameter 'T' in the generic type or method C<T> 注意QC#现在只支持无参的构造器U束 此时׃我们为Bcd写入了一个有参构造器Q得系l不会再为B自动创徏一个无参的构造器Q但是如果我们将Bcd中加一个无参构造器Q那么对象d的实例化׃会报错了。Bcd定义如下Q?/span> classB public B() public B(int i) struct A { } public class B { } public class C<T> where T : struct C<A> c1 = new C<A>(); C<B> c2 = new C<B>(); 对象在编译时报错QThe type 'B' must be a non-nullable value type in order to use it as parameter 'T' in the generic type or methor 'C<T>' 、C#的泛型能力由CLR在运行时支持Q它既不同于C++在编译时所支持的静态模板,也不同于Java在编译器层面使用“擦拭?#8221;支持的简单的泛型?/span> 、C#的泛型支持包括类、结构、接口、委托四U泛型类型,以及Ҏ成员?/span> 、C#的泛型采?#8220;基类Q接口,构造器Q值类?引用cd”的约束方式来实现对类型参数的“昑ּU束”Q它不支持C++模板那样的基于签名的隐式U束?/span> 无法昄 XML c?
使用 XSL 样式表无法查?XML 输入。请更正错误然后单击 h按钮Q或以后重试?
名称以无效字W开头。处理资?'http://localhost/likong/' 时出错。第 1 行,位置: 2 删除用RowFilter{选之后的记录集,用While循环是可以做到的Q而用For循环却不行?br />
foreach (DataRowView row in dataView) 计算用来传递筛选条件的当前行上的给定表辑ּ? 命名I间:System.Data 要计的表达式? 要限制在表达式中q行计算的行的筛选器? expression 参数需要聚合函数。例如,以下是合法表辑ּQ?/p>
Count(Quantity) 但是以下表达式不合法Q?/p>
Sum (Quantity * UnitPrice) 如果必须针对两列或多列执行操作,则应该创?DataColumnQƈ它?Expression 属性设|ؓ适当的表辑ּQ然后针对结果列使用聚合表达式。在q种情况下,假定有一个名?#8220;total”?DataColumnQƈ?Expression 属性设|ؓQ? "Quantity * UnitPrice" Compute Ҏ的表辑ּ参数ؓQ? Sum(total) W二个参?filter 定在表辑ּ中用哪些行。例如,如果该表包含名ؓ“colDate”的日期列Q则可用以下表达式限制这些行Q?/p>
colDate > 1/1/99 AND colDate < 17/1/99 有关两个参数创徏表达式的规则Q请参见 DataColumn.Expression 属性?/p>
下面的示例针对识别号码ؓ五的销售h员,对名?#8220;Total”Q合计)的列的值求和?/p>
下面开始分析这些约束:
]]>
<%@ Page language="c#" ValidateRequest="false" Codebehind="default.aspx.cs" AutoEventWireup="false" Inherits="Socut.Cla...
q是怎么回事?以前怎么没遇到过?l查阅资料后才知?q是因ؓNET没用注册到IIS引v?原来早两天我重装VS.NET把IISq原?
在命令窗口中q行"C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet_regiis.exe -i"问题得以解决.
.NetFramework2.0Q需要运行的是C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -i。末"i"不能?
]]>
先保存ؓ.pdf文gQƈ不能很好的实现直接打印?br />
其次Q如果将rpt文g赋给一个CrystalReportView后,当直接点L印按钮时Q弹出的打印对话框默认打?br />
rpt设计时的U张打印方向。而如果通过调用CrystalReportView.PrintReport()ҎQ弹出的打印对话框默认打?br />
却是本机默认打印机的默认U张打印方向。据UͼPrintReport()Ҏ首先是d打印机默认的讄先?br />
因此Q想不浏览报表数据,直接调用打印Q又要按自己的横向或U向打印q个问题Q似乎很隑ֈ用报?br />
本n的库来解冟뀂难道,只能通过先用代码Q修Ҏ印机的纸张打印方向,然后再调用PrintReport()Ҏ??br />
的没有更好的解决办法Q?br />
]]>
While(dataView.count>0)
{
dataView.Delete(this.dataView.Count-1)
//....
}
因此Q除了通过数据l定到DataGridView,DataGrid外,可以通过循环来取l过RowFilter{选后的记录集Q?br />
Ҏ有很多,如:
{
MessageBox.Showrow.Row[4].ToString());
}
]]>
1、在rpt报表文g中,从工L里拖入一个TextObject控g到目标位|,可以讄相关属性?br />
比如Q定义了一个TextObject控gQ名?title?br />
2、在要ؓ该TextObject赋值的class里加入如下代码:
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
Report.StyleAreport aReport=new Special.Report.StyleAreport();//实例化报表文件rpt
TextObject title = (TextObject)aReport.ReportDefinition.ReportObjects["title"];//扑ֈ刚定义的TextObject控g
title.Text ="动态标?;
]]>
DataTable.Compute Ҏ
E序?System.DataQ在 system.data.dll 中)
Public Function Compute ( _
expression As String, _
filter As String _
) As Object
Dim instance As DataTable
Dim expression As String
Dim filter As String
Dim returnValue As Object
returnValue = instance.Compute(expression, filter)
public Object Compute (
string expression,
string filter
)
public:
Object^ Compute (
String^ expression,
String^ filter
)
public Object Compute (
String expression,
String filter
)
public function Compute (
expression : String,
filter : String
) : Object
参数
q回?/h4>
ObjectQ设|ؓ计算l果?
Private Sub ComputeBySalesSalesID(ByVal dataSet As DataSet)
' Presumes a DataTable named "Orders" that has a column named "Total."
Dim table As DataTable
table = dataSet.Tables("Orders")
' Declare an object variable.
Dim sumObject As Object
sumObject = table.Compute("Sum(Total)", "EmpID = 5")
End Sub
{
// Presumes a DataTable named "Orders" that has a column named "Total."
DataTable table;
table = dataSet.Tables["Orders"];
// Declare an object variable.
object sumObject;
sumObject = table.Compute("Sum(Total)", "EmpID = 5");
]]>
半天Q把label转换为Button控gcdQ问题解冟?
]]>
1. 在现有项目的解决Ҏ中添加新的项? 叛_"解决Ҏ",选择"d"--"新徏目", ?d新项?的选择H口? "目cd"?其他目cd"--"安装和部|?,"模板"?安装目",l新目指定名称,位置;
2. 在新d的安装项目上叛_, 选择"视图"--"文gpȝ", 叛_"目标计算Z的文件系l?作侧?应用E序文g?, 选择"d文g"或?d目输出",你要安装的文gd到该位置;
3. 初始的安装位|? 在上面的"文gpȝ"界面, 左击"应用E序文g?, ?属?栏中扑ֈ"DefaultLocation", 默认的属性值是: [ProgramFilesFolder][Manufacturer]\[ProductName], q就是用户安装的默认位置, 如果不是q样, 修改成这?
4. 另外, ?解决Ҏ理?? 点击你添加的安装目, ?属?~辑栏中, 在[Manufacturer]中填入你公司的名字或者你自己希望的文? 在[ProductName]填入你ؓ要被安装的项目命名的名字.
5. 先在"解决Ҏ理??生成"你的目, 然后"生成"你的安装目
6. ?解决Ҏ理??叛_你的安装目, 选择"安装", 便可在你的开发机上进行安装了, 在你的安装项目的路径下的bin下有两个文g? debug ?nbsp;Release,
7. 在解x案管理器?叛_你的安装目, 选择"属?, 如果你的目属性里选择的是 "配置" ?nbsp;"debug", 则你生成的安装文件在 debug 里面, 如果选择?配置"?nbsp;"Release", 则生成的安装文g?nbsp;Release 里面. 当然你也可以修改你的位置可文件名, q可以对你的安装文gq行其它的设|?
?
在解x案管理器? 叛_d?安装目", 选择"视图"--"注册?;
?目标计算Z的注册表"?默认有注册表的五个主键栏;
默认情况? ?nbsp;[HKEY_CURRENT_USER] ?nbsp;[HKEY_CURRENT_MACHINE] 下会?nbsp;[Software]\[Manufacturer] 分支, 如果你的安装目的属性中讄?nbsp;[Manufacturer]? 安装后会用值去替代[Manufacturer], 例如 [Manufacturer] 的?nbsp;讄?nbsp;"Power Word", 则安装后会在 [Software]下创Z个[Power Word]分支;
默认情况?nbsp;[Manufacturer] ?nbsp;AlwaysCreate 属性是 false, ?如果你的 [Manufacturer] 下没有项?则不创徏 [Manufacturer] ,如果无论如何都要创徏q个? 则可?nbsp;它的 AlwaysCreate 讄?nbsp;true;
依照上面的方? 在你惛_注册表项的主键中逐新徏分支和目, 在新建的注册表项目上叛_后选属? 讄注册的 value ?
无论是徏主键分支q是目, 都可以用 [] 的方法用系l变量来动态指定需要添加的注册表内? 例如:
[Manufacturer] 存放的是安装目的公司?
[ProductName] 存放的是安装目属性中?nbsp;产品名称,
[TARGETDIR] 存放的是安装时用户选定的安装\?
[COMPANYNAME] 存放的是安装时用户填入的公司?如果没设用户信息安装界面则取操作pȝ中的公司?,
[USERNAME] 存放的是安装时用户填入的用户?如果没设用户信息安装界面则取操作pȝ中的用户?
如此{等
如果惌在安装时出现注册? 要么自己做一个DLL或者EXE目, 加入?nbsp;自定义操作中在安装时打开界面输入注册? 要么使用VS安装目自带的界?在视?-用户界面中添?用户信息"安装界面,讄showserialnumber ?nbsp;true), 不过那个注册码是?nbsp;? 来验证的, 只要是验证位数g和能?整除都能通过, 像以前安装盗板 office 97 时输?nbsp;"1111111"一?
Skin++是一N用的Y件换肤套Ӟ目前支持各种版本操作pȝQ?/span>Windows9x?/span>Windows2000?/span>WindowsXP?/span>Windows2003。支持各U开发语aQ?/span>Visual C++?span>Visual C++.Net?/span>Visual Basic 6 ?/span>Visual Basic.Net?/span>C#?/span>PowerBuilder?/span>Delphi?/span>C++Builder、易语言{?/span>Skin++ 目前已经拥有数量众多的用Pq且有很多的国内外大公司客户。无论其换肤的效果还是程序本w的E_性,都堪UC。要做出漂亮风格的界面,使用Skin++变得非常单,只要一行代码,p让你的程序彻底换肤,q拥有动态换肤的功能?/span>
Skin++ For DotNet目前全面支持Visual C#.net 2002?/span>Visual C#.net 2003?/span>Visual C#.net 2005?/span>Visual VB.net 2002?/span>Visual VB.net 2003?/span>Visual VB.net 2005?/span>Visual VC.net 2002?/span>Visual VC.net 2003?/span>Visual VC.net 2005?/span>
使用Skin++之前需要做一个准备工作,注册Skin++控g?/span>
׃Skin++ For DotNet是以COM的Ş式存在的Q所以在你的机器W一ơ用之前应该先注册?/span>DLL文g。注册命令:RegSvr32.exe Skin++存在的\?/span>\SkinPPDotNet.dll 注册后会出现下图所C:
二?/span>Skin++如何?/span>C#.net 2005 中?/span>
1.创徏C# Windows应用E序
2.拯Skin++相关文g
?/span>Skin++的安装目录下拯一?/span>Skin++皮肤文gQ?/span>*.ssk?/span>*.sppQ到当前工程目录.下?/span>
3.d引用
右键单击工程目录的引用节?/span> Q弹Z面的菜单
请单?#8220;d引用(&R)”菜单,此时会弹?#8220;d引用”H体,如下图:
切换?/span>COM面Q请选择SkinPPDotNet 3.0 Type Librarylg,q双击该,或点M边的“定”按钮。此时在引用树列表中会多?/span>SKINPPDOTNETLib一:
4.d名字I间
请在Program .csH体的代码开头处d using SKINPPDOTNETLib;
5.声明Skin++lg变量
请在 Program中写上:public static SKINPPDOTNETLib.SkinPPDotNetClass SkinPPObj;
6.创徏Skin++lg实例
?/span>MainQ)中创?/span>Skin++lg对象Q?/span>
SkinPPObj = new SkinPPDotNetClass();
SkinPPObj.LoadSkin("PixOS.spp", false);
xQ?/span>Skin++添加完成了Q请?/span>F5q行Q效果如下图Q?/span>
7.注意事项
1.h意你拯?/span>Skin++皮肤的\径,sppLoadSkin可以指定带\径的皮肤名称Q支持绝对\径和相对路径。在2003中,工程的调试目录默认在\bin\Debug?/span>\bin\Release中,所以在本文的例子中Q请把皮肤拷贝到\bin\Debug目录中。当然你可以?/span>sppLoadSkin中指定皮肤的路径?/span>
2.sppLoadSkin的第二个参数是,是否?/span>Skin++不自动截h有的H口q行换肤。默认情况下请填?/span>false.是?/span>Skin++对你所有的H口q行换肤。这样以后凡是从你程序中弹出的窗口均能自动换肤,而不需要你填写M的代码?/span>
3.l心的朋友也怼注意刎ͼ我们?/span>Application.EnableVisualStyles();q句话注释掉了。原因是Skin++已经?span>C#所有的控gq行了彻底的换肤Q所以在q个地方应该?span>C#默认的美化工作停止掉Q这样可以提升显C效率?/span>
然后写个cLl一验证d
using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;
namespace BLL
{
public class LoginCrystalReport
{
public void Login( CrystalDecisions.CrystalReports.Engine.ReportDocument report)
{
string serverName=ConfigurationManager.AppSettings["DBServerName"];
string userId = ConfigurationManager.AppSettings["DBUserID"];
string passWord=ConfigurationManager.AppSettings["DBPassWord"];
//Set Database Logon to main report
foreach (CrystalDecisions.Shared.IConnectionInfo connection in report.DataSourceConnections)
{
if (connection.ServerName == serverName)
{
connection.SetLogon(userId, passWord);
}
}
//Set Database Logon to subreport
foreach (CrystalDecisions.CrystalReports.Engine.ReportDocument subreport in report.Subreports)
{
foreach (CrystalDecisions.Shared.IConnectionInfo connection in subreport.DataSourceConnections)
{
if (connection.ServerName == serverName)
{
connection.SetLogon(userId, passWord);
}
}
}
}
}
}
DataGridTableStyle ts = new DataGridTableStyle();
ts.MappingName = RealEstatePDA.Util.DataBase.DataViews.getInstance().BuildingLocationDataView.Table.TableName; //如果l定的是Datatable,q里要变一下 ?
int numCols = RealEstatePDA.Util.DataBase.DataViews.getInstance().BuildingLocationDataView.Table.Columns.Count;
int i = 0;
DataGridTextBoxColumn aColumnTextColumn;
while (i < numCols) //重绘所有的列 ?
{
aColumnTextColumn = new DataGridTextBoxColumn();
aColumnTextColumn.MappingName = RealEstatePDA.Util.DataBase.DataViews.getInstance().BuildingLocationDataView.Table.Columns[i].ColumnName;
ts.GridColumnStyles.Add(aColumnTextColumn); //增加一U自定义的column风格
i++;
}
this.HousedataGrid.TableStyles.Add(ts);
this.HousedataGrid.TableStyles[0].GridColumnStyles[0].Width = 70; //W一列的宽度
this.HousedataGrid.TableStyles[0].GridColumnStyles[0].HeaderText = "房屋~号"; //W一列的标题
this.HousedataGrid.TableStyles[0].GridColumnStyles[1].Width = 200; //W二列的宽度
this.HousedataGrid.TableStyles[0].GridColumnStyles[1].HeaderText = "YYYYY"; //W二列的标题
this.HousedataGrid.Refresh();
//
相类似的另一U样式:
private DataView dv1,dv2;
private DataGridTableStyle dgts;
private void frmChhd_Resize(object sender, System.EventArgs e)
{
//调整dataGrid1的列?br />if(dv1!=null)
{
//d模板?br />if(dataGrid1.TableStyles.Count==0)
{
dgts.MappingName=dv1.Table.TableName;
dataGrid1.TableStyles.Add(dgts);
}
int i=dataGrid1.Width/6-10;
dataGrid1.TableStyles[0].GridColumnStyles[0].Width=i*2;
dataGrid1.TableStyles[0].GridColumnStyles[1].Width
=dataGrid1.TableStyles[0].GridColumnStyles[2].Width
=dataGrid1.TableStyles[0].GridColumnStyles[3].Width
=dataGrid1.TableStyles[0].GridColumnStyles[4].Width=i;
}
}
.NET框架包括cd接口Q在~写E序的时候,你可能知道正在用.NET的哪个类。然而,在这U情况下如果你用.NET支持的接口而不是它的类来编E时Q代码会变得更加E_、可用性会更高。请分析下面的代码:
private void LoadList (object [] items, ListBox l)
{
for (int i = 0; i < items.Length;i++)
l.Items.Add (items[i].ToString ());
}
q个函数从一个可ZQ何对象的数组中加载ListBoxQ这D代码被限定为只能用数l。假惌些时候你发现那些对象存在数据库中Q或别的集合中。那么你需要修改程序来使用不同的集合类型。如果你用ICollection接口来写那段E序Q你׃用修攚wD늨序了Q对于Q何实现ICollection接口的类型它都能很好的工?
private void LoadList (ICollection items,ListBox l)
{
foreach (object o in items)
l.Items.Add (o.ToString ());
}
ICollection被数l和所有System.Collection中的集合实现。此外,多维数组也支持ICollection接口。如果那q不够的话,数据?NETcdh持ICollection接口。用接口写的q个函数不用需改就可以才许多中情况下用?
2. 使用属性代替原始数?
因ؓ属性已l成a本n的元素,所以声明数据元素时它的作用域等U没有必要大于private。因Z码本w会把属性看成数据元素,你ƈ没有失去使用单数据类型的便利?。相反它会你的代码更加灉|功能更加强大。属性你的数据元素装性更好。属性可以让你用lazy evaluation来返回数据。lazy evaluation的意思是当用戯求时才计它的|而不是一直保留着它?
最后,属性可以是virtual也可以是abstract。你也可以在接口中定义属性?
q里q有l护斚w的因素应当注意:管操作两者的Ҏ是一LQ但是你把一个数据元素变成属性,那么原先客户端的E序便不能访问服务端的新版本E序了。实际上对于在Web service中你惛_现序列化的g可以把它们变成属性来使用Q?
private int TheMonth = 0;
[XmlAttribute ("Month")]
public int Month
{
get {
return TheMonth;
}
set {
TheMonth = value;
}
}
单通过属性就可以使你的所有数据元素私有化?
3. 在Producer/Consumer 的Idiom中用Delegate
当你生成一个实现producer idiomcȝ时候,使用deletate来通知consumer。这U方法相对于用接口更加灵zRDelegate是多点传送的Q所以不用加额外的代码你׃以支持多用户。相对于用接口这样做可ɾcM间的耦合性降低?
下面的类处理键盘输入q把它传l所有的registered listenersQ?
public class KeyboardProcessor
{
private OnGetLine theFunc = null;
public OnGetLine OnGetLineCallback {
get {
return theFunc;
}
set {
theFunc = value;
}
}
public void Run (){
// Read input.
// If there is any listeners, publish:
string s;
do {
s = Console.ReadLine ();
if (s.Length == 0)
break;
if (theFunc != null){
System.Delegate [] funcs =theFunc.GetInvocationList();
foreach (OnGetLine f in funcs) {
try {
f (s);
} catch (Exception e) {
Console.WriteLine
("Caught Exception: {0}", e.Message);
}
}
}
} while (true);
}
M数目的listeners都可注册到producerQ它们所要做的只是提供一个特定的函数Qdeletate?
4. 注意初始化顺?
CQ中对于一些变量声明加入了initializer的概c它们在构造函C前被执行Q实际上变量在基cȝ构造函数执行前之前被初始化?
所以,在初始化变量的时候不要用基类中的数据Q因为它们还没有被构造?br />
private void MyPopupEventHandler(System.Object sender, System.EventArgs e) { // Define the MenuItem objects to display for the TextBox. MenuItem menuItem1 = new MenuItem("&Copy"); MenuItem menuItem2 = new MenuItem("&Find and Replace"); // Define the MenuItem object to display for the PictureBox. MenuItem menuItem3 = new MenuItem("C&hange Picture"); // Clear all previously added MenuItems. contextMenu1.MenuItems.Clear(); if(contextMenu1.SourceControl == textBox1) { // Add MenuItems to display for the TextBox. contextMenu1.MenuItems.Add(menuItem1); contextMenu1.MenuItems.Add(menuItem2); } else if(contextMenu1.SourceControl == pictureBox1) { // Add the MenuItem to display for the PictureBox. contextMenu1.MenuItems.Add(menuItem3); } }
问?7712190(25458848@163.com) 信誉:96 U别:user5 日期:2006-9-10 23:49:27
弟一直都是做 B/S开? q几天心血来潮 惛_一?C/SE序 一入门遇到这个问?我在 登陆H体?NEW?一个新H体吧新H体Show?之后 原来得窗体cLOSE。新NEW得窗体也关闭? 不知道ؓ什?h? 另求 C/SE序?设计Ҏ? 比如如何处理 公共得变?{应该注意得事情 希望大家不吝赐教
回复Q?
{?wzq6511() 信誉:100 U别:user1 日期:2006-9-11 0:36:28 id:36659940
不要用closeQ用hideQ原先的H体只能隐藏h不能关闭?
{?bejon(阿牛[如果我懂Q必坦诚相告Q如果您懂,请不怜赐教。]) 信誉:93 U别:star1 日期:2006-9-11 2:00:21 id:36660132
在new form后用this.close;来完? 在new form之前把窗体id写在注册表,然后在new form之后查那里,如果有值就使用api关闭那个H体Q然后把注册表清I?
{?zhgroup(王员? 信誉:99 U别:star1 日期:2006-9-11 8:06:33 id:36660371
1、要看原H体是那个窗体了Q如果是入口的窗体,则应hide,惌昄时可用Show. 如果是登陆窗?在主H体的Main入口? FormLogin frm = new FormLogin(); frm.ShowDialog(); if 登陆p| 关闭H体 return 2、和B/S基本cMQ只不过对于状态信息比较容易控制?
{?qzh1119(大浪淘沙) 信誉:59 U别:user2 日期:2006-9-11 8:12:07 id:36660412
up
{?qzh1119(大浪淘沙) 信誉:59 U别:user2 日期:2006-9-11 8:12:33 id:36660419
xQ学习中
{?bestshl(快乐的Coder) 信誉:100 U别:user2 日期:2006-9-11 8:24:52 id:36660529
zhgroup(王员? 正解
{?interboy(冯东) 信誉:100 U别:user2 日期:2006-9-11 8:27:37 id:36660559
zhgroup(王员? 说的?如果你把main函数攑֜loginform里的?那么它就是主H体,如果你在它里面调用了this.close();你想?ȝ体都关了,别的?皮之不存,毛将焉附! 把loginform作ؓ子窗?通过ȝ体了掉子H体q行判断
{?7712190(25458848@163.com) 信誉:96 U别:user5 日期:2006-9-11 12:40:41 id:36667940
问题是我不想HIde 真的没有其他的办法了?
{?lovefootball(蟑螂Q生zd是扯?-做h要放低姿态)) 信誉:98 U别:star2 日期:2006-9-11 12:49:07 id:36668125
上面已经说清楚了 如果你不想hide 那你在main里面先newq个登陆H体 如果登陆成功在runȝ? 否则关闭
{?zahuifan(杂烩? 信誉:93 U别:star1 日期:2006-9-11 12:56:33 id:36668305
up
{?guyes123(以ؓ喜欢q里,所以来接分) 信誉:100 U别:user1 日期:2006-9-11 13:00:06 id:36668391
一般还是用HIDE? 其他的我׃会了
{?naturalth(自我批判Q是思想、品得素质、技能创新的优良工具) 信誉:99 U别:user4 日期:2006-9-11 13:07:31 id:36668586
#region "Main" public ModMain() { } [STAThreadAttribute] static void Main() { //异常处理 Application.ThreadException += new ThreadExceptionEventHandler(MainUIThreadExceptionHandler); Common.Database.ConnectionString = Get_Info(); frmLogon frm = new frmLogon(); frm.txtUser.Text = loginUser; if (frm.ShowDialog()==System.Windows.Forms.DialogResult.Cancel) { return; } System.Windows.Forms.Application.Run(new myMenu()); } #endregion
{?xvting(xvting) 信誉:103 U别:user4 日期:2006-9-11 15:10:44 id:36672298
VS默认的WinFormE序模板只有一个程序消息@环,q且入口Form关闭的同旉出程序消息@环,l束E序? 开? | | 消息循环Q入口FormQ? | | l束
{?xvting(xvting) 信誉:103 U别:user4 日期:2006-9-11 15:14:42 id:36672390
可以设计下面的流E? 开? | | False 消息循环Q登陆FormQ?-------- | | | True | | | 消息循环Q主FormQ? | | | |-------------------------- 退?
{?xvting(xvting) 信誉:103 U别:user4 日期:2006-9-11 15:16:34 id:36672453
Demo StartApp.cs文g ///////////////////////////////////////////////////////////////// using System; using System.Windows.Forms; using System.Drawing; using System.Text; namespace WinFromDemo { public class StartApp { private static bool LoginResult = false; [STAThread] static void Main() { //First Message Loop LoginContext loginContext = new StartApp.LoginContext(); Application.Run(loginContext); if (LoginResult) { //Second Message Loop StartApp.MainContext mainContext = new StartApp.MainContext(); Application.Run(mainContext); } } public class LoginContext : ApplicationContext { private LoginDialog loginDialog; public LoginContext() { loginDialog = new LoginDialog(); loginDialog.StartPosition = FormStartPosition.CenterScreen; loginDialog.Closed += new EventHandler(OnFormClosed); loginDialog.Show(); } private void OnFormClosed(object sender, EventArgs e) { LoginResult = !(this.loginDialog.DialogResult == DialogResult.Cancel); ExitThread(); } } public class MainContext : ApplicationContext { private Form mainForm; public MainContext() { mainForm = new Form(); mainForm.StartPosition = FormStartPosition.CenterScreen; mainForm.Closed += new EventHandler(OnFormClosed); mainForm.Show(); } private void OnFormClosed(object sender, EventArgs e) { ExitThread(); } } } }
{?csLius() 信誉:100 U别:user2 日期:2006-9-11 15:17:56 id:36672496
http://blog.csdn.net/Knight94/archive/2006/08/22/1104957.aspx
{?pegtop(再回? 信誉:100 U别:user2 日期:2006-9-11 15:23:51 id:36672677
新窗体是在原H体基础上徏立v来的,不能关闭原窗体只能隐? 要想处理全局变量,采用Static变量
{?pretty_soft() 信誉:100 U别:user1 日期:2006-9-11 15:36:50 id:36673096
我觉得还? 开?--登陆画面/昄ȝ体默认界?--用showdialog昄登陆---判断q回值初始权? q样比较? 把应用程序加载放到启动画面去 q种更适合比较大的pȝQ不同的模块不同的用h?
{?Santos(快乐的GG) 信誉:100 U别:user4 日期:2006-9-11 16:15:46 id:36674473
ShowDialog();Ҏ才是正解. Button1_Click() { xxxForm frm = new xxxForm(); frm.ShowDialog(); }
{?kissknife(侧n向南? 信誉:100 U别:user5 日期:2006-9-11 16:20:54 id:36674652
http://www.cnblogs.com/KissKnife/archive/2006/09/10/500158.html
{?ttgzs(一路狂? 信誉:100 U别:user1 日期:2006-9-11 17:01:58 id:36676000
#region "Main" public ModMain() { } [STAThreadAttribute] static void Main() { //异常处理 Application.ThreadException += new ThreadExceptionEventHandler(MainUIThreadExceptionHandler); Common.Database.ConnectionString = Get_Info(); frmLogon frm = new frmLogon(); frm.txtUser.Text = loginUser; if (frm.ShowDialog()==System.Windows.Forms.DialogResult.Cancel) { return; } System.Windows.Forms.Application.Run(new myMenu()); } #endregion
{?kubbye(蛤蟆就是我) 信誉:100 U别:user1 日期:2006-9-11 23:15:00 id:36681363
准确的说,做ؓ启动H体的那个窗体是不能关的,它关?E序停?其他的窗体可以关,启动H体只能隐藏
{?kubbye(蛤蟆就是我) 信誉:100 U别:user1 日期:2006-9-11 23:17:29 id:36681383
接上?你可以把ȝ面作为启动窗?然后在主界面未显C出来前,先显C登录窗?d成功再显CZH体,d不成?直接退?直接在form的load事g中写好?
{?qiujb(楚留? 信誉:100 U别:user2 日期:2006-9-12 8:12:25 id:36682515
zhgroup(王员? 正解
{?Samen168(让代码ؓ你写代码) 信誉:95 U别:star1 日期:2006-9-12 8:56:52 id:36683381
逻辑问题 main() { loginform lf = new loginform(); if(lf.Showdialog() == DialogResult.OK) { mainform mf = new mainform(); mf.show(); } } q样Ҏ不存在谁打开?
{?Samen168(让代码ؓ你写代码) 信誉:95 U别:star1 日期:2006-9-12 8:57:00 id:36683386
Ҏ
{?sunxianyu(扑ַ? 信誉:100 U别:user2 日期:2006-9-12 9:05:26 id:36683679
zhgroup(王员? ( ) 信誉Q?9 Blog 正解
{?fds2003(Hunter) 信誉:99 U别:user5 日期:2006-9-12 9:17:54 id:36684103
上面能说的都讲了Q?
{?yangao(偶新?请问门在哪里Q? 信誉:100 U别:user4 日期:2006-9-12 9:41:16 id:36684775
学习
{?henrydee1(d) 信誉:101 U别:user2 日期:2006-9-12 10:29:21 id:36686255
if (this.ActiveMdiChild!=null) { this.ActiveMdiChild.Close(); //关闭已经打开的子H体 } InSchool child_InSchool=new InSchool(); child_InSchool.MdiParent=this;//this表示本窗体ؓ其父H体 child_InSchool.Show();
{?xiaoliangwh(亮wh) 信誉:100 U别:user2 日期:2006-9-12 23:55:03 id:36705585
xuexi
{?sdl2005lyx() 信誉:100 U别:user4 日期:2006-9-13 8:26:41 id:36706505
lzQ一个很单的办法Q刚好前几天解决的)Q? 你在原来的窗体设|一个public bool bNew=false;的变量,在你要new新窗体的地方Ҏ如下代码Q? bNew=true; this.Close(); //原来H体消失了,但它的类作用域ƈ没有消失 然后在你原来定义、用原H体变量的地方,即frmOld.ShowDialog();之后Q? if(frmOld.bNew) { NewForm frmNew=new NewForm (); frmNew.ShowDialog(); } 问题搞定了。。?
{?GXY2005(晓晨眉好^_^) 信誉:94 U别:user5 日期:2006-9-13 8:52:21 id:36707030
jf
{?wuhuiITren(CSDN男主? 信誉:100 U别:user2 日期:2006-9-14 13:26:23 id:36740819
g的都说了Q楼主自׃个个试就可以了啊Q想怎么办就怎么办啊
{?slex(蘂橤Q蛋不能扯远Q笑不能搞大)) 信誉:100 U别:user4 日期:2006-9-14 14:35:50 id:36743030
上面的那两个Ҏ已经能解决lz问题了,该结?呵呵
可以在DataGirdView的RowPostPaint事g中进行绘制?br />如:d以下Ҏ代码
private void DrawRowIndex(object sender, DataGridViewRowPostPaintEventArgs e)
{
Rectangle rectangle = new Rectangle(e.RowBounds.Location.X,
e.RowBounds.Location.Y,
this.costomerDataGridView.RowHeadersWidth - 4,
e.RowBounds.Height);
TextRenderer.DrawText(e.Graphics, (e.RowIndex + 1).ToString(),
this.costomerDataGridView.RowHeadersDefaultCellStyle.Font,
rectangle,
this.costomerDataGridView.RowHeadersDefaultCellStyle.ForeColor,
TextFormatFlags.VerticalCenter | TextFormatFlags.Right);
}
卛_完成昄行号的功能?br />
正则表达式(regular expressionQ描qC一U字W串匚w的模式,可以用来Q(1Q检查一个串中是否含有符合某个规则的子串Qƈ且可以得到这个子ԌQ?Q根据匹配规则对字符串进行灵zȝ替换操作?br />
正则表达式学习v来其实是很简单的Q不多的几个较ؓ抽象的概念也很容易理解。之所以很多h感觉正则表达式比较复杂,一斚w是因为大多数的文档没有做到由入深地讲解Q概念上没有注意先后序Q给读者的理解带来困难Q另一斚wQ各U引擎自带的文档一般都要介l它Ҏ的功能,然而这部分Ҏ的功能ƈ不是我们首先要理解的?br />
文章中的每一个D例,都可以点击进入到试面q行试。闲话少_开始?/p>
字母、数字、汉字、下划线、以及后边章节中没有Ҏ定义的标点符P都是"普通字W?。表辑ּ中的普通字W,在匹配一个字W串的时候,匚w与之相同的一个字W?br /> 一些不便书写的字符Q采用在前面?"\" 的方法。这些字W其实我们都已经熟知了?/p>
Q匹配结果是Q成功;匚w到的内容是:"c"Q匹配到的位|是Q开始于2Q结束于3。(注:下标?开始还是从1开始,因当前编E语a的不同而可能不同)
Q匹配结果是Q成功;匚w到的内容是:"bcd"Q匹配到的位|是Q开始于1Q结束于4?/p>
1.2 单的转义字符
表达?/p> |
可匹?/p> |
\r, \n |
代表回R和换行符 |
\t |
制表W?/p> |
\\ |
代表 "\" 本n |
q有其他一些在后边章节中有Ҏ用处的标点符P在前面加 "\" 后,׃表该W号本n。比如:^, $ 都有Ҏ意义Q如果要惛_配字W串?"^" ?"$" 字符Q则表达式就需要写?"\^" ?"\$"?/p>
表达?/p> |
可匹?/p> |
\^ |
匚w ^ W号本n |
\$ |
匚w $ W号本n |
\. |
匚w数点(.Q本w?/p> |
q些转义字符的匹配方法与 "普通字W? 是类似的。也是匹配与之相同的一个字W?br /> 正则表达式中的一些表C方法,可以匚w '多种字符' 其中的Q意一个字W。比如,表达?"\d" 可以匚wL一个数字。虽然可以匹配其中Q意字W,但是只能是一个,不是多个。这好比玩扑克牌时候,大小王可以代替Q意一张牌Q但是只能代替一张牌?/p>
Q匹配结果是Q成功;匚w到的内容是:"$d"Q匹配到的位|是Q开始于3Q结束于5?/p>
1.3 能够?'多种字符' 匚w的表辑ּ
表达?/p> |
可匹?/p> |
\d |
L一个数字,0~9 中的L一?/p> |
\w |
L一个字母或数字或下划线Q也是 A~Z,a~z,0~9,_ 中Q意一?/p> |
\s |
包括I格、制表符、换늬{空白字W的其中L一?/p> |
. |
数点可以匹配除了换行符Q\nQ以外的L一个字W?/p> |
\d\d"Q在匚w "abc123" ?/a>Q匹配的l果是:成功Q匹配到的内ҎQ?12"Q匹配到的位|是Q开始于3Q结束于5?br /> 使用Ҏ?[ ] 包含一pd字符Q能够匹配其中Q意一个字W。用 [^ ] 包含一pd字符Q则能够匚w其中字符之外的Q意一个字W。同L道理Q虽然可以匹配其中Q意一个,但是只能是一个,不是多个?/p>
a.\d"Q在匚w "aaa100" ?/a>Q匹配的l果是:成功Q匹配到的内ҎQ?aa1"Q匹配到的位|是Q开始于1Q结束于4?/p>
1.4 自定义能够匹?'多种字符' 的表辑ּ
表达?/p> |
可匹?/p> |
[ab5@] |
匚w "a" ?"b" ?"5" ?"@" |
[^abc] |
匚w "a","b","c" 之外的Q意一个字W?/p> |
[f-k] |
匚w "f"~"k" 之间的Q意一个字?/p> |
[^A-F0-3] |
匚w "A"~"F","0"~"3" 之外的Q意一个字W?/p> |
[bcd][bcd]" 匚w "abc123" ?/a>Q匹配的l果是:成功Q匹配到的内ҎQ?bc"Q匹配到的位|是Q开始于1Q结束于3?br /> 前面章节中讲到的表达式,无论是只能匹配一U字W的表达式,q是可以匚w多种字符其中L一个的表达式,都只能匹配一ơ。如果用表辑ּ再加上修饰匹配次数的ҎW号Q那么不用重复书写表辑ּ可以重复匹配?br />
[^abc]" 匚w "abc123" ?/a>Q匹配的l果是:成功Q匹配到的内ҎQ?1"Q匹配到的位|是Q开始于3Q结束于4?/p>
1.5 修饰匚wơ数的特D符?/h5>
使用Ҏ是:"ơ数修饰"攑֜"被修饰的表达?后边。比如:"[bcd][bcd]" 可以写成 "[bcd]{2}"?/p>
表达?/p> |
作用 |
{n} |
表达式重复nơ,比如Q?a 相当?"\w\w"Q?a 相当?"aaaaa" |
{m,n} |
表达式至重复mơ,最多重复nơ,比如Q?a ba"?baa"?baaa" |
{m,} |
表达式至重复mơ,比如Q?a a12","_456","M12344"... |
? |
|
+ |
|
* |
\d+\.?\d*" 在匹?"It costs $12.5" ?/a>Q匹配的l果是:成功Q匹配到的内ҎQ?12.5"Q匹配到的位|是Q开始于10Q结束于14?br /> 一些符号在表达式中代表抽象的特D意义:
go{2,8}gle" 在匹?"Ads by goooooogle" ?/a>Q匹配的l果是:成功Q匹配到的内ҎQ?goooooogle"Q匹配到的位|是Q开始于7Q结束于17?/p>
1.6 其他一些代表抽象意义的ҎW号
表达?/p> |
作用 |
^ |
与字W串开始的地方匚wQ不匚wM字符 |
$ |
与字W串l束的地方匹配,不匹配Q何字W?/p> |
\b |
匚w一个单词边界,也就是单词和I格之间的位|,不匹配Q何字W?/p> |
q一步的文字说明仍然比较抽象Q因此,举例帮助大家理解?br /> 一些符号可以媄响表辑ּ内部的子表达式之间的关系Q?/p>
^aaa" 在匹?"xxx aaa xxx" ?/a>Q匹配结果是Q失败。因?"^" 要求与字W串开始的地方匚wQ因此,只有?"aaa" 位于字符串的开头的时候,"^aaa" 才能匚wQ?a >比如Q?aaa xxx xxx"?br />
aaa$" 在匹?"xxx aaa xxx" ?/a>Q匹配结果是Q失败。因?"$" 要求与字W串l束的地方匹配,因此Q只有当 "aaa" 位于字符串的l尾的时候,"aaa$" 才能匚wQ?a >比如Q?xxx xxx aaa"?br />
.\b." 在匹?"@@@abc" ?/a>Q匹配结果是Q成功;匚w到的内容是:"@a"Q匹配到的位|是Q开始于2Q结束于4?br /> q一步说明:"\b" ?"^" ?"$" cMQ本w不匚wM字符Q但是它要求它在匚wl果中所处位|的左右两边Q其中一Ҏ "\w" 范围Q另一Ҏ ?\w" 的范围?br />
\bend\b" 在匹?"weekend,endfor,end" ?/a>Q匹配结果是Q成功;匚w到的内容是:"end"Q匹配到的位|是Q开始于15Q结束于18?/p>
表达?/p> |
作用 |
| |
左右两边表达式之?"? 关系Q匹配左Ҏ者右?/p> |
( ) |
(1). 在被修饰匚wơ数的时候,括号中的表达式可以作为整体被修饰 |
Tom|Jack" 在匹配字W串 "I'm Tom, he is Jack" ?/a>Q匹配结果是Q成功;匚w到的内容是:"Tom"Q匹配到的位|是Q开始于4Q结束于7。匹配下一个时Q匹配结果是Q成功;匚w到的内容是:"Jack"Q匹配到的位|时Q开始于15Q结束于19?br /> 在用修饰匹配次数的ҎW号Ӟ有几U表C方法可以同一个表辑ּ能够匚w不同的次敎ͼ比如Q?{m,n}", "{m,}", "?", "*", "+"Q具体匹配的ơ数随被匚w的字W串而定。这U重复匹配不定次数的表达式在匚wq程中,L可能多的匹配。比如,针对文本 "dxxxdxxxd"QD例如下:
(go\s*)+" 在匹?"Let's go go go!" ?/a>Q匹配结果是Q成功;匚w到内ҎQ?go go go"Q匹配到的位|是Q开始于6Q结束于14?br />
K?font color="#5050ff">(\d+\.?\d*)" 在匹?"Q?0.9,K?0.5" ?/a>Q匹配的l果是:成功Q匹配到的内ҎQ?K?0.5"Q匹配到的位|是Q开始于6Q结束于10。单独获取括可围匹配到的内ҎQ?20.5"?/p>
2. 正则表达式中的一些高U规?/h4>
2.1 匚wơ数中的贪婪与非贪婪
表达?/p> |
匚wl果 |
"\w+" 匹配第一?"d" 之后的所有字W?"xxxdxxxd" |
|
"\w+" 匹配第一?"d" 和最后一?"d" 之间的所有字W?"xxxdxxx"。虽?"\w+" 也能够匹配上最后一?"d"Q但是ؓ了整个表达式匹配成功,"\w+" 可以 "让出" 它本来能够匹配的最后一?"d" |
由此可见Q?\w+" 在匹配的时候,L可能多的匹配符合它规则的字W。虽然第二个举例中,它没有匹配最后一?"d"Q但那也是ؓ了让整个表达式能够匹配成功。同理,?"*" ?"{m,n}" 的表辑ּ都是可能地多匹配,?"?" 的表辑ּ在可匚w可不匚w的时候,也是可能的 "要匹?。这 U匹配原则就叫作 "贪婪" 模式 ?/p>
非贪婪模式:
在修饰匹配次数的ҎW号后再加上一?"?" P则可以匚wơ数不定的表辑ּ可能少的匹配,使可匚w可不匚w的表辑ּQ尽可能?"不匹?。这U匹配原则叫?"非贪? 模式Q也叫作 "勉强" 模式。如果少匚w׃D整个表达式匹配失败的时候,与贪婪模式类|非贪婪模式会最限度的再匹配一些,以整个表达式匹配成功。D例如下,针对文本 "dxxxdxxxd" 举例Q?/p>
表达?/p> |
匚wl果 |
"\w+?" 尽可能的匚wW一?"d" 之后的字W,l果是:"\w+?" 只匹配了一?"x" |
|
Z让整个表辑ּ匚w成功Q?\w+?" 不得不匹?"xxx" 才可以让后边?"d" 匚wQ从而整个表达式匹配成功。因此,l果是:"\w+?" 匚w "xxx" |
更多的情况,举例如下Q?br />
<td>(.*)</td>" 与字W串 "<td><p>aa</p></td> <td><p>bb</p></td>" 匚w?/a>Q匹配的l果是:成功Q匹配到的内Ҏ "<td><p>aa</p></td> <td><p>bb</p></td>" 整个字符Ԍ 表达式中?"</td>" 与字符串中最后一?"</td>" 匚w?
<td>(.*?)</td>" 匚w举例1中同L字符串时Q将只得?"<td><p>aa</p></td>"Q?再次匚w下一个时Q可以得到第二个 "<td><p>bb</p></td>"?/p>
表达式在匚wӞ表达式引擎会小括号 "( )" 包含的表辑ּ所匚w到的字符串记录下来。在获取匚wl果的时候,括号包含的表达式所匚w到的字符串可以单独获取。这一点,在前面的举例中,已经多次展示了。在实际应用场合中,当用某种边界来查找,而所要获取的内容又不包含边界Ӟ必须使用括h指定所要的范围。比如前面的 "<td>(.*?)</td>"?br />
其实Q?括号包含的表达式所匚w到的字符? 不仅是在匚wl束后才可以使用Q在匚wq程中也可以使用。表辑ּ后边的部分,可以引用前面 "括号内的子匹配已l匹配到的字W串"。引用方法是 "\" 加上一个数字?\1" 引用W?Ҏ号内匚w到的字符Ԍ"\2" 引用W?Ҏ号内匚w到的字符东y…以此类推,如果一Ҏ号内包含另一ҎP则外层的括号先排序号。换句话_哪一对的左括?"(" 在前Q那q一对就先排序号?/p>
举例如下Q?br /> 前面的章节中Q我讲到了几个代表抽象意义的ҎW号Q?^"Q?$"Q?\b"。它们都有一个共同点Q那是Q它们本w不匚wM字符Q只是对 "字符串的两头" 或?"字符之间的缝? 附加了一个条件。理解到q个概念以后Q本节将l箋介绍另外一U对 "两头" 或?"~隙" 附加条g的,更加灉|的表C方法?/p>
正向预搜索:"(?=xxxxx)"Q?(?!xxxxx)" 格式Q?(?!xxxxx)"Q所在缝隙的右侧Q必M能匹?xxxxx q部分表辑ּ?br /> 反向预搜索:"(?<=xxxxx)"Q?(?<!xxxxx)" q有一些在各个正则表达式引擎之间比较通用的规则,在前面的讲解q程中没有提到?/p>
3.1 表达式中Q可以?"\xXX" ?"\uXXXX" 表示一个字W("X" 表示一个十六进制数Q?/p>
('|")(.*?)(\1)" 在匹?" 'Hello', "World" " ?/a>Q匹配结果是Q成功;匚w到的内容是:" 'Hello' "。再ơ匹配下一个时Q可以匹配到 " "World" "?br />
(\w)\1{4,}" 在匹?"aa bbbb abcdefg ccccc 111121111 999999999" ?/a>Q匹配结果是Q成功;匚w到的内容?"ccccc"。再ơ匹配下一个时Q将得到 999999999。这个表辑ּ要求 "\w" 范围的字W至重?ơ,?br />
<(\w+)\s*(\w+(=('|").*?\4)?\s*)*>.*?</\1>" 在匹?"<td id='td1' style="bgcolor:white"></td>" ?/a>Q匹配结果是成功。如?"<td>" ?"</td>" 不配对,则会匚wp|Q如果改成其他配对,也可以匹配成功?/p>
2.3 预搜索,不匹配;反向预搜索,不匹?/h5>
格式Q?(?=xxxxx)"Q在被匹配的字符串中Q它Ҏ处的 "~隙" 或?"两头" 附加的条件是Q所在缝隙的右侧Q必能够匹配上 xxxxx q部分的表达式。因为它只是在此作ؓq个~隙上附加的条gQ所以它q不影响后边的表辑ּȝ正匹配这个缝隙之后的字符。这q?"\b"Q本w不匚wM字符?\b" 只是所在缝隙之前、之后的字符取来q行了一下判断,不会影响后边的表辑ּ来真正的匚w?br />
Windows (?=NT|XP)" 在匹?"Windows 98, Windows NT, Windows 2000" ?/a>Q将只匹?"Windows NT" 中的 "Windows "Q其他的 "Windows " 字样则不被匹配?br />
(\w)((?=\1\1\1)(\1))+" 在匹配字W串 "aaa ffffff 999999999" ?/a>Q将可以匚w6?f"的前4个,可以匚w9?9"的前7个。这个表辑ּ可以读解成:重复4ơ以上的字母数字Q则匚w其剩下最?位之前的部分。当Ӟq个表达式可以不q样写,在此的目的是作ؓ演示之用?/p>
((?!\bstop\b).)+" 在匹?"fdjka ljfdl stop fjdsla fdj" ?/a>Q将从头一直匹配到 "stop" 之前的位|,如果字符串中没有 "stop"Q则匚w整个字符丌Ӏ?br />
do(?!\w)" 在匹配字W串 "done, do, dog" ?/a>Q只能匹?"do"。在本条举例中,"do" 后边使用 "(?!\w)" 和?"\b" 效果是一L?/p>
q两U格式的概念和正向预搜烦是类似的Q反向预搜烦要求的条件是Q所在缝隙的 "左侧"Q两U格式分别要求必能够匹配和必须不能够匹配指定表辑ּQ而不是去判断右侧。与 "正向预搜? 一L是:它们都是Ҏ在缝隙的一U附加条Ӟ本n都不匚wM字符?br />
举例5Q表辑ּ "(?<=\d{4})\d+(?=\d{4})" 在匹?"1234567890123456" Ӟ匹配除了前4个数字和?个数字之外的中间8个数字。由?JScript.RegExp 不支持反向预搜烦Q因此,本条举例不能够进行演C。很多其他的引擎可以支持反向预搜索,比如QJava 1.4 以上?java.util.regex 包,.NET 中System.Text.RegularExpressions 命名I间Q以及本站推荐的最单易用的 DEELX 正则引擎?/p>
3. 其他通用规则
形式 |
字符范围 |
\xXX |
~号?0 ~ 255 范围的字W,比如Q?a \x20" 表示 |
\uXXXX |
3.2 在表辑ּ "\s"Q?\d"Q?\w"Q?\b" 表示Ҏ意义的同Ӟ对应的大写字母表C相反的意义
表达?/p> |
可匹?/p> |
\S |
|
\D |
|
\W |
|
\B |
3.3 在表辑ּ中有Ҏ意义Q需要添?"\" 才能匚w该字W本w的字符汇?/p>
字符 |
说明 |
^ |
匚w输入字符串的开始位|。要匚w "^" 字符本nQ请使用 "\^" |
$ |
匚w输入字符串的l尾位置。要匚w "$" 字符本nQ请使用 "\$" |
( ) |
标记一个子表达式的开始和l束位置。要匚w括P请?"\(" ?"\)" |
[ ] |
用来自定义能够匹?'多种字符' 的表辑ּ。要匚w中括P请?"\[" ?"\]" |
{ } |
修饰匚wơ数的符受要匚w大括P请?"\{" ?"\}" |
. |
匚w除了换行W(\nQ以外的L一个字W。要匚w数Ҏw,请?"\." |
? |
修饰匚wơ数?0 ơ或 1 ơ。要匚w "?" 字符本nQ请使用 "\?" |
+ |
修饰匚wơ数?1 ơ。要匚w "+" 字符本nQ请使用 "\+" |
* |
修饰匚wơ数?0 ơ或Lơ。要匚w "*" 字符本nQ请使用 "\*" |
| |
左右两边表达式之?"? 关系。匹?"|" 本nQ请使用 "\|" |
3.4 括号 "( )" 内的子表辑ּQ如果希望匹配结果不q行记录供以后用,可以使用 "(?:xxxxx)" 格式
表达式属?/p> |
说明 |
Ignorecase |
默认情况下,表达式中的字母是要区分大写的。配|ؓ Ignorecase 可匚w时不区分大小写。有的表辑ּ引擎Q把 "大小? 概念延?UNICODE 范围的大写?/p> |
Singleline |
默认情况下,数?"." 匚w除了换行W(\nQ以外的字符。配|ؓ Singleline 可ɞ数点可匚w包括换行W在内的所有字W?/p> |
Multiline |
默认情况下,表达?"^" ?"$" 只匹配字W串的开??和结??位置。如Q?br /> |
Global |
主要在将表达式用来替换时起作用,配置?Global 表示替换所有的匚w?/p> |
4.1 如果惌了解高的正则引擎还支持那些复杂的正则语法,可参?a >本站 DEELX 正则引擎的说明文?/a>?/p>
4.2 如果要要求表辑ּ所匚w的内Ҏ整个字符Ԍ而不是从字符串中找一部分Q那么可以在表达式的首尾使用 "^" ?"$"Q比如:"^\d+$" 要求整个字符串只有数字?/p>
4.3 如果要求匚w的内Ҏ一个完整的单词Q而不会是单词的一部分Q那么在表达式首?"\b"Q比如:\b(if|while|else|void|int…?font color="#5050ff">)\b" 来匹配程序中的关键字?/p>
4.4 表达式不要匹配空字符丌Ӏ否则会一直得到匹配成功,而结果什么都没有匚w到。比如:准备写一个匹?"123"?123."?123.5"?.5" q几UŞ式的表达式时Q整数、小数点、小数数字都可以省略Q但是不要将表达式写成:"\d*\.?\d*"Q因为如果什么都没有Q这个表辑ּ也可以匹配成功?a >更好的写法是Q?\d+\.?\d*|\.\d+"?/p>
4.5 能匹配空字符串的子匹配不要@环无限次。如果括号内的子表达式中的每一部分都可以匹?0 ơ,而这个括h体又可以匚w无限ơ,那么情况可能比上一条所说的更严重,匚wq程中可能死循环。虽然现在有些正则表辑ּ引擎已经通过办法避免了这U情况出现死循环了,比如 .NET 的正则表辑ּQ但是我们仍然应该尽量避免出现这U情c如果我们在写表辑ּ旉Cd@环,也可以从q一点入手,查找一下是否是本条所说的原因?/p>
4.6 合理选择贪婪模式与非贪婪模式Q参?a >话题讨论?/p>
4.7 ?"|" 的左右两边,Ҏ个字W最好只有一边可以匹配,q样Q不会因?"|" 两边的表辑ּ因ؓ交换位置而有所不同?/p>
的确省写了很多代码,呵呵。但是,如果你想把变量声明和初始化分开Q那var关键字就无能为力了?/p>
Q?Q直接构建对?br /> js里创建对象的快捷途径一直o我很happyQ例如:
现在C#3.0竟也有类似的语法了:
其实也是q译器做了更多的工作,在背后自己定义了一个类Q更多的原理解释大家自己google吧?/p>
Q?Q扩展方?/font>
js里给一个类扩展Ҏ也就是给prototype原型对象d一个方法,非常方便?br />现在C#3.0也提供了cM的功能,虽然偶觉得这个新Ҏ可能太灉|了以臛_响C#的严谨性甚臌Y件架构方面的问题Q但是无疑这q是很吸引h的:
在Q意一个类中定义上q静态方法,那么你的string对象有直接的ToInt32Ҏ了,是不是很方便Q?/p>
Q?Q创建对象时同时q行初始?/font>
同样是提供了一U简z的语法来初始化一个对象,例如Q?/p>
可以q样实例化:
q样可以些多少构造函数啊Q呵?/p>
Q?Q方便声明集合对?/font>
以前对于数组可以直接声明时初始化Q?/p>
而对于ArrayListq样的集合类型却没有z的语法Q只能通过Add之类的方法逐一dQ?br />而在C#3.0中,所有实现ICollection接口的类都有了简z的初始化语法:
Q?QLambda表达?/font>
管委托作ؓC#最新引入的一个概念非怼UQ它也是事g机制的基。但用v来却很麻烦,怿每个写过的h都有体会Q现在C#3.0通过Lambda表达式简化了q个q程?br />Lambda表达式的关键特征是将表达式或者语句块作ؓ参数Q通过=>来直接定义一个委托,q个委托的类型会Ҏ一pd的{换规则,q译器军_Q例如:
q里?)表示一个空参数的函敎ͼ后面的Console.WriteLine("Hiya!!");是函C。这样就很方便的实现了委托的定义Q大家不妨回忆一下在C#1.1和C#2.0中是如何的麻烦,呵呵?br />Lambda表达式不是那么容易理解,更多信息可以参见C#3.0的语a规范Q?br />http://news.csdn.net/news/newstopic/26/26742.shtml
Q?Q查询表辑ּ
虽然我对Ruby了解不多Q但L觉针寚w合的查询Q直接在语言中体玎ͼq种灉|来源于Ruby?br />于是C#3.0又多了一诱人的Ҏ,可以通过cMSql语句的方式来获得需要的数据Q结果可能存储于一个集合对象中或其他?br />同样Q没有能力三a两语其说清楚,参见规范Q?br />http://news.csdn.net/news/newstopic/26/26747.shtml
背景
随着Internet的普及,|络信息正以极高的速度增长Q在q么多数据中扑ֈ自己需要的信息是一件很J琐的事情,扑ֈ需要的信息后如何获取也是gȝ的事。这需要Internet信息抓取E序来代替h工的操作?/p>
所谓Internet信息抓取E序Q就是程序会按照用户的关键词或关键网站来攉相应的信息,q提供给用户惌的信息格式?/p>
信息量的增加会带来信息网站发布h员工作量的剧增,为实C息发布系l实C息自
动发布、减工作h员工作量、即时跟t最C息,需要自动信息提供程序,因此Internet信息抓取E序应运而生?/p>
目标
实现自定义网站信息分cL取,存入本地数据库、生成静态页面或其它用户定义的信息结构,q下载与信息相关的多媒体文g?/p>
开?/p>
l 目标站点l构分析
本步骤是准确抓取信息个关键?/p>
首先要选择更新频率高的面做ؓ抓取地址Q然后分析要抓取内容面url特点?/p>
然后分析要抓取信息页面的元素Ҏ,比如标题位置Q内容位|?{,得到定位标记炏V?/p>
以上信息写成自q配置文g或存到数据库中?/p>
每个|站都需要分析,写出单独的配|文Ӟ供抓取程序用?/p>
l 信息提取
Ҏ配置文g取得要抓取页面urlQ用HttpWebRequestc获取内容:
//获取http面函数
public string Get_Http(string a_strUrl,int timeout)
{
string strResult ;
try
{
HttpWebRequest myReq = (HttpWebRequest)HttpWebRequest.Create(a_strUrl) ;
myReq.Timeout = timeout;
HttpWebResponse HttpWResp = (HttpWebResponse)myReq.GetResponse();
Stream myStream = HttpWResp.GetResponseStream () ;
StreamReader sr = new StreamReader(myStream , Encoding.Default);
StringBuilder strBuilder = new StringBuilder();
while (-1 != sr.Peek())
{
strBuilder.Append(sr.ReadLine()+"\r\n");
}
strResult = strBuilder.ToString();
}
catch(Exception exp)
{
strResult = "错误Q? + exp.Message ;
}
return strResult ;
}
获取面内容后,分析面中连接地址取到要抓取的urlQ?/p>
//处理面标题和链?/p>
public string SniffWebUrl( string urlStr,string blockB,string blockE )
{
string urlch1 = "";
string urlch2 = "";
int end_n1 = 0;
int end_nums = 0;
int end_nums1 = 0;
int end_nums2 = 0;
int end_nums3 = 0;
string reUTStr = "";
string reTitle = "";
string ret = "";
try
{
int pos01 = urlStr.IndexOf( "." );
int pos02 = urlStr.LastIndexOf( "/" );
if( pos01 < 0 )
{
return "";
}
if( pos02 < 0 )
{
return "";
}
int pos03 = urlStr.IndexOf( "/",pos01 );
if ( pos03 < 0 )
{
urlch1 = urlStr;
urlch2 = urlStr;
}
else
{
urlch1 = urlStr.Substring( 0,pos03 );
urlch2 = urlStr.Substring( 0,pos02 );
}
string tmpAllStr = new PublicFun().Get_Http( urlStr ,time1);
int pos1 = tmpAllStr.IndexOf( blockB );
int pos2 = tmpAllStr.IndexOf( blockE,pos1 + blockB.Length );
if ( pos1>0 && pos2>0 && pos2>pos1 )
{
ret = tmpAllStr.Substring( pos1 + blockB.Length,pos2 - pos1 - blockB.Length );
ret = ret.Substring( ret.IndexOf( "<" ));
while( ret.IndexOf( "<A" ) >= 0 )
{
ret = ret.Substring( 0,ret.IndexOf( "<A" ) ) + "<a" + ret.Substring( ret.IndexOf( "<A" ) + 2 );
}
while( ret.IndexOf( "</A" ) >=0 )
{
ret = ret.Substring( 0,ret.IndexOf( "</A" ) ) + "</a" + ret.Substring( ret.IndexOf( "</A" ) + 3 );
}
while( ret.IndexOf( "Href=" ) >=0 )
{
ret = ret.Substring( 0,ret.IndexOf( "Href=" )) + "href=" + ret.Substring( ret.IndexOf( "Href=" ) + 5 );
}
while( ret.IndexOf( "HREF=" ) >=0 )
{
ret = ret.Substring( 0,ret.IndexOf( "HREF=" )) + "href=" + ret.Substring( ret.IndexOf( "HREF=" ) + 5 );
}
while( ret.IndexOf( "href='" ) >=0 )
{
ret = ret.Substring( 0,ret.IndexOf( "href='" )) + "href=\"" + ret.Substring( ret.IndexOf( "href='" ) + 6 );
单态模式Singleton, 目的是保在调用期? 一个类只有一个实例存?
最典型的例子ؓ数据库连? 数据库连接只需要一? 所以可以用单态模?
使用单态模式时, 创徏数据库连接的Ҏ, 只能为静? q且要保证方法的同步, 否则在多U程操作? 有可能会创徏多个实例.
CZ代码如下:
using System;
using System.Data.OleDb;
using System.Runtime.Remoting.Contexts;
[Synchronization()]
public class ConnectionClass
{
private static OleDbConnection instance = null;
private static string constring = "Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=singleton.mdb;Mode=Share Deny None;Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False";
public static OleDbConnection GetInstance()
{
if (instance == null)
{
Console.WriteLine("Create new connection");
instance = new OleDbConnection(constring);
}
return instance;
}
}
public class Client
{
public static void Main()
{
OleDbConnection cn = ConnectionClass.GetInstance();
cn.Open();
cn = ConnectionClass.GetInstance();
cn.Close();
}
}
关于datagrid的打?br />http://www.chinaaspx.com/article/csharp/295.htm
C#中ؓDataGridd下拉列表?br />http://www.cnblogs.com/icesnaker/archive/2004/09/21/45015.aspx
DataGrid也玩分页
http://dev.csdn.net/article/32/32339.shtm
DataGrid的正反双向排?br />
http://dev.csdn.net/develop/article/26/26817.shtm
DataGrid删除认及Item颜色交替
http://dev.csdn.net/develop/article/26/26768.shtm
DataGrid常见解决Ҏ(?--在DataGrid中选择,认,删除多行复选框列表
http://dev.csdn.net/develop/article/26/26613.shtm
使用DataGrid动态绑定DropDownList
http://dev.csdn.net/develop/article/26/26590.shtm
DataGrid在分늊态下删除U录的问?br />http://dev.csdn.net/develop/article/26/26589.shtm
怎样使用DataGrid控g
http://dev.csdn.net/develop/article/26/26459.shtm
DataGrid Web控g深度历险(3) part1
http://dev.csdn.net/develop/article/26/26249.shtm
DataGrid Web控g深度历险(3) part2
http://dev.csdn.net/develop/article/26/26250.shtm
DataGrid Web控g深度历险(3) part3
http://dev.csdn.net/develop/article/26/26403.shtm
datagrid分页《非控g版?br />http://dev.csdn.net/develop/article/26/26002.shtm
datagrid分页问题Q前后蟩)《控件版?br />http://dev.csdn.net/develop/article/26/26001.shtm
DataGrid Web控g深度历险(2) Part1
http://dev.csdn.net/develop/article/25/25948.shtm
DataGrid Web控g深度历险(1)
http://dev.csdn.net/develop/article/25/25816.shtm
DataGrid Web控g深度历险(2) Part2
http://dev.csdn.net/develop/article/25/25949.shtm
如何在DataGrid里面产生滚动条而不滚动题头
http://dev.csdn.net/develop/article/25/25538.shtm
使用?net 框架上的DataGrid數據分頁控g
http://dev.csdn.net/develop/article/25/25474.shtm
某一目录下的所有相同格式的 XML文gl定C同的DataGrid
http://dev.csdn.net/develop/article/25/25469.shtm
DataGridq接Access的快速分|Q?Q——实现快速分?br />http://dev.csdn.net/develop/article/25/25294.shtm
DataGridq接Access的快速分|Q?Q——动态生成SQL语句
http://dev.csdn.net/develop/article/25/25293.shtm
DataGridq接Access的快速分|Q?Q——SQL语句的选用Q降序)
http://dev.csdn.net/develop/article/25/25291.shtm
DataGridq接Access的快速分|Q?Q——SQL语句的选用Q升序)
http://dev.csdn.net/develop/article/25/25290.shtm
DataGridq接Access的快速分|Q?Q——需求与现状
http://dev.csdn.net/develop/article/25/25288.shtm
昄DataGrid序号的一个适用的方?br />http://dev.csdn.net/develop/article/25/25113.shtm
常见 Datagrid 错误(other)
http://dev.csdn.net/develop/article/24/24460.shtm
XP 风格的可拖动列、可排序、可改变宽度的DataGrid的例?br />http://dev.csdn.net/develop/article/24/24441.shtm
利用radio实现Datagrid的单?br />http://dev.csdn.net/develop/article/24/24295.shtm
重画pd:DataGridColumnStyle之测试代?br />http://dev.csdn.net/develop/article/24/24191.shtm
OleDbDataAdapterl定到Winform下的DataGrid
http://dev.csdn.net/develop/article/24/24148.shtm
去除Asp:DataGrid中无用ViewState的方法(2Q?br />http://dev.csdn.net/develop/article/23/23671.shtm
去除Asp:DataGrid中无用ViewState的方法(1Q?br />http://dev.csdn.net/develop/article/23/23670.shtm
datagrid保存时无法提交更新的问题
http://dev.csdn.net/develop/article/23/23376.shtm
DBF,XLS,XML,MDB文g导入C#DataGrid的方?br />http://dev.csdn.net/develop/article/23/23036.shtm
动态创建DataGrid的模版列
http://dev.csdn.net/develop/article/22/22942.shtm
DataTable中数据记录的l计
http://dev.csdn.net/develop/article/22/22710.shtm
QASP.NETQ用动态属性和DataView实现DataGrid的双向排?br />http://dev.csdn.net/develop/article/22/22513.shtm
如何同步滚动两个相同的DataGrid
http://dev.csdn.net/develop/article/22/22438.shtm
asp.net中DataGrid性能试
http://dev.csdn.net/develop/article/22/22405.shtm
让Asp.NET的DataGrid可排序、可选择、可分页
http://dev.csdn.net/develop/article/22/22297.shtm
DataGrid传统分页方式
http://dev.csdn.net/develop/article/21/21997.shtm
在后代码里创建DataGrid控g
http://dev.csdn.net/develop/article/21/21934.shtm
实现cMWindows资源理器的DataGrid
http://dev.csdn.net/develop/article/21/21933.shtm
ASP.net中的Datagrid自定义分功?br />http://dev.csdn.net/develop/article/21/21875.shtm
在Pocket PC应用E序中用DataGrid控g
http://dev.csdn.net/develop/article/21/21844.shtm
创徏可拖动列的DataGridQ?Q?br />http://dev.csdn.net/develop/article/21/21594.shtm
创徏可拖动列的DataGrid
http://dev.csdn.net/develop/article/21/21593.shtm
DataGrid和CheckBox的合?br />http://dev.csdn.net/develop/article/21/21585.shtm
利用SessionU录datagrid模板列中CheckBox的状?br />http://dev.csdn.net/develop/article/21/21294.shtm
DataGrid模板列中TextBox的焦点相应键盘事?br />http://dev.csdn.net/develop/article/21/21290.shtm
lDataGridd定删除的功?br />http://dev.csdn.net/develop/article/20/20892.shtm
如何lDataGridd自动增长?br />http://dev.csdn.net/develop/article/20/20887.shtm
如何利用RadioButtonList实现datagrid列的单?br />http://dev.csdn.net/develop/article/20/20789.shtm
锦上添花DataGridQ?br />http://dev.csdn.net/develop/article/20/20770.shtm
ASP.Net WebMatrix中Datagrid使用模板列对数据昄q行排版
http://dev.csdn.net/develop/article/20/20576.shtm
格式?DataGrid 输出
http://dev.csdn.net/develop/article/20/20307.shtm
如何实现单击在DATALIST(DATAGRID)的HEADER加入的CHECKBOX,q行DATALIST(DATAGRID)中的CHECKBOX列全选或全不?br />http://dev.csdn.net/develop/article/20/20290.shtm
向datagrid中加横向 U向的合?Q在datatable中实玎ͼdatatable间倒数据)
http://dev.csdn.net/develop/article/20/20221.shtm
ZADO+Adodc控g+DataGrid控g制作的一个数据库~辑E序Q完整原E序Q?br />http://dev.csdn.net/develop/article/19/19600.shtm
如何实现自定义及自动逐页打印DataGrid昄的内?br />http://dev.csdn.net/develop/article/19/19353.shtm
合ƈdatagrid中内容相同的单元?br />http://dev.csdn.net/develop/article/19/19122.shtm
创徏固定表头、表g滚动的DataGrid
http://dev.csdn.net/develop/article/18/18972.shtm
创徏跨多列、多行表头的DataGrid
http://dev.csdn.net/develop/article/18/18971.shtm
在DataGrid中添加一个合计字D?br />http://dev.csdn.net/develop/article/18/18856.shtm
在DataGrid里添加确认删除的对话?br />http://dev.csdn.net/develop/article/18/18838.shtm
为DataGridd自动~号功能
http://dev.csdn.net/develop/article/18/18783.shtm
格式化DataGrid的例子【将数据源中?,1D{换成实际的文字?br />http://dev.csdn.net/develop/article/18/18782.shtm
Henry手记—Web Form中的Datagrid的自定义分页
http://dev.csdn.net/develop/article/18/18760.shtm
创徏完全可编辑的 DataGrid
http://dev.csdn.net/develop/article/18/18744.shtm
DataGrid控g通用打印c?br />http://dev.csdn.net/develop/article/18/18711.shtm
为DataGriddCheckBox控g
http://dev.csdn.net/develop/article/18/18615.shtm
VB.NET中关于DataGrid颜色的自定义
http://dev.csdn.net/develop/article/18/18512.shtm
在DataGrid快速添加新?br />http://dev.csdn.net/develop/article/18/18487.shtm
Henry手记QDatagrid事g响应(?
http://dev.csdn.net/develop/article/18/18315.shtm
datagrid技巧之一Q代码控刉中行的颜色
http://dev.csdn.net/develop/article/17/17852.shtm
在C#里实现DATAGRID的打印预览和打印
http://dev.csdn.net/develop/article/17/17851.shtm
Binding a DataGrid to an ADO Recordset
http://dev.csdn.net/develop/article/17/17850.shtm
Creating DataGrid Templated Columns Dynamically - Part II
http://dev.csdn.net/develop/article/17/17846.shtm
Creating DataGrid Templated Columns Dynamically - Part I
http://dev.csdn.net/develop/article/17/17845.shtm
DataTable,DataView和DataGrid中一些容易淆的概念
http://dev.csdn.net/develop/article/17/17840.shtm
动态的理ASP.NET DataGrid数据?br />http://dev.csdn.net/develop/article/17/17599.shtm
Henry手记QDatagrid键盘事g响应Q二Q?br />http://dev.csdn.net/develop/article/17/17424.shtm
Henry手记—从Datagrid的标题居中说?br />http://dev.csdn.net/develop/article/17/17053.shtm
用嵌套的DataGrid实现M式表的显C?br />http://dev.csdn.net/develop/article/16/16960.shtm
DataGrid中嵌套用Repeater
http://dev.csdn.net/develop/article/16/16834.shtm
Henry手记 Q?Datagrid键盘事g响应Q一Q?br />http://dev.csdn.net/develop/article/16/16572.shtm
ldatagrid控g建立E_的双向排?asp.net)
http://dev.csdn.net/develop/article/16/16563.shtm
asp.netW记(datasetQdatagrid)
http://dev.csdn.net/develop/article/16/16528.shtm
d一个下拉框到DataGrid
http://dev.csdn.net/develop/article/16/16434.shtm
DataSet导出CSV格式(ASP.NET,C#)
http://dev.csdn.net/develop/article/16/16311.shtm
Henry手记QDatagrid事g响应
http://dev.csdn.net/develop/article/16/16273.shtm
Henry手记QWinForm Datagridl构剖析Q三Q用代?br />http://dev.csdn.net/develop/article/16/16088.shtm
Henry手记QWinForm Datagridl构剖析Q三Q类代码
http://dev.csdn.net/develop/article/16/16087.shtm
Henry手记QWinForm Datagridl构剖析Q三Q?br />http://dev.csdn.net/develop/article/16/16086.shtm
ADO在vb.net中的使用Q与datagridl合Q?br />http://dev.csdn.net/develop/article/15/15975.shtm
Henry手记QWinForm Datagridl构剖析Q二Q程?br />http://dev.csdn.net/develop/article/15/15929.shtm
Henry手记QWinForm Datagridl构剖析Q二Q?br />http://dev.csdn.net/develop/article/15/15928.shtm
ASP.NET中的DataGrid的属?br />http://dev.csdn.net/develop/article/15/15920.shtm
EnableViewState="false"的DataGrid分页
http://dev.csdn.net/develop/article/15/15913.shtm
Datagrid 链接数据库Access
http://dev.csdn.net/develop/article/15/15861.shtm
DataGrid 链接Access数据?br />http://dev.csdn.net/develop/article/15/15860.shtm
Henry手记:WinForm Datagridl构剖析Q一Q?br />http://dev.csdn.net/develop/article/15/15686.shtm
把Excel文g中的数据d到DataGrid?br />http://dev.csdn.net/develop/article/15/15544.shtm
如何创徏一个用弹出H口来查看详l信息的链接列
http://dev.csdn.net/develop/article/15/15456.shtm
DataGrid使用技巧(四)
http://dev.csdn.net/develop/article/15/15282.shtm
DataGrid使用技巧(三)
http://dev.csdn.net/develop/article/15/15220.shtm
DataGrid使用技巧(二)
http://dev.csdn.net/develop/article/15/15139.shtm
DataGrid使用技?一)
http://dev.csdn.net/develop/article/15/15109.shtm
奇?DataGrid
http://dev.csdn.net/develop/article/14/14114.shtm
使用c#+(datagrid控g)~辑xml文g
http://dev.csdn.net/develop/article/13/13333.shtm
在DataGrid中创Z个弹出式DetailsH口
http://dev.csdn.net/develop/article/12/12170.shtm
在DataGrid中创Z个弹出式DetailsH口
http://dev.csdn.net/develop/article/12/12099.shtm
vs.net beta 2中利用DataGrid分页详解
http://dev.csdn.net/develop/article/11/11009.shtm
使用 ASP+ DataGrid 控g来创Z视图/详细资料视图 Q?Q?br />http://dev.csdn.net/develop/article/1/1865.shtm
使用 ASP+ DataGrid 控g来创Z视图/详细资料视图
http://dev.csdn.net/develop/article/1/1864.shtm
静态化是有很大好处的。最值得U道的应该是加快下蝲速度,更利于搜索引擎的抓取,q两点对一个企业网站来说应该比较重要吧?/font>
一般的静态化是通过fsolgd|站模板的内容,然后替换其中的特定字W,生成静态页面,q是个不错的xQ如果你要自己写一个网站,你用q种办法Q因为比较稳定。而且如果想以后更换网站界面也相当ҎQ只需修改模板而无需更改E序。这个办法很多高手已l说得很明白了,推荐一个:
http://www.jingzhengli.cn/Blog/zjh/265.html
然而很不幸Q很多公司的|站已经做好Q而且每一都是html中夹杂大量asp代码的Ş式,没有模板Q功能也没有模块化,如果想仍用以上方法进行静态化处理Q其复杂E度相当于重做一个网站?/font>
提出一个简单宜用的解决办法。不用模ѝ不用修改程序,非常便捷。利用XMLHTTP对象及其Ҏ。他的原理是已有的asp|页内容一ơ性读取出来,然后写到静态页中,实现|站的静态化重构?/font>
现在以生?www.rocky-glass.com的首ؓ例,介绍一下这U方法,代码如下Q?/font>
Url="http://www.rocky-glass.com/default.asp" ?span style="COLOR: red">定义动态首?/span>
wstr = GetPage(Url) ?span style="COLOR: red">把动态首늚内容全部d出来
Set fs=Server.CreateObject("Scripting.FileSystemObject")
Set CrFi=fs.CreateTextFile(server.MapPath("../")&"\index.htm") ?span style="COLOR: red">创徏静态首?/span>index.htm
CrFi.Writeline(wstr) ?span style="COLOR: red">读取出的内容写入静态页?/span>
set CrFi=nothing ?span style="COLOR: red">关闭两个对象
set fs=nothing
以下两个函数涉及到xmlhttp对象和方法的使用Q如果能看懂qQ看不懂直接调用p?/font>
Function GetPage(url)
‘此q程的功能是实现?/span>
asp
|页的内容一ơ性读取出来?/span>
dim Retrieval
Set Retrieval = CreateObject("Microsoft.XMLHTTP")
With Retrieval
.Open "Get", url, False ', "", ""
.Send
GetPage = BytesToBstr(.ResponseBody)
End With
Set Retrieval = Nothing
End Function
Function BytesToBstr(body)
‘字W{?/span>
dim objstream
set objstream = Server.CreateObject("adodb.stream")
objstream.Type = 1
objstream.Mode =3
objstream.Open
objstream.Write body
objstream.Position = 0
objstream.Type = 2
objstream.Charset = "utf-8" ?span style="COLOR: red">如果是中文页面请?/span>gb2312.Q英文页面用utf-8
BytesToBstr = objstream.ReadText
objstream.Close
set objstream = nothing
End Function
首页的静态化完成了Q生成ؓ index.htm q个静态页Q其他的面也可以按照这个思\q行Q利用不同的后缀id|可以批量生成所有网c?/font>
两点注意Q?、如果是扚w生成面要保证网速,否则E序的运行很Ҏ出服务器的允许旉?/font>
2、生成英文页面的时候,要保证原面上没有汉字或其他语言Q否则生成出错?/font>
q种静态化相对比较ҎQ尤其是那些寚w些写的很差劲的网站进行静态化处理。我一直用q种Ҏl企业静态化处理?/font>
有机会我会把q种Ҏq一步写成类Q方便各位网友调用?/font>
下边说说两种骗h的静态化ҎQ引起各位注意?/font>
1、?/span>框架伪静?q种是非常简单而且也是非常便于识别?它的原理比较?是做一个静态的L枉?然后把动态的内容铑օ副框架内,q个单从它的URL可以看出眉?如果整个|站的URL都是一L,那么׃定是框架伪静态的。这U所谓的静态化不仅达不C化的目的Q而且q不如不优化?/font>
2、?/span>利用lg把asp的辍昄为htm,它主要是利用一个组件强制性的把asp文g的后辍显CZؓhtm,比较有名的组件是MOD REWRITEQ这U东西只是在形式上让你感觉已l静态化了,其实仍然是执行动态网c识别这个也比较ҎQ那是看看有没有生成静态页是了。如果没有生成静态页Q显然是骗h的,因ؓ只有动态页才是虚拟的,从数据库中调用数据进行显C,而静态页面一定是独立的。当Ӟ利用q种Ҏ可以起到seo优化作用Q但是对讉K速度来说Q是一Ҏ高都没有的,而且q有可能降低讉K速度?/font>
|
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1444169