30 Jul 2009

如何判断一个类型是nullable类型,并得知它的原始类型

有些时候我们需要判断某个类型是否是Nullable类型,并且可能需要知道它的原始类型,
比如在做些ORM相关工作时,就需要这方面的应用,如下代码使用可以实现这个要求

class Program
    {
        static void Main( string[] args )
        {
            RL( );

        Type type =  typeof( DateTime? );
        Type originalType;

        if ( IsNullable( type , out originalType ) )
        {
            WL( originalType.ToString( ) );
        }
        else
        {
            WL( "NOT Nullable" );
        }

        type =  typeof( DateTime );

        if ( IsNullable( type , out originalType ) )
        {
            WL( originalType.ToString( ) );
        }
        else
        {
            WL( "NOT Nullable" );
        }

        RL( );
    }

    private static bool IsNullable( Type p , out Type originalType )
    {
        bool result = false;

        if ( p.IsGenericType && p.GetGenericTypeDefinition( ) == typeof( Nullable<> ) )
        {
            result = true;
            originalType = p.GetGenericArguments( )[0];
        }
        else
        {
            originalType = null;
        }

        return result;
    }

    #region Helper methods

    private static void WL( object text , params object[] args )
    {
        Console.WriteLine( text.ToString( ) , args );
    }

    private static void RL( )
    {
        Console.ReadLine( );
    }

    private static void Break( )
    {
        System.Diagnostics.Debugger.Break( );
    }

    #endregion
}

21 Jul 2009

Asp.Net发邮件,如何发送附件

使用如下代码可以发送附件

MailMessage mail = new MailMessage();
mail.To = ”me@mycompany.com”;
mail.From = ”you@yourcompany.com”;
mail.Subject = ”this is a test email.“;
mail.Body = ”this is my test email body.“;
MailAttachment attachment = new MailAttachment( Server.MapPath( ”mailTest.txt” ) ); //create the attachment
mail.Attachments.Add( attachment );
SmtpMail.SmtpServer = ”localhost”; 
SmtpMail.Send( mail );

使用如下代码可以在用户上传附件后发生邮件:

if  (FileUpload1.HasFile)
{
    string  toAddress  =  ”you@yourprovider.com”;
    string  fromAddress  =  you@yourprovider.com  (2);
    string  mailServer  =  ”smtp.yourprovider.com”;

    MailMessage  myMailMessage  =  new  MailMessage();

    myMailMessage.To.Add(toAddress);     myMailMessage.From  =  new  MailAddress(fromAddress);     myMailMessage.Subject  =  ”Test  Message”;

    string  fileName  =  Path.GetFileName(FileUpload1.PostedFile.FileName);     Attachment  myAttachment  =                                     new  Attachment(FileUpload1.FileContent,  fileName);     myMailMessage.Attachments.Add(myAttachment);

    SmtpClient  mySmtpClient  =  new  SmtpClient(mailServer);

    mySmtpClient.Send(myMailMessage); }

15 Jul 2009

C#中如何深度克隆一个对象?

如何深度克隆一个对象?

普通版:

        public static object CloneObject( object obj )
        {
            using ( MemoryStream memStream = new MemoryStream( ) )
            {
                BinaryFormatter binaryFormatter = new BinaryFormatter( null ,
                     new StreamingContext( StreamingContextStates.Clone ) );
                binaryFormatter.Serialize( memStream , obj );
                memStream.Seek( 0 , SeekOrigin.Begin );
                return binaryFormatter.Deserialize( memStream );
            }
        }

泛型版:

public  static  T  Clone<T>(T  obj)
{
        T  ret  =  default(T);
        if  (obj  !=  null)
        {
                XmlSerializer  cloner  =  new  XmlSerializer(typeof(T));
                MemoryStream  stream  =  new  MemoryStream();
                cloner.Serialize(stream,  obj);
                stream.Seek(0,  SeekOrigin.Begin);
                ret  =  (T)cloner.Deserialize(stream);
        }
        return  ret;
}

09 Jul 2009

nginx下typecho的rewrite

