2009年1月5日

在ff中,如果希望一个图片实现正常大小、比例显示,并在图片大小超过相框时自动缩放,可以通过max-width、max-height来实现。

但在ie6中,没有这两个属性。以下是实现方法。

假设相框为650*400

首先尝试使用一个简单的表达式:

width:expression(this.width > 650 ? 650:true);

height:expression(this.height >400 ? 400:true);

这个表达式很简单,但是如果图片的高和宽都超过边框,那么图片会被强制转到650*400,图片出现了变形。

因此,做以下改进:

width:expression(this.width > 650 && this.height<= this.width ? 650:true);

height:expression(this.height >400 && this.height > this.width? 400:true);

上面算式还隐藏了一个问题,如果图片长宽都比边框大,而长宽比大于650:400,则短边可能超出边框,因为我们只缩了最长边。

再做一次改进:

 

width:expression(this.width > 650 && (this.height-400)<= (this.width-650) ? 650:true);

height:expression(this.height >400 &&(this.height-400)>(this.width-650)? 400:true);

如上是我目前测试结果正确的max表达式在ie6中的正确转换。

各位大师大侠有高招请多多赐教。

[续]

上面的公式,1600*1200的图片变形了,反思改进如下:

width:expression(this.width > 650 && this.width/this.height >=1.625  ? 650:true);

height:expression(this.height >400 && this.width/this.height <1.625  ? 400:true);

用比例计算,觉得这样算正确了。

 

posted @ 2009-01-05 09:07 曹岳 阅读(388) 评论(3) 编辑

2008年12月28日

引用自:http://www.cnblogs.com/bear-study-hard/archive/2006/03/09/346154.html;http://www.cnblogs.com/kingeric/archive/2007/07/25/831126.html

对于winform比较全面的介绍:


    除了PrintPreviewDialog外,其他对话框类都派生于抽象基类CommonDialog,这个基类的方法可以管理Windows通用对话框。

 

对话框适用的场合:

1.要让用户选择和浏览要打开的文件,应使用OpenFileDialog。这个对话框可以配置为只允许选择一个文件,或可以选择多个文件。

2.使用SaveFileDialog,用户可以为要保存的文件指定一个文件名和浏览的路径。

3.PrintDialog用户选择一个打印机,并设置打印选项。

4.配置页面的边距,通常使用PageSetupDialog。

5.PrintViewDialog是在屏幕上进行打印预览的一种方法,并有一些选项如缩放。

6.FontDialog列出了所有已安装的Windows字体、样式和字号,以及各字体的预览效果,以便选择字体。

7.ColorDialog用于选择颜色。

 

文件对话框:

l         OpenFileDialog:打开文件对话框

l         SaveFileDialog:保存文件对话框

打开文件对话框

            OpenFileDialog ofd = new OpenFileDialog();

            ofd.ShowDialog();


    会弹出一个打开文件的对话框。

通过修改对象的Title属性,可以更改对话框的标题

现在显示的是“打开”,做如下设置

            ofd.Title = "设置后标题文字:)";

再次运行程序,我们就会看到相应的修改


    我们还可以通过设置
InitialDirectory属性来使打开文件对话框打开时在一个设置好的默认路径上。它的默认值是一个空字符串,表示用户的“我的文档”目录,第一次在应用程序中使用这个对话框时,就显示“我的文档”目录下的文件,第二次再打开对话框时,显示的目录就与上一次打开的文件所在的目录相同。

在实际使用的时候,不要写死一个路径,如果用户不存在这个路径会出现错误。为了获取特定的系统文件夹,可以使用System.Environment类的静态方法GetFolderPath()。该方法接受一个Environment.SpecialFolder枚举,其中可以定义要返回路径的哪个系统目录。

            ofd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Templates);

设置文件过滤器用于打开文件对话框中显示特定类型的文件。

            ofd.Filter = "Text Document(*.txt)|*.txt|All Files|*.*|我要显示的文件类型(*.exe)|*.exe";


    设置错误的Filter值会产生一个运行异常
System.ArgumentException和错误信息“The provided filter string is invalid”。过滤器前后也不允许有空格。

FilterIndex属性指定列表框中的默认选项。

设置文件有效性验证ValidateNames,验证用户输入是否是一个有效的Windows文件名。

CheckPathExists:验证路径有效性

CheckFileExists:验证文件有效性

            ofd.ValidateNames = true;

            ofd.CheckPathExists = true;

            ofd.CheckFileExists = true;

自定义帮助信息:

设置对象的ShowHelp属性可以出现一个帮助按钮,自定义帮助信息。

通过HelpRequest事件添加一个处理程序。

            ofd.ShowHelp = true;

            ofd.HelpRequest += new EventHandler(ofd_HelpRequest);

        private void ofd_HelpRequest(object sender, EventArgs e)

        {

            MessageBox.Show("我自己定义的帮助信息:)");

        }


    
    单击帮助按钮就会显示我定义的帮助信息。



    设置
Multiselect属性可以使打开文件对话框打开多个文件。

通过如下判断可以得到打开文件对话框单击的是哪个按钮。

            if(ofd.ShowDialog() == DialogResult.OK)

            {

            }

 

保存文件对话框:

使用Title属性设置对话框的标题。

文件扩展名:

AddExtension是一个布尔属性,它定义了文件扩展名是否应自动添加到用户输入的文件名上。如果用户已经输入了一个文件扩展名,就不会添加其它扩展名了。所以如果用户输入了文件名test,就保存文件test.txt,如果输入了test.txt,保存的文件仍是test.txt,而不是test.txt.txt。

如果用户没有输入文件扩展名,就使用DefaultExt属性设置的文件扩展名。如果这个属性为空,就使用当前选择的Filter中定义的文件扩展名。如果设置了Filter和DefaultExt,则不论Filter是什么,都使用Default。

同OpenFileDialog一样,具有ValidateNames、CheckFileExists和CheckPathExists三个属性,区别是对于SaveFileDialog,CheckFileExists的默认值是false,表示可以提供新文件名,进行保存。

如果设置CreatePrompt属性为true,就会询问用户是否要创建一个新文件。

如果设置OverwritePrompt属性为true,就会询问用户是否要覆盖一个已有的文件。

进行如下定义一个保存文件对话框后,我们通过如下功能可以实现一个另存为的功能:

SaveFileDialog sfd = new SaveFileDialog();

    private void miFileSaveAs_Click(object sender, EventArgs e)

    {

        if(sfd.ShowDialog() == DialogResult.OK)

        {

            string fileName = sfd.FileName;

            SaveFile(fileName);

        }

    }

 

    protected void SaveFile(string fileName)

    {

        try

        {

            Stream stream = File.OpenWrite(fileName);

            using(StreamWriter writer = new StreamWriter(stream))

            {

                writer.Write(textBox1.Text);

            }

        }

        catch(IOException ex)

        {

            MessageBox.Show(ex.Message,"Simple Editor",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);

        }

    }

 其中:

打开文件对话框(OpenFileDialog)
 
   1、 OpenFileDialog控件有以下基本属性
InitialDirectory  对话框的初始目录 
Filter  要在对话框中显示的文件筛选器,例如,"文本文件(*.txt)|*.txt|所有文件(*.*)||*.*" 
FilterIndex  在对话框中选择的文件筛选器的索引,如果选第一项就设为1 
RestoreDirectory  控制对话框在关闭之前是否恢复当前目录 
FileName  第一个在对话框中显示的文件或最后一个选取的文件 
Title  将显示在对话框标题栏中的字符 
AddExtension  是否自动添加默认扩展名 
CheckPathExists  在对话框返回之前,检查指定路径是否存在 
DefaultExt  默认扩展名 
DereferenceLinks  在从对话框返回前是否取消引用快捷方式 
ShowHelp  启用"帮助"按钮 
ValiDateNames  控制对话框检查文件名中是否不含有无效的字符或序列 
  2、 OpenFileDialog控件有以下常用事件
FileOk  当用户点击"打开"或"保存"按钮时要处理的事件 
HelpRequest  当用户点击"帮助"按钮时要处理的事件  

保存文件对话框(SaveFileDialog)
 
  保存文件对话框控件有两种情况,一就是保存,二就是另存为,保存很简单,就是在文件已经打开的情况下的,再把文件写一篇,在这里我们主要讲另存为的情况(SaveAs)。
   1,SaveFileDialog控件的属性