导数据到typecho的时候是在localhost的windows xp系统上用的apache,部署时用的是nginx
先是发现无法登陆按照这篇帖子内的方法配置了vhost.conf,发现可以登陆了,接着又出现了
无法编辑post的问题,具体症状见这篇帖子,甚是郁闷啊,google+baidu 找到一片描写wp的
rewrite的帖子,因typecho与wp笔记像,抱着试试看的想法,在测试站点试验了一下,嘿嘿
能用,转寄在此,备忘

location / {
        index index.html index.php;
        if (-f $request_filename/index.html){
            rewrite (.*) $1/index.html break;
        }
        if (-f $request_filename/index.php){
            rewrite (.*) $1/index.php;
        }
        if (!-f $request_filename){
            rewrite (.*) /index.php;
        }
    }

同时感谢Atlantis  :-)

19 Jul 2008

我学Linq to SQL做的demo

最近才开始学LINQ to SQL,

做了个demo,都是基本操作。

有兴趣的朋友看看。

http://download.csdn.net/source/528628

29 Mar 2008

使用dotNetZipLib轻松压缩目录/文件夹

.net1.1时代我们选SharpZipLib
.net2.0时代我们选System.IO.Compression名称空间下的东东
.net3.0时代我们选System.IO.Packaging名称空间下的东东。
今天发现CodePlex上有个好东西,另压缩如此之Easy。。。

 

  ZipFile zip = new ZipFile(directooutputFileName);
            zip.TrimVolumeFromFullyQualifiedPaths 
= true;
            zip.TempFileFolder 
= Path.GetTempPath();
            zip.Comment
                
= string.Format(A zip archives。{0}  {1},  Environment.NewLine, DateTime.Now.ToString());
            zip.AddDirectory(directory, 
string.Format(MyFolder-{0}, DateTime.Now.ToShortDateString()));
            zip.Save();

那就是

DotNet Zip Library

 

 

31 Dec 2007

2007最后一博,Url地址重写,利用HttpHander手工编译页面并按需生成静态HTML文件

很多朋友可能都讨论过ASP.NET中生成HTML的方法了,有按照模板用IO方法写文件

有在404错误页面内生成HTML的,有在Render内保存页面输出到HTML文件的。

今天我发一个配合Url重写利用HttpHander手工编译.aspx页面方法。

HTML文件的方法,可按需、“定时”的生成,以减轻数据库的访问。

 

声明:下面的文字是本文不可缺少的部分,转载请保留,谢谢!

////////////////////////////////////////////////////

作者:武眉博<活靶子.NET>

同时首发于:

    落伍者   && 博客园  

    开发者学院   && .Net男孩社区

知识点:UrlRewriteIHttpModuleIHttpHander 的编写

效果:

http://www.devedu.com/Doc/DotNet/AspNet/default.2.aspx

http://www.devedu.com/Doc/DotNet/AspNet/default.2.html

思路:

1 挂载“.aspx”的请求到自定义的Httphander内

2 配置URL重写规则

3 访问某.aspx文件时,在HttpHander内 根据配置确定是否应该生成

 接着…

 if(需要生成)

 {

  if(若已经生成html文件 )

  {

   if(文件并未过期)

   {

    则直接定向(Server.Transfer())。

   }

   else

   {

    删除HTML文件;

    重新编译.aspx(Page内数据库操作等等)

    生成HTML文件;

   }

  }

  else if(尚未生成文件)

  {

   生成Html。

  }

 }

 else

 {

  则编译.aspx文件

 }

 

另:建议阅读一下dudu的blog中关于asp.net页面编译的讨论

http://www.cnblogs.com/dudu/archive/2006/03/07/345107.html

http://www.cnblogs.com/dudu/archive/2006/03/07/344351.html

 

部分代码

C#代码
  1. public void ProcessRequest(HttpContext context)   
  2.         {   
  3.             string rawUrl = context.Request.RawUrl;   
  4.             string requestPath = context.Request.Path;   
  5.             string applicationPath = context.Request.ApplicationPath;   
  6.             Url urlItem = null;   
  7.   
  8.             //上下文中没有定义ToStaticUrlItem表示,此请求没有经过UrlRewrite,直接编译,不生成html   
  9.             //参考UrlRewriteModule.cs   
  10.             if (context.Items[“ToStaticUrlItem”] == null)   
  11.             {   
  12.                 if (!File.Exists(context.Request.PhysicalPath))   
  13.                 {   
  14.                     throw new HttpException(404, “您访问的页面没有找到。”);   
  15.                 }   
  16.   
  17.                 // asp.net 1.1 采用下面方法编译页面   
  18.                 //PageParser.GetCompiledPageInstance(requestPath, context.Request.PhysicalPath, context).ProcessRequest(context);   
  19.                 IHttpHandler hander = BuildManager.CreateInstanceFromVirtualPath(requestPath, typeof(Page)) as IHttpHandler;   
  20.                 hander.ProcessRequest(context);   
  21.   
  22.                 return;   
  23.             }   
  24.   
  25.             string filePath;   
  26.   
  27.             urlItem = (Url)context.Items[“ToStaticUrlItem”];   
  28.   
  29.             Regex regex = new Regex(   
  30.                 Globals.ApplicationPath + urlItem.LookFor,   
  31.                 RegexOptions.CultureInvariant | RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase);   
  32.   
  33.             string requestFile = regex.Replace(rawUrl, Globals.ApplicationPath + urlItem.WriteTo.Replace(”^”“&“));   
  34.   
  35.             if (requestFile.IndexOf(”?”) > 0)   
  36.             {   
  37.                 filePath = requestFile.Substring(0, requestFile.IndexOf(”?”));   
  38.             }   
  39.             else  
  40.             {   
  41.                 filePath = requestFile;   
  42.             }   
  43.   
  44.             string inputFile = context.Request.PhysicalApplicationPath + filePath;   
  45.             string path = context.Request.PhysicalApplicationPath + rawUrl.ToLower().Replace(”.aspx””.html”);   
  46.             if (applicationPath != ”/”)   
  47.             {   
  48.                 inputFile = inputFile.Replace(applicationPath + ”/”, @“\“);  
  49.                 path = path.Replace(applicationPath + ”/”, ””).Replace(”/”, @”</span>”);  
  50.             }  
  51.             else  
  52.             {  
  53.                 path = path.Replace(”/”, @”</span>”);  
  54.             }  
  55.  
  56.             if (!urlItem.EnabledToStatic)  
  57.             {  
  58.                 // asp.net 1.1 采用下面方法编译页面  
  59.                 //PageParser.GetCompiledPageInstance( filePath , inputFile , context ).ProcessRequest( context );  
  60.                 IHttpHandler hander = BuildManager.CreateInstanceFromVirtualPath(filePath, typeof(Page)) as IHttpHandler;  
  61.                 hander.ProcessRequest(context);  
  62.  
  63.                 return;  
  64.             }  
  65.  
  66.             if (!File.Exists(path))  
  67.             {  
  68.                 // asp.net 1.1 采用下面方法编译页面  
  69.                 //PageParser.GetCompiledPageInstance( filePath , inputFile , context ).ProcessRequest( context );  
  70.                 IHttpHandler hander = BuildManager.CreateInstanceFromVirtualPath(filePath, typeof(Page)) as IHttpHandler;  
  71.                 hander.ProcessRequest(context);  
  72.                 context.Response.Filter = new AspxBoy.BuildHtmlDemo.ToHtmlFilter(context.Response.Filter, path);  
  73.  
  74.                 return;  
  75.             }  
  76.  
  77.             if (urlItem.Minutes == Int32.MaxValue)  
  78.             {  
  79.                 context.Server.Transfer(rawUrl.ToLower().Replace(”.aspx”, ”.html”));  
  80.             }  
  81.             else  
  82.             {  
  83.                 FileInfo fileInfo = new FileInfo(path);  
  84.                 if (fileInfo.LastWriteTime.AddMinutes((double)urlItem.Minutes) < DateTime.Now)  
  85.                 {  
  86.                     fileInfo.Delete();  
  87.  
  88.                     // asp.net 1.1 采用下面方法编译页面  
  89.                     //PageParser.GetCompiledPageInstance( filePath , inputFile , context ).ProcessRequest( context );  
  90.                     IHttpHandler hander = BuildManager.CreateInstanceFromVirtualPath(filePath, typeof(Page)) as IHttpHandler;  
  91.                     hander.ProcessRequest(context);  
  92.                     context.Response.Filter = new AspxBoy.BuildHtmlDemo.ToHtmlFilter(context.Response.Filter, path);  
  93.                 }  
  94.                 else  
  95.                 {  
  96.                     context.Server.Transfer(rawUrl.ToLower().Replace(”.aspx”, ”.html”));   
  97.                 }   
  98.                 return;   
  99.             }   
  100.         }  

 