Filter  要在对话框中显示的文件筛选器,例如,"文本文件(*.txt)|*.txt|所有文件(*.*)|*.*" 
FilterIndex  在对话框中选择的文件筛选器的索引,如果选第一项就设为1 
RestoreDirectory  控制对话框在关闭之前是否恢复当前目录 
AddExtension  是否自动添加默认扩展名 
CheckFileExists  
CheckPathExists  在对话框返回之前,检查指定路径是否存在 
Container  控制在将要创建文件时,是否提示用户。只有在ValidateNames为真值时,才适用。 
DefaultExt  缺省扩展名 
DereferenceLinks  在从对话框返回前是否取消引用快捷方式 
FileName  第一个在对话框中显示的文件或最后一个选取的文件 
InitialDirector  对话框的初始目录 
OverwritePrompt  控制在将要在改写现在文件时是否提示用户,只有在ValidateNames 为真值时,才适用 
ShowHelp  启用"帮助"按钮 
Title  将显示在对话框标题栏中的字符 
ValidateNames  控制对话框检查文件名中是否不含有无效的字符或序列 
  2、SaveFileDialog事件如下:
 
FileOk  当用户点击"打开"或"保存"按钮时要处理的事件 
HelpRequest  当用户点击"帮助"按钮时要处理的事件

 

posted @ 2008-12-28 17:30 曹岳 阅读(530) 评论(0) 编辑

2008年12月15日

日常数据库读取经常要分页显示,使用数据绑定的方法只能用在DG之类的重型控件中,对于定制控件,通常要使用分页sql。以下记录两种:

方式一:拼接SQL

 public DataTable SpacePhotosList(int pageSize, int currentPage, int userid, int albumid)
        {
            //try
            //{
            //"userid=" + userid + " AND albumid=" + albumid
            DbParameter[] prams =
    {
     DbHelper.MakeInParam("@userid", (DbType)SqlDbType.Int, 4,userid),
     DbHelper.MakeInParam("@albumid", (DbType)SqlDbType.Int, 4,albumid)
    };
            int pageTop = (currentPage - 1) * pageSize;
            string sql = "";
            if (currentPage == 1)
            {
                sql = "SELECT TOP " + pageSize.ToString() + " * FROM "
                    + "[" + BaseConfigs.GetTablePrefix + "photos] WHERE [userid]=@userid AND [albumid]=@albumid ORDER BY [photoid] ASC";
            }
            else
            {
                sql = "SELECT TOP " + pageSize.ToString() + " * FROM "
                    + "[" + BaseConfigs.GetTablePrefix + "photos] WHERE [photoid] > (SELECT MAX([photoid])  FROM "
                    + "(SELECT TOP " + pageTop + " [photoid] FROM [" + BaseConfigs.GetTablePrefix + "photos] WHERE "
                    + "[userid]=@userid AND [albumid]=@albumid ORDER BY [photoid] ASC) AS tblTmp ) AND [userid]=@userid "
                    + "AND [albumid]=@albumid ORDER BY [photoid] ASC";
            }
            return DbHelper.ExecuteDataset(CommandType.Text, sql, prams).Tables[0];
            //}
            //catch
            //{
            //    return new DataTable();
            //}
        }

 

方式二:存储过程

 public DataTable GetSpacePhotoListByAlbumId(int albumId, int pageIndex, int pageSize, out int totalRecords)
        {
            string sqlStr = string.Format("select * from {0}photos where albumid={1}", TablePrefix, albumId);
            string orderby = "postdate desc";
            int rc = 0;
            DataTable dt = DbHelper.GetPageDataTable(pageSize, pageIndex, sqlStr, orderby, ref rc);
            totalRecords = rc;
            return dt;
        }

 