示例项目下载:http://www.cnblogs.com/Files/huobazi/BuildHtmlDemo.rar

23 Jul 2007

在自定义控件中实现ICallbackEventHandler接口不经过回发而实现客户端回掉

 

在自定义控件中实现ICallbackEventHandler接口不经过回发而实现客户端回掉 
Asp.Net2.0中新增了ICallbackEventHandler接口,用于指示控件可以作器的回事件的目
MSDN中的描述:

实现 ICallbackEventHandler 接口的控件的示例包括 GridViewDetailsView TreeView 控件。当回事件以实现 ICallbackEventHandler 接口的控件标时,将把事件量作参数传递 RaiseCallbackEvent 方法以事件,并且GetCallbackResult 方法返回回

ICallbackEventHandler成员有:

 

 

名称

 


 

 

 

GetCallbackResult

 

返回以控件的回事件的果。

 

 

 

RaiseCallbackEvent

 

理以控件的回事件。

 

 
如下代码实现一个不经过回发而实现客户端回掉的CheckBox



//------------------------------------------------------------------------------<br />// <copyright company="Meibo Wu www.github.com"><br />// Copyright (c) www.github.com All rights reserved.<br />// </copyright><br />//------------------------------------------------------------------------------<br />using System;<br />using System.Drawing;<br />using System.Collections;<br />using System.ComponentModel;<br />using System.Web;<br />using System.Web.UI;<br />using System.Web.UI.WebControls;<br />namespace HBZ<br />{<br />/// <summary><br />/// A Asynchronous AutoPostback Checkbox Control<br />/// </summary><br />[DefaultEvent("CheckedChanged")]<br />[ControlValueProperty("Checked")]<br />[DefaultProperty("Text")]<br />public class AsynchronousCheckBox : WebControl, INamingContainer, ICallbackEventHandler<br />{<br />#region Delegates<br />/// <summary><br />/// The delegate for the checked changed event<br />/// </summary><br />///<br /><span name="sender" class="mceItemParam"></span></param><br />///<br /><span name="e" class="mceItemParam"></span></param><br />public delegate void CheckedChangedEventHander(object sender, CheckChangedEventArgs e);<br />#endregion<br />#region Events<br />private static readonly object eventCheckedChanged;<br />/// <summary><br />/// The checked changed event.<br />/// </summary><br />public event CheckedChangedEventHander CheckedChanged<br />{<br />add<br />{<br />Events.AddHandler(eventCheckedChanged, value);<br />}<br />remove<br />{<br />Events.RemoveHandler(eventCheckedChanged, value);<br />}<br />}<br />#endregion<br />#region Constructors<br />/// <summary><br />/// Static Constructor<br />/// </summary><br />static AsynchronousCheckBox()<br />{<br />eventCheckedChanged = new object();<br />}<br />/// <summary><br />/// Constructor<br />/// </summary><br />public AsynchronousCheckBox()<br />: base(HtmlTextWriterTag.Input)<br />{<br />}<br />#endregion<br />#region Properties<br />/// <summary><br />/// Gets or sets a value indicating whether the Lable Text<br />/// </summary><br />[Description("Gets or sets a value indicating whether the Lable Text")]<br />public virtual string Text<br />{<br />get<br />{<br />return (string)ViewState["Text"];<br />}<br />set<br />{<br />this.ViewState["Text"] = value;<br />}<br />}<br />/// <summary><br />/// Gets or sets a value indicating whether the 'Client CallBack Script Name'<br />/// </summary><br />[Description("Gets or sets a value indicating whether the 'Client CallBack Script function Name'")]<br />public string ClientCallBackScript<br />{<br />get<br />{<br />object o = ViewState["ClientCallBackScript"];<br />return o == null ? "null" : o.ToString();<br />}<br />set<br />{<br />ViewState["ClientCallBackScript"] = value;<br />}<br />}<br />/// <summary><br />/// Gets or sets a value indicating whether the checkbox 's checked<br />/// </summary><br />[Description("Gets or sets a value indicating whether the checkbox 's checked")]<br />public bool Checked<br />{<br />get<br />{<br />object o = ViewState["Checked"];<br />return o == null ? false : (bool)o;<br />}<br />set<br />{<br />ViewState["Checked"] = value;<br />}<br />}<br />/// <summary><br />/// Gets or sets a value indicating whether the Text 's cssClass<br />/// </summary><br />[Description("Gets or sets a value indicating whether the Text 's cssClass")]<br />public string TextCss<br />{<br />get<br />{<br />return (string)ViewState["TextCss"];<br />}<br />set<br />{<br />ViewState["TextCss"] = value;<br />}<br />}<br />/// <summary><br />/// Gets or sets a value indicating whether the Label 's position<br />/// </summary><br />public virtual TextAlign TextAlign<br />{<br />get<br />{<br />object o = ViewState["TextAlign"];<br />if (o != null)<br />{<br />return (TextAlign)o;<br />}<br />return TextAlign.Right;<br />}<br />set<br />{<br />if ((value <textalign.left) || (value > TextAlign.Right))<br />{<br />throw new ArgumentOutOfRangeException("value");<br />}<br />ViewState["TextAlign"] = value;<br />}<br />}<br />#endregion<br />#region Render Meghods<br />/// <summary><br />///<br />/// </summary><br />///<br /><span name="writer" class="mceItemParam"></span></param><br />protected override void Render(HtmlTextWriter writer)<br />{<br />if (TextAlign == TextAlign.Left)<br />{<br />RenderLabel(writer);<br />base.Render(writer);<br />}<br />else<br />{<br />base.Render(writer);<br />RenderLabel(writer);<br />}<br />}<br />/// <summary><br />/// Render Label<br />/// </summary><br />///<br /><span name="writer" class="mceItemParam"></span></param><br />private void RenderLabel(HtmlTextWriter writer)<br />{<br />if (string.IsNullOrEmpty(Text))<br />{<br />return;<br />}<br />writer.Write("<label");<br />writer.WriteAttribute("for", ClientID);<br />if (!string.IsNullOrEmpty(TextCss))<br />{<br />writer.WriteAttribute("class", TextCss);<br />}<br />writer.Write(">");<br />writer.Write(Text);<br />writer.WriteEndTag("label");<br />}<br />/// <summary><br />/// Override the AddAttributesToRender method<br />/// </summary><br />///<br /><span name="writer" class="mceItemParam"></span></param><br />protected override void AddAttributesToRender(HtmlTextWriter writer)<br />{<br />if (base.Page == null)<br />{<br />base.Page.VerifyRenderingInServerForm(this);<br />}<br />string callbackReference<br />= Page.ClientScript.GetCallbackEventReference(this, "this.checked", ClientCallBackScript, null);<br />writer.AddAttribute(HtmlTextWriterAttribute.Onclick, callbackReference);<br />writer.AddAttribute(HtmlTextWriterAttribute.Type, "checkbox");<br />if (Checked)<br />{<br />writer.AddAttribute(HtmlTextWriterAttribute.Checked, "checked");<br />}<br />if (!Enabled)<br />{<br />writer.AddAttribute(HtmlTextWriterAttribute.Disabled, "disabled");<br />}<br />if (!string.IsNullOrEmpty(ToolTip))<br />{<br />writer.AddAttribute(HtmlTextWriterAttribute.Title, ToolTip);<br />}<br />base.AddAttributesToRender(writer);<br />}<br />#endregion<br />#region On Checked Changed<br />/// <summary><br />/// Invoke the check changed event.<br />/// </summary><br />///<br /><span name="sender" class="mceItemParam"></span></param><br />///<br /><span name="e" class="mceItemParam"></span></param><br />protected virtual void OnCheckedChanged(object sender, CheckChangedEventArgs e)<br />{<br />CheckedChangedEventHander hander = Events[eventCheckedChanged] as CheckedChangedEventHander;<br />if (hander != null)<br />{<br />Checked = e.Checked;<br />hander(this, e);<br />}<br />}<br />#endregion<br />#region ICallbackEventHandler Members<br />/// <summary><br />/// Get the result of a client side callback.<br />/// </summary><br />/// <returns>The callback result string.</returns><br />public string GetCallbackResult()<br />{<br />return Checked.ToString();<br />}<br />/// <summary><br />/// Raise the client callback event<br />/// </summary><br />///<br /><span name="eventArgument" class="mceItemParam"></span>The event arguments.</param><br />public void RaiseCallbackEvent(string eventArgument)<br />{<br />bool isChecked = Boolean.Parse(eventArgument);<br />CheckChangedEventArgs args = new CheckChangedEventArgs(isChecked);<br />OnCheckedChanged(this, args);<br />}<br />#endregion<br />}<br />}<br />//------------------------------------------------------------------------------<br />// <copyright company="Meibo Wu www.github.com"><br />// Copyright (c) www.github.com All rights reserved.<br />// </copyright><br />//------------------------------------------------------------------------------<br />using System;<br />using System.Drawing;<br />using System.Collections;<br />using System.ComponentModel;<br />using System.Web;<br />using System.Web.UI;<br />using System.Web.UI.WebControls;<br />namespace HBZ<br />{<br />/// <summary><br />///<br />/// </summary><br />public class CheckChangedEventArgs:EventArgs<br />{<br />/// <summary><br />///<br />/// </summary><br />///<br /><span name="_isChecked" class="mceItemParam"></span></param><br />public CheckChangedEventArgs(bool _isChecked)<br />{<br />isChecked = _isChecked;<br />}<br />private bool isChecked = false;<br />/// <summary><br />///<br />/// </summary><br />public bool Checked<br />{<br />get<br />{<br />return isChecked;<br />}<br />}<br />}<br />}<br />
         http://www.github.com/private/5504/default.aspx