#region 分页处理

        /// <summary>

        /// 分页GetPage(10,1,"select * from table","id desc");

        /// </summary>

        /// <param name="pagesize">页面大小</param>

        /// <param name="curpageindex">当前页,从开始</param>

        /// <param name="select">要进行分页的查询语句</param>

        /// <param name="orderby">需要进行排序的列</param>

        /// <returns>分页后的表,用DataTable的形式</returns>

        public DataTable GetPageDataTable(int pagesize,int curpageindex,string select,string orderby)

        {

            DbParameter[] parms = {

                DbHelper.MakeInParam("@select",DbType.String,300,select.Trim()),

                DbHelper.MakeInParam("@pagesize",DbType.Int32,4,pagesize),

                DbHelper.MakeInParam("@currentpageindex",DbType.Int32,4,curpageindex),

                DbHelper.MakeInParam("@orderby",DbType.String,200,orderby.Trim())

            };

            return ExecuteDataset(CommandType.StoredProcedure, "dnt_getpage", parms).Tables[0];

 

        }

 

        /// <summary>

        /// 分页如:GetPage(10,1,"select * from table","id desc");

        /// </summary>

        /// <param name="pagesize">页面大小</param>

        /// <param name="curpageindex">当前页,从开始</param>

        /// <param name="select">要进行分页的查询语句</param>

        /// <param name="orderby">需要进行排序的列</param>

        /// <returns>分页后的表,用DataReader的形式</returns>

        public DbDataReader GetPageReader(int pagesize,int curpageindex, string select, string orderby )

        {

            DbParameter[] parms = {

                DbHelper.MakeInParam("@select",DbType.String,300,select.Trim()),

                DbHelper.MakeInParam("@pagesize",DbType.Int32,4,pagesize),

                DbHelper.MakeInParam("@currentpageindex",DbType.Int32,4,curpageindex),

                DbHelper.MakeInParam("@orderby",DbType.String,200,orderby.Trim())

            };

            return ExecuteReader(CommandType.StoredProcedure, "dnt_getpage", parms);

        }

 

#endregion

 

 

存储过程:

Create PROC dnt_getpage

(

    @select varchar(200),

    @pagesize int,

    @currentpageindex int,

    @orderby varchar(200)

)

as

declare @start int;

declare @end int;

declare @sql varchar(500);

set @start=@pagesize * (@currentpageindex - 1) + 1;

set @end= @pagesize * @currentpageindex;

set @select=Stuff(@select,1,6,'select row_number() over(order by '+@orderby+') as rownum,');

set @sql='with tmp as ('+@select+') select * from TMP WHERE rownum>='+cast(@start as varchar(10))+' and rownum<='+cast(@end as varchar(10))

 

exec (@sql)

return

posted @ 2008-12-15 09:59 曹岳 阅读(185) 评论(0) 编辑

2008年12月12日

前一段遇到bit[] string base64的相互转化,抄录一篇有用的文章:

 

using System;