08 Apr 2006

两个DropDownList在Repeater、DataList、DataGrid内的连动和冒泡事件(BubbleEvent)

两个DropDownList在Repeater、DataList、DataGrid内的连动和冒泡事件(BubbleEvent)
        问题:
http://community.csdn.net/Expert/topic/4670/4670056.xml?temp=3.944033E-02
        刚看第一眼觉得在第一个DDL的SelectedIndexChanged事件内绑定第二个DDL就ok了,页面上写或者ItemDataBound内写事件挂接代码都可以。打开VS写测试却发现有点障碍哦,
在SelectedIndexChanged内要知道去绑定哪个行哪个列的DDL要费些周折
只有从DDL一级一级的向上找Parent最后找到DataGridItem,再利用其ItemIndex定位到行然后FindControl到要绑定的DDL,最终可以实现,好像比较累哦。
        随又想到DataGrid的ItemCommand事件,但发现WebControl内只有Button ImageButton LinkButtonCommandName属性和 CommandArgument属性,并可以将事件上浮(冒泡).DropDownList先天不足!真是郁闷~~~~~ 能不能自己改造呢?动手试试就知道了。

<%@ Page Language="C#" Debug="true" %>
<%@ Import Namespace="System.Data" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="gb2312" lang="gb2312">
<head>
<title> ItemDataBoundGetColumnName </title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<meta name="title" content="" />
<meta name="author" content="活靶子,Huobazi,www.AspxBoy.com" />
<meta name="subject" content="" />
<meta name="language" content="gb2312" />
<meta name="keywords" content="" />
<meta name="Copyright" content="www.AspxBoy.com" />
<meta name="robots" content="all" />