namespace SClassLibrary.SEncoding
{
/// <summary>
/// 有关base64编码算法的相关操作
/// 作者:尹曙光
/// </summary>
public class SBase64
{
public SBase64()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
//--------------------------------------------------------------------------------
/// <summary>
/// 将字符串使用base64算法加密
/// </summary>
/// <param name="sourceString">待加密的字符串</param>
/// <param name="ens">System.Text.Encoding 对象,如创建中文编码集对象:System.Text.Encoding.GetEncoding(54936)</param>
/// <returns>加码后的文本字符串</returns>
public static string EncodingForString(string sourceString,System.Text.Encoding ens)
{
return Convert.ToBase64String(ens.GetBytes(sourceString));
}

/// <summary>
/// 将字符串使用base64算法加密
/// </summary>
/// <param name="sourceString">待加密的字符串</param>
/// <returns>加码后的文本字符串</returns>
public static string EncodingForString(string sourceString)
{
return EncodingForString(sourceString,System.Text.Encoding.GetEncoding(54936));
}

/// <summary>
/// 从base64编码的字符串中还原字符串,支持中文
/// </summary>
/// <param name="base64String">base64加密后的字符串</param>
/// <param name="ens">System.Text.Encoding 对象,如创建中文编码集对象:System.Text.Encoding.GetEncoding(54936)</param>
/// <returns>还原后的文本字符串</returns>
public static string DecodingForString(string base64String,System.Text.Encoding ens)
{
/**
* ***********************************************************
*
* 从base64String中取得的字节值为字符的机内码(ansi字符编码)
* 一般的,用机内码转换为汉字是公式:
* (char)(第一字节的二进制值*256+第二字节值)
* 而在c#中的char或string由于采用了unicode编码,就不能按照上面的公式计算了
* ansi的字节编和unicode编码不兼容
* 故利用.net类库提供的编码类实现从ansi编码到unicode代码的转换
*
* GetEncoding 方法依赖于基础平台支持大部分代码页。但是,对于下列情况提供系统支持:默认编码,即在执行此方法的计算机的区域设置中指定的编码;Little-Endian Unicode (UTF-16LE);Big-Endian Unicode (UTF-16BE);Windows 操作系统 (windows-1252);UTF-7;UTF-8;ASCII 以及 GB18030(简体中文)。
*
*指定下表中列出的其中一个名称以获取具有对应代码页的系统支持的编码。
*
* 代码页 名称
* 1200 “UTF-16LE”、“utf-16”、“ucs-2”、“unicode”或“ISO-10646-UCS-2”
* 1201 “UTF-16BE”或“unicodeFFFE”
* 1252 “windows-1252”
* 65000 “utf-7”、“csUnicode11UTF7”、“unicode-1-1-utf-7”、“unicode-2-0-utf-7”、“x-unicode-1-1-utf-7”或“x-unicode-2-0-utf-7”
* 65001 “utf-8”、“unicode-1-1-utf-8”、“unicode-2-0-utf-8”、“x-unicode-1-1-utf-8”或“x-unicode-2-0-utf-8”
* 20127 “us-ascii”、“us”、“ascii”、“ANSI_X3.4-1968”、“ANSI_X3.4-1986”、“cp367”、“csASCII”、“IBM367”、“iso-ir-6”、“ISO646-US”或“ISO_646.irv:1991”
* 54936 “GB18030”
*
* 某些平台可能不支持特定的代码页。例如,Windows 98 的美国版本可能不支持日语 Shift-jis 代码页(代码页 932)。这种情况下,GetEncoding 方法将在执行下面的 C# 代码时引发 NotSupportedException:
*
* Encoding enc = Encoding.GetEncoding("shift-jis");
*
* **************************************************************/
//从base64String中得到原始字符
return ens.GetString(Convert.FromBase64String(base64String));
}

/// <summary>
/// 从base64编码的字符串中还原字符串,支持中文
/// </summary>
/// <param name="base64String">base64加密后的字符串</param>
/// <returns>还原后的文本字符串</returns>
public static string DecodingForString(string base64String)
{
return DecodingForString(base64String,System.Text.Encoding.GetEncoding(54936));
}

//--------------------------------------------------------------------------------------

/// <summary>
/// 对任意类型的文件进行base64加码
/// </summary>
/// <param name="fileName">文件的路径和文件名</param>
/// <returns>对文件进行base64编码后的字符串</returns>
public static string EncodingForFile(string fileName)
{
System.IO.FileStream fs=System.IO.File.OpenRead(fileName);
System.IO.BinaryReader br= new System.IO.BinaryReader(fs);

/*System.Byte[] b=new System.Byte[fs.Length];
fs.Read(b,0,Convert.ToInt32(fs.Length));*/

string base64String=Convert.ToBase64String(br.ReadBytes((int)fs.Length));

br.Close();
fs.Close();
return base64String;
}

/// <summary>
/// 把经过base64编码的字符串保存为文件
/// </summary>
/// <param name="base64String">经base64加码后的字符串</param>
/// <param name="fileName">保存文件的路径和文件名</param>
/// <returns>保存文件是否成功</returns>
public static bool SaveDecodingToFile(string base64String,string fileName)
{
System.IO.FileStream fs=new System.IO.FileStream(fileName, System.IO.FileMode.Create);
System.IO.BinaryWriter bw = new System.IO.BinaryWriter(fs);
bw.Write(Convert.FromBase64String(base64String));
bw.Close();
fs.Close();
return true;
}

//-------------------------------------------------------------------------------

/// <summary>
/// 从网络地址一取得文件并转化为base64编码
/// </summary>
/// <param name="url">文件的url地址,一个绝对的url地址</param>
/// <param name="objWebClient">System.Net.WebClient 对象</param>
/// <returns></returns>
public static string EncodingFileFromUrl(string url,System.Net.WebClient objWebClient)
{
return Convert.ToBase64String(objWebClient.DownloadData(url));
}

/// <summary>
/// 从网络地址一取得文件并转化为base64编码
/// </summary>
/// <param name="url">文件的url地址,一个绝对的url地址</param>
/// <returns>将文件转化后的base64字符串</returns>
public static string EncodingFileFromUrl(string url)
{
//System.Net.WebClient myWebClient = new System.Net.WebClient();
return EncodingFileFromUrl(url,new System.Net.WebClient());
}
}
}

posted @ 2008-12-12 10:13 曹岳 阅读(393) 评论(0) 编辑

2008年11月25日

依然是别人的作品。(http://www.cnblogs.com/3stones/archive/2008/11/21/1114645.html

遗漏HttpContext.RewritePath()方法。

 

Response.Redirect(),Server.Transfer(),Server.Execute()的区别

1、Response.Redirect():
Response.Redirect方法导致浏览器链接到一个指定的URL。当Response.Redirect()方法被调用时,它会创建一个应答,应答头中指出了状态代
码302(表示目标已经改变)以及新的目标URL。浏览器从服务器收到该应答,利用应答头中的信息发出一个对新URL的请求。
 
    这就是说,使用Response.Redirect方法时重定向操作发生在客户端,总共涉及到两次与服务器的通信(两个来回):第一次是对原始页面

的请求,得到一个302应答,第二次是请求302应答中声明的新页面,得到重定向之后的页面。

2、Server.Transfer
   
Server.transfer是IIS 5.0新增加的一个功能。它解决了
Response.Redirect的两个重要的缺陷:
1)在Response.Redirect中,我们得不到任何第一页的输出
2)Response.Redirect会丢失request中的所有属性,当然我们可以通过一些其他的办
法,比如session来搞定,可是,有些页的参数是在request中传过来的,这样的话,就不行了
3) Response.Redirect需要client端再发起一个请求。
server.transfer就很好地解决了这些问题。它是从server端直接向下一页发起请求,不需要client再次发送请求.
如果你的网页非常依赖response.redirect,这个小小的改变可以提高将近25%的效率。(根据微软文档).

    Server.Transfer方法把执行流程从当前的ASPX文件转到同一服务器上的另一个ASPX页面。调用Server.Transfer时,当前的ASPX页面终止

执行,执行流程转入另一个ASPX页面,但新的ASPX页面仍使用前一ASPX页面创建的应答流。
 
    如果用Server.Transfer方法实现页面之间的导航,浏览器中的URL不会改变,因为重定向完全在服务器端进行,浏览器根本不知道服务器

已经执行了一次页面变换。
 
    默认情况下,Server.Transfer方法不会把表单数据或查询字符串从一个页面传递到另一个页面,但只要把该方法的第二个参数设置成True

,就可以保留第一个页面的表单数据和查询字符串。
 
    同时,使用Server.Transfer时应注意一点:目标页面将使用原始页面创建的应答流,这导致ASP.NET的机器验证检查(Machine

Authentication Check,MAC)认为新页面的ViewState已被篡改。因此,如果要保留原始页面的表单数据和查询字符串集合,必须把目标页面

Page指令的 EnableViewStateMac属性设置成False。

server.Transfer()有一个不足就是:当用户在a.aspx中提交了一个表单,然后用Server.Transfer()进入 b.aspx,这时如果用户刷新一下页面,

浏览器便会问用户是否“重试”发送表单,如果用户点击“是”,那么,表单中的数据被重新发送到服务器。如发送表单的作用就是为了向数

据库中插入一条记录,结果导不希望发生的事——同一表单被多次加入到数据库中。

3、Server.Execute
 
    Server.Execute方法允许当前的ASPX页面执行一个同一Web服务器上的指定ASPX页面,当指定的ASPX页面执行完毕,控制流程重新返回原页

面发出Server.Execute调用的位置。
 
    这种页面导航方式类似于针对ASPX页面的一次函数调用,被调用的页面能够访问发出调用页面的表单数据和查询字符串集合,所以要把被

调用页面Page指令的EnableViewStateMac属性设置成False。

4.
erver.Execute("another.aspx")和Server.Transfer("another.aspx")区别: 
Execute是从当前页面转移到指定页面,并将执行返回到当前页面 
Transfer是将执行完全转移到指定页面


总结:
在网络状态较好的情况下,Redirect(url)方法效率最高!! 可重定向到同一台或非同一台服务器上的aspx或非aspx(html)资源
Server.Transfer方法和Server.Execute方法最灵活!! 但只能转到同一Application目录下,也有可能导致不期望的结果发生
Server.Execute方法占用资源最多.

posted @ 2008-11-25 12:02 曹岳 阅读(119) 评论(0) 编辑

2008年6月29日

posted @ 2008-06-29 23:51 曹岳 阅读(1825) 评论(2) 编辑

posted @ 2008-06-29 22:29 曹岳 阅读(909) 评论(1) 编辑

2008年6月18日

posted @ 2008-06-18 09:47 曹岳 阅读(529) 评论(1) 编辑

2008年4月15日

posted @ 2008-04-15 23:15 曹岳 阅读(402) 评论(1) 编辑

2008年4月6日

posted @ 2008-04-06 16:07 曹岳 阅读(598) 评论(0) 编辑