<script language="c#" runat="server">
void BindGrid()
{
        DataTable dt = new DataTable();
        DataRow dr;
        dt.Columns.Add(new DataColumn("IntegerValue", typeof(Int32)));
        dt.Columns.Add(new DataColumn("StringValue", typeof(string)));
        dt.Columns.Add(new DataColumn("DateTimeValue", typeof(DateTime)));
        dt.Columns.Add(new DataColumn("BoolValue", typeof(bool)));
        dt.Columns.Add(new DataColumn("CurrencyValue", typeof(double)));
        for (int i = 0; i < 36; i++) {
            dr = dt.NewRow();
            dr[0] = i;
            dr[1] = "项 " + i.ToString();
            dr[2] = DateTime.Now;
            dr[3] = (i % 2 != 0) ? true : false;
            dr[4] = 1.23 * (i+1);
            dt.Rows.Add(dr);
        }
  dg.DataSource= dt;
  dg.DataBind();
}
void Page_Load(object o, EventArgs e)
{
     dg.PagerStyle.Mode = PagerMode.NumericPages;
     if(!IsPostBack)
     {
        BindGrid();
     }
}
 
void btnClick(object o , EventArgs e)
{
     Response.Write("页面回发,但是不执行ItemDataBound");
}
 
void PageChange(object o , DataGridPageChangedEventArgs e)
{
     dg.CurrentPageIndex = e.NewPageIndex;
     BindGrid();
}
void ItemDataBound(object o , DataGridItemEventArgs e)
{
     if(e.Item.ItemIndex > -1 )//必须
     {
          DataRowView drv = (DataRowView)e.Item.DataItem;
          for (int i=0; i<drv.Row.Table.Columns.Count ; i++)
          { 
            Response.Write(drv.Row.Table.Columns[i].ColumnName + "&nbsp;&nbsp;");
          }
     }
}
</script>

</head>
<body>
<form runat="server">
  <ASP:DataGrid id="dg" runat="server"      
   HeaderStyle-BackColor="#aaaadd"
   AutoGenerateColumns="true"
   AllowPaging="true"
   PageSize="6"
    OnItemDataBound="ItemDataBound"
    OnPageIndexChanged="PageChange"
  >
  </asp:DataGrid>
  </br>
   <asp:button id="btn" runat="server" onclick="btnClick" Text="我是按钮,按我一下"></asp:button>
在AutoGenerateColumns="false"使用绑定列或者模板列的时候只需要使用 

<font color="blut">YourDataGrid.Columns[编号].HeaderText</font> 去获取
  
</form>
</body>
</html>

http://www.aspxboy.com/Files/71/66/284.Aspx

 

24 Mar 2006

关于Data Access Blok (SqlHelper.cs)使用时出现

关于Data Access Blok (SqlHelper.cs)使用时出现"对象必须实现 IConvertible/Object must implement IConvertible."异常

在使用低版本 Data Access Blok  时,出现如下异常
“/”应用程序中的服务器错误。
--------------------------------------------------------------------------------

 

对象必须实现 IConvertible。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

 

异常详细信息: System.InvalidCastException: 对象必须实现 IConvertible。

 

源错误:

 
行 360:   
行 361:   //finally, execute the command.
行 362:   int retval = cmd.ExecuteNonQuery();
行 363:   
行 364:   // detach the SqlParameters from the command object, so they can be used again.

 

参考http://weblogs.asp.net/ssmith/archive/2003/08/19/24524.aspx#92222
做修改
the simple fix is to change line 93 to read:
commandParameters[i].Value = ((SqlParameter)parameterValues[i]).Value;

 

instead of:
commandParameters[i].Value = parameterValues[i];

 

正常工作。