`

SP.NET开发人员经常使用的三十三种代码

 
阅读更多
几年前,一篇《ASP.NET开发人员经常使用的三十三种代码》非常流行,它总结了一些经常在ASP.NET开发中使用到的代码,直接可以拿来使用。今天重读这篇文章,有感而发,善于总结也是进步,于是我也从我的项目中总结一些常用的代码片段,分享给各位园友。 1. 打开新的窗口并传送参数:  传送参数:response.write("<script>window.open(’*.aspx?id="+this.DropDownList1.SelectIndex+"&id1="+...+"’)</script>")  接收参数:string a = Request.QueryString("id");string b = Request.QueryString("id1");  2.为按钮添加对话框Button1.Attributes.Add("onclick","return confirm(’确认?’)");button.attributes.add("onclick","if(confirm(’are you sure...?’)){return true;}else{return false;}")  3.删除表格选定记录int intEmpID = (int)MyDataGrid.DataKeys[e.Item.ItemIndex];string deleteCmd = "DELETE from Employee where emp_id = " + intEmpID.ToString()  4.删除表格记录警告private void DataGrid_ItemCreated(Object sender,DataGridItemEventArgs e){ switch(e.Item.ItemType) {  case ListItemType.Item :  case ListItemType.AlternatingItem :  case ListItemType.EditItem:   TableCell myTableCell;   myTableCell = e.Item.Cells[14];   LinkButton myDeleteButton ;   myDeleteButton = (LinkButton)myTableCell.Controls[0];   myDeleteButton.Attributes.Add("onclick","return confirm(’您是否确定要删除这条信息’);");   break;  default:   break; }}  5.点击表格行链接另一页private void grdCustomer_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e){ //点击表格打开 if (e.Item.ItemType == ListItemType.Item    e.Item.ItemType == ListItemType.AlternatingItem)  e.Item.Attributes.Add("onclick","window.open(’Default.aspx?id=" + e.Item.Cells[0].Text + "’);");}  双击表格连接到另一页  在itemDataBind事件中if(e.Item.ItemType == ListItemType.Item    e.Item.ItemType == ListItemType.AlternatingItem){ string OrderItemID =e.item.cells[1].Text; ... e.item.Attributes.Add("ondblclick", "location.href=’../ShippedGrid.aspx?id=" + OrderItemID + "’");}  双击表格打开新一页if(e.Item.ItemType == ListItemType.Item    e.Item.ItemType == ListItemType.AlternatingItem){ string OrderItemID =e.item.cells[1].Text; ... e.item.Attributes.Add("ondblclick", "open(’../ShippedGrid.aspx?id=" + OrderItemID + "’)");}  ★特别注意:【?id=】 处不能为 【?id =】  6.表格超连接列传递参数 <asp:HyperLinkColumn Target="_blank" headertext="ID号" DataTextField="id" NavigateUrl="aaa.aspx?id=’ <%# DataBinder.Eval(Container.DataItem, "数据字段1")%>’ & name=’<%# DataBinder.Eval(Container.DataItem, "数据字段2")%>’ />  7.表格点击改变颜色if (e.Item.ItemType == ListItemType.Item   e.Item.ItemType == ListItemType.AlternatingItem){ e.Item.Attributes.Add("onclick","this.style.backgroundColor=’#99cc00’;    this.style.color=’buttontext’;this.style.cursor=’default’;");}  写在DataGrid的_ItemDataBound里if (e.Item.ItemType == ListItemType.Item   e.Item.ItemType == ListItemType.AlternatingItem){e.Item.Attributes.Add("onmouseover","this.style.backgroundColor=’#99cc00’;   this.style.color=’buttontext’;this.style.cursor=’default’;");e.Item.Attributes.Add("onmouseout","this.style.backgroundColor=’’;this.style.color=’’;");}   8.关于日期格式  日期格式设定DataFormatString="{0:yyyy-MM-dd}"  我觉得应该在itembound事件中e.items.cell["你的列"].text=DateTime.Parse(e.items.cell["你的列"].text.ToString("yyyy-MM-dd"))  9.获取错误信息并到指定页面  不要使用Response.Redirect,而应该使用Server.Transfer  e.g// in global.asaxprotected void Application_Error(Object sender, EventArgs e) {if (Server.GetLastError() is HttpUnhandledException)Server.Transfer("MyErrorPage.aspx");//其余的非HttpUnhandledException异常交给ASP.NET自己处理就okay了 :)}  Redirect会导致post-back的产生从而丢失了错误信息,所以页面导向应该直接在服务器端执行,这样就可以在错误处理页面得到出错信息并进行相应的处理  10.清空CookieCookie.Expires=[DateTime];Response.Cookies("UserName").Expires = 0  11.自定义异常处理//自定义异常处理类 using System;using System.Diagnostics;namespace MyAppException{ /// <summary> /// 从系统异常类ApplicationException继承的应用程序异常处理类。 /// 自动将异常内容记录到Windows NT/2000的应用程序日志 /// </summary> public class AppException:System.ApplicationException {  public AppException()  {   if (ApplicationConfiguration.EventLogEnabled)LogEvent("出现一个未知错误。");  } public AppException(string message) {  LogEvent(message); } public AppException(string message,Exception innerException) {  LogEvent(message);  if (innerException != null)  {   LogEvent(innerException.Message);  } } //日志记录类 using System; using System.Configuration; using System.Diagnostics; using System.IO; using System.Text; using System.Threading; namespace MyEventLog {  /// <summary>  /// 事件日志记录类,提供事件日志记录支持   /// <remarks>  /// 定义了4个日志记录方法 (error, warning, info, trace)   /// </remarks>  /// </summary>  public class ApplicationLog  {   /// <summary>   /// 将错误信息记录到Win2000/NT事件日志中   /// <param name="message">需要记录的文本信息</param>   /// </summary>   public static void WriteError(String message)   {    WriteLog(TraceLevel.Error, message);   }   /// <summary>   /// 将警告信息记录到Win2000/NT事件日志中   /// <param name="message">需要记录的文本信息</param>   /// </summary>   public static void WriteWarning(String message)   {    WriteLog(TraceLevel.Warning, message);     }   /// <summary>   /// 将提示信息记录到Win2000/NT事件日志中   /// <param name="message">需要记录的文本信息</param>   /// </summary>   public static void WriteInfo(String message)   {    WriteLog(TraceLevel.Info, message);   }   /// <summary>   /// 将跟踪信息记录到Win2000/NT事件日志中   /// <param name="message">需要记录的文本信息</param>   /// </summary>   public static void WriteTrace(String message)   {    WriteLog(TraceLevel.Verbose, message);   }   /// <summary>   /// 格式化记录到事件日志的文本信息格式   /// <param name="ex">需要格式化的异常对象</param>   /// <param name="catchInfo">异常信息标题字符串.</param>   /// <retvalue>   /// <para>格式后的异常信息字符串,包括异常内容和跟踪堆栈.</para>   /// </retvalue>   /// </summary>   public static String FormatException(Exception ex, String catchInfo)   {    StringBuilder strBuilder = new StringBuilder();    if (catchInfo != String.Empty)    {     strBuilder.Append(catchInfo).Append("\r\n");    }    strBuilder.Append(ex.Message).Append("\r\n").Append(ex.StackTrace);    return strBuilder.ToString();   }   /// <summary>   /// 实际事件日志写入方法   /// <param name="level">要记录信息的级别(error,warning,info,trace).</param>   /// <param name="messageText">要记录的文本.</param>   /// </summary>   private static void WriteLog(TraceLevel level, String messageText)   {    try    {      EventLogEntryType LogEntryType;     switch (level)     {      case TraceLevel.Error:       LogEntryType = EventLogEntryType.Error;       break;      case TraceLevel.Warning:       LogEntryType = EventLogEntryType.Warning;       break;      case TraceLevel.Info:       LogEntryType = EventLogEntryType.Information;       break;      case TraceLevel.Verbose:       LogEntryType = EventLogEntryType.SuccessAudit;       break;      default:       LogEntryType = EventLogEntryType.SuccessAudit;       break;     }     EventLog eventLog = new EventLog("Application", ApplicationConfiguration.EventLogMachineName, ApplicationConfiguration.EventLogSourceName );     //写入事件日志     eventLog.WriteEntry(messageText, LogEntryType);    }   catch {} //忽略任何异常  }  } //class ApplicationLog}   12.Panel 横向滚动,纵向自动扩展 <asp:panel ></asp:panel>  13.回车转换成Tab<script language="javascript" for="document" event="onkeydown"> if(event.keyCode==13 && event.srcElement.type!=’button’ && event.srcElement.type!=’submit’ &&     event.srcElement.type!=’reset’ && event.srcElement.type!=’’&& event.srcElement.type!=’textarea’);    event.keyCode=9;</script>onkeydown="if(event.keyCode==13) event.keyCode=9"   14.DataGrid超级连接列DataNavigateUrlField="字段名" DataNavigateUrlFormatString="http://xx/inc/delete.aspx?ID={0}"  15.DataGrid行随鼠标变色private void DGzf_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e){ if (e.Item.ItemType!=ListItemType.Header) {  e.Item.Attributes.Add( "onmouseout","this.style.backgroundColor=\""+e.Item.Style["BACKGROUND-COLOR"]+"\"");  e.Item.Attributes.Add( "onmouseover","this.style.backgroundColor=\""+ "#EFF3F7"+"\""); }}   16.模板列<ASP:TEMPLATECOLUMN visible="False" sortexpression="demo" headertext="ID"><ITEMTEMPLATE><ASP:LABEL text=’<%# DataBinder.Eval(Container.DataItem, "ArticleID")%>’ runat="server" width="80%" id="lblColumn" /></ITEMTEMPLATE></ASP:TEMPLATECOLUMN><ASP:TEMPLATECOLUMN headertext="选中"><HEADERSTYLE wrap="False" horizontalalign="Center"></HEADERSTYLE><ITEMTEMPLATE><ASP:CHECKBOX id="chkExport" runat="server" /></ITEMTEMPLATE><EDITITEMTEMPLATE><ASP:CHECKBOX id="chkExportON" runat="server" enabled="true" /></EDITITEMTEMPLATE></ASP:TEMPLATECOLUMN>  后台代码protected void CheckAll_CheckedChanged(object sender, System.EventArgs e){ //改变列的选定,实现全选或全不选。 CheckBox chkExport ; if( CheckAll.Checked) {  foreach(DataGridItem oDataGridItem in MyDataGrid.Items)  {   chkExport = (CheckBox)oDataGridItem.FindControl("chkExport");   chkExport.Checked = true;  } } else {  foreach(DataGridItem oDataGridItem in MyDataGrid.Items)  {   chkExport = (CheckBox)oDataGridItem.FindControl("chkExport");   chkExport.Checked = false;  } }}  17.数字格式化  【<%#Container.DataItem("price")%>的结果是500.0000,怎样格式化为500.00?】<%#Container.DataItem("price","{0:¥#,##0.00}")%>int i=123456;string s=i.ToString("###,###.00");   18.日期格式化  【aspx页面内:<%# DataBinder.Eval(Container.DataItem,"Company_Ureg_Date")%>  显示为: 2004-8-11 19:44:28  我只想要:2004-8-11 】<%# DataBinder.Eval(Container.DataItem,"Company_Ureg_Date","{0:yyyy-M-d}")%>  应该如何改?  【格式化日期】  取出来,一般是object((DateTime)objectFromDB).ToString("yyyy-MM-dd");  【日期的验证表达式】  A.以下正确的输入格式: [2004-2-29], [2004-02-29 10:29:39 pm], [2004/12/31]^((\d{2}(([02468][048]) ([13579][26]))[\-\/\s]?((((0?[13578]) (1[02]))[\-\/\s]?((0?[1-9]) ([1-2][0-9]) (3[01]))) (((0?[469]) (11))[\-\/\s]?((0?[1-9]) ([1-2][0-9]) (30))) (0?2[\-\/\s]?((0?[1-9]) ([1-2][0-9]))))) (\d{2}(([02468][1235679]) ([13579][01345789]))[\-\/\s]?((((0?[13578]) (1[02]))[\-\/\s]?((0?[1-9]) ([1-2][0-9]) (3[01]))) (((0?[469]) (11))[\-\/\s]?((0?[1-9]) ([1-2][0-9]) (30))) (0?2[\-\/\s]?((0?[1-9]) (1[0-9]) (2[0-8]))))))(\s(((0?[1-9]) (1[0-2]))\:([0-5][0-9])((\s) (\:([0-5][0-9])\s))([AM PM am pm]{2,2})))?$  B.以下正确的输入格式:[0001-12-31], [9999 09 30], [2002/03/03]^\d{4}[\-\/\s]?((((0[13578]) (1[02]))[\-\/\s]?(([0-2][0-9]) (3[01]))) (((0[469]) (11))[\-\/\s]?(([0-2][0-9]) (30))) (02[\-\/\s]?[0-2][0-9]))$  【大小写转换】HttpUtility.HtmlEncode(string);HttpUtility.HtmlDecode(string)  19.如何设定全局变量  Global.asax中  Application_Start()事件中  添加Application[属性名] = xxx;  就是你的全局变量  20.怎样作到HyperLinkColumn生成的连接后,点击连接,打开新窗口?  HyperLinkColumn有个属性Target,将器值设置成"_blank"即可.(Target="_blank")  【ASPNETMENU】点击菜单项弹出新窗口  在你的menuData.xml文件的菜单项中加入URLTarget="_blank",如:<?xml version="1.0" encoding="GB2312"?><MenuData ImagesBaseURL="images/"> <MenuGroup><MenuItem Label="内参信息" URL="Infomation.aspx" ><MenuGroup ID="BBC"><MenuItem Label="公告信息" URL="Infomation.aspx" URLTarget="_blank" LeftIcon="file.gif"/><MenuItem Label="编制信息简报" URL="NewInfo.aspx" LeftIcon="file.gif" />......  最好将你的aspnetmenu升级到1.2版  21.读取DataGrid控件TextBox值foreach(DataGrid dgi in yourDataGrid.Items){ TextBox tb = (TextBox)dgi.FindControl("yourTextBoxId"); tb.Text....}  23.在DataGrid中有3个模板列包含Textbox分别为 DG_ShuLiang (数量) DG_DanJian(单价) DG_JinE(金额)分别在5.6.7列,要求在录入数量及单价的时候自动算出金额即:数量*单价=金额还要求录入时限制为 数值型.我如何用客户端脚本实现这个功能?  〖思归〗<asp:TemplateColumn HeaderText="数量"> <ItemTemplate><asp:TextBox id="ShuLiang" runat=’server’ Text=’<%# DataBinder.Eval(Container.DataItem,"DG_ShuLiang")%>’ onkeyup="javascript:DoCal()"/><asp:RegularExpressionValidator id="revS" runat="server" ControlToValidate="ShuLiang" ErrorMessage="must be integer" ValidationExpression="^\d+$" /></ItemTemplate></asp:TemplateColumn><asp:TemplateColumn HeaderText="单价"> <ItemTemplate><asp:TextBox id="DanJian" runat=’server’ Text=’<%# DataBinder.Eval(Container.DataItem,"DG_DanJian")%>’ onkeyup="javascript:DoCal()"/><asp:RegularExpressionValidator id="revS2" runat="server" ControlToValidate="DanJian" ErrorMessage="must be numeric" ValidationExpression="^\d+(\.\d*)?$" /></ItemTemplate></asp:TemplateColumn><asp:TemplateColumn HeaderText="金额"> <ItemTemplate><asp:TextBox id="JinE" runat=’server’ Text=’<%# DataBinder.Eval(Container.DataItem,"DG_JinE")%>’ /></ItemTemplate></asp:TemplateColumn><script language="javascript">function DoCal(){ var e = event.srcElement; var row = e.parentNode.parentNode; var txts = row.all.tags("INPUT"); if (!txts.length    txts.length < 3)  return; var q = txts[txts.length-3].value; var p = txts[txts.length-2].value; if (isNaN(q)    isNaN(p))  return; q = parseInt(q); p = parseFloat(p); txts[txts.length-1].value = (q * p).toFixed(2);}</script>  24.datagrid选定比较底下的行时,为什么总是刷新一下,然后就滚动到了最上面,刚才选定的行因屏幕的关系就看不到了。page_load page.smartNavigation=true  25.在Datagrid中修改数据,当点击编辑键时,数据出现在文本框中,怎么控制文本框的大小 ?private void DataGrid1_ItemDataBound(obj sender,DataGridItemEventArgs e){ for(int i=0;i<e.Item.Cells.Count-1;i++)  if(e.Item.ItemType==ListItemType.EditType)  {   e.Item.Cells[i].Attributes.Add("Width", "80px")  } }  26.对话框private static string ScriptBegin = "<script language=\"JavaScript\">";private static string ScriptEnd = "</script>";public static void ConfirmMessageBox(string PageTarget,string Content){ string ConfirmContent="var retValue=window.confirm(’"+Content+"’);"+"if(retValue){window.location=’"+PageTarget+"’;}"; ConfirmContent=ScriptBegin + ConfirmContent + ScriptEnd; Page ParameterPage = (Page)System.Web.HttpContext.Current.Handler; ParameterPage.RegisterStartupScript("confirm",ConfirmContent); //Response.Write(strScript);}  27. 将时间格式化:string aa=DateTime.Now.ToString("yyyy年MM月dd日");  1.1 取当前年月日时分秒currentTime=System.DateTime.Now;  1.2 取当前年int 年= DateTime.Now.Year;  1.3 取当前月int 月= DateTime.Now.Month;  1.4 取当前日int 日= DateTime.Now.Day;  1.5 取当前时int 时= DateTime.Now.Hour;  1.6 取当前分int 分= DateTime.Now.Minute;  1.7 取当前秒int 秒= DateTime.Now.Second;  1.8 取当前毫秒int 毫秒= DateTime.Now.Millisecond;  28.自定义分页代码:  先定义变量 :public static int pageCount; //总页面数 public static int curPageIndex=1; //当前页面  下一页:if(DataGrid1.CurrentPageIndex < (DataGrid1.PageCount - 1)) {  DataGrid1.CurrentPageIndex += 1;  curPageIndex+=1; }bind(); // DataGrid1数据绑定函数  上一页:if(DataGrid1.CurrentPageIndex >0) {  DataGrid1.CurrentPageIndex += 1;  curPageIndex-=1; }bind(); // DataGrid1数据绑定函数  直接页面跳转:int a=int.Parse(JumpPage.Value.Trim());//JumpPage.Value.Trim()为跳转值if(a<DataGrid1.PageCount) {  this.DataGrid1.CurrentPageIndex=a; }bind();  29.DataGrid使用:  添加删除确认:private void DataGrid1_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e) {  foreach(DataGridItem di in this.DataGrid1.Items)  {   if(di.ItemType==ListItemType.Item  di.ItemType==ListItemType.AlternatingItem)   {    ((LinkButton)di.Cells[8].Controls[0]).Attributes.Add("onclick","return confirm(’确认删除此项吗?’);");   }  } }  样式交替:ListItemType itemType = e.Item.ItemType;if (itemType == ListItemType.Item ) {  e.Item.Attributes["onmouseout"] = "javascript:this.style.backgroundColor=’#FFFFFF’;";  e.Item.Attributes["onmouseover"] = "javascript:this.style.backgroundColor=’#d9ece1’;cursor=’hand’;" ; } else if( itemType == ListItemType.AlternatingItem) {  e.Item.Attributes["onmouseout"] = "javascript:this.style.backgroundColor=’#a0d7c4’;";  e.Item.Attributes["onmouseover"] = "javascript:this.style.backgroundColor=’#d9ece1’;cursor=’hand’;" ; }  添加一个编号列:DataTable dt= c.ExecuteRtnTableForAccess(sqltxt); //执行sql返回的DataTable DataColumn dc=dt.Columns.Add("number",System.Type.GetType("System.String"));for(int i=0;i<dt.Rows.Count;i++) {  dt.Rows[i]["number"]=(i+1).ToString(); }DataGrid1.DataSource=dt; DataGrid1.DataBind();  DataGrid1中添加一个CheckBox,页面中添加一个全选框private void CheckBox2_CheckedChanged(object sender, System.EventArgs e) {  foreach(DataGridItem thisitem in DataGrid1.Items)  {   ((CheckBox)thisitem.Cells[0].Controls[1]).Checked=CheckBox2.Checked;  } }  将当前页面中DataGrid1显示的数据全部删除foreach(DataGridItem thisitem in DataGrid1.Items) {  if(((CheckBox)thisitem.Cells[0].Controls[1]).Checked)  {   string strloginid= DataGrid1.DataKeys[thisitem.ItemIndex].ToString();   Del (strloginid); //删除函数  } }  30.当文件在不同目录下,需要获取数据库连接字符串(如果连接字符串放在Web.config,然后在Global.asax中初始化)  在Application_Start中添加以下代码:Application["ConnStr"]=this.Context.Request.PhysicalApplicationPath+ConfigurationSettings.   AppSettings["ConnStr"].ToString();  31. 变量.ToString()  字符型转换 转为字符串12345.ToString("n"); //生成 12,345.00 12345.ToString("C"); //生成 ¥12,345.00 12345.ToString("e"); //生成 1.234500e+004 12345.ToString("f4"); //生成 12345.0000 12345.ToString("x"); //生成 3039 (16进制) 12345.ToString("p"); //生成 1,234,500.00%  32、变量.Substring(参数1,参数2);  截取字串的一部分,参数1为左起始位数,参数2为截取几位。 如:string s1 = str.Substring(0,2);  33.在自己的网站上登陆其他网站:(如果你的页面是通过嵌套方式的话,因为一个页面只能有一个FORM,这时可以导向另外一个页面再提交登陆信息)<SCRIPT language="javascript"> <!--  function gook(pws)  {   frm.submit();  } //--></SCRIPT> <body leftMargin="0" topMargin="0" onload="javascript:gook()" marginwidth="0" marginheight="0"> <form name="frm" action=" http://220.194.55.68:6080/login.php?retid=7259 " method="post"> <tr> <td><input id="f_user" type="hidden" size="1" name="f_user" runat="server"><input id="f_domain" type="hidden" size="1" name="f_domain" runat="server"><input class="box" id="f_pass" type="hidden" size="1" name="pwshow" runat="server"><INPUT id="lng" type="hidden" maxLength="20" size="1" value="5" name="lng"><INPUT id="tem" type="hidden" size="1" value="2" name="tem"></td></tr></form>  文本框的名称必须是你要登陆的网页上的名称,如果源码不行可以用vsniffer 看看。  下面是获取用户输入的登陆信息的代码:string name; name=Request.QueryString["EmailName"];try {  int a=name.IndexOf("@",0,name.Length);  f_user.Value=name.Substring(0,a);  f_domain.Value=name.Substring(a+1,name.Length-(a+1));  f_pass.Value=Request.QueryString["Psw"]; }catch {  Script.Alert("错误的邮箱!");  Server.Transfer("index.aspx"); } 写文本文件TextWriter tw = new StreamWriter("date.txt");tw.WriteLine(DateTime.Now);tw.Close();读文本文件写法一Textreader tr = new StreamReader("date.txt");Console.WriteLine(tr.ReadLine());tr.Close();写法二Textreader tr = new StreamReader("date.txt");Console.WriteLine(tr.ReadLine()); tr.Close(); 其实,上面的写文本文件和读文本文件,都有一个bug,当程序中有代码改变当前目录时,date.txt的目录就是这个被改变的目录,而不是我们期待的当前应用程序所有的目录。所以,推荐的写法是这样的string file = "Cnblogs.txt";string cnblogs = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, file);if (File.Exists(cnblogs)){ using (StreamReader reader = File.OpenText(cnblogs)) { rtfCnblogs.Text = reader.ReadToEnd(); }}加入了完整的文件名路径,这样才是正确的读写文件的方法。如果是ASP.NET应用程序,可以用Server.MapPath代替,或是HttpContext.Current.Request.PhysicalApplicationPath。 跨线程访问控件delegate void dSetText(string text);private void SetText(string text) { if (InvokeRequired) { dSetText d = new dSetText(SetText); this.Invoke(d); } else { this.textBox1.Text = text; } } 调用Code Smith模板CodeTemplateCompiler compiler = new CodeTemplateCompiler(@"c:\test.cst");compiler.Compile(); if (compiler.Errors.Count == 0){CodeTemplate t = compiler.CreateInstance();this.txtSql.Text = t.RenderToString();} compiler.Cleanup();compiler = null;如果是x64的系统,请设置Target为x86(need to set the program to compile as X86)。 设置程序集运行时版本当旧的程序是以.NET 2.0编译的,又无法升级到.NET 4.0,而有部分组件是以.NET编译的,在运行时,会抛出混合程序集的异常,需要修改配置文件,请参考这个片段这个需求源于,Code Smith 5.0是以.NET 2.0编译的。在我的代码生成可器中,它用来反射读取程序集信息,生成代码,而这个被读取的程序集的Target是.NET 4.0,这时,你需要这个技巧来解决运行时的问题。另一个场景是ILMerge,用于合并.NET程序集的工具,只有.NET 2.0的版本,要可以合并.NET 4.0的程序集,也需要运用这个技巧(ILMerge config file for executing within the CLR v4.0 runtime)。 枚举类型的反射调用在有些场景,我们需要把反射的参数值传到对象的方法中,而参数值是enum类型,这实现起来并不简单。请参考codeproject中这的篇文章《Setting Enum's Through Reflection 》,它的经典代码是这样的int enumValue1 = (int)enumItem1.GetValue(enumType);int enumValue2 = (int)enumItem2.GetValue(enumType);int currentValue = (int)flagsInfo.GetValue(remoteObject, null);int newValue = currentValue | enumValue1 | enumValue2;举例说明,我需要反射生成ReportViewer控件的对象实例,并且要传一个Mode值给它(Server,LocalReport)以表示是本地报表,还是取服务器报表。这种情况下,非得用反射的方式传入值。在我的.NET通用平台中,也应用到这项技术,以反射方式创建CrystalReportViewer报表控件,再传入参数值。这种方式稍微复杂一些,但是对比它带来的灵活性,是非常值得的。 目录选择功能FolderBrowserDialog dlg = new FolderBrowserDialog();if (!string.IsNullOrEmpty(txtPath.Text)) dlg.SelectedPath = txtPath.Text;if (dlg.ShowDialog() == DialogResult.OK){ txtPath.Text = dlg.SelectedPath;} 文件选择功能OpenFileDialog dlg = new OpenFileDialog();dlg.Filter = "All File(*.*)|*.*";if (dlg.ShowDialog() == DialogResult.OK){ txtPath.Text = dlg.FileName;} Filter是经常容易忘记的选项,再举一个例子dlg.Filter = "Xml file (*.xml)|*.xml|All Files|*.*"; 读取嵌入到程序集中的资源文件Assembly assm = Assembly.GetAssembly(typeof(DatabaseCleanup));string file = "DatabaseCleanup.txt";Stream input = assm.GetManifestResourceStream("DataLoader.Resource" + "." + file); StreamReader reader=new StreamReader(input);string sql=reader.ReadToEnd();reader.Close();只要可能,对只读的不需要修改的配置选项资源(SQL语句,文本文件),尽可能的使用Embedded Resource方式。 微软企业库的调用方式经过一层简单的封装,以下面的这种方式来调用企业库以访问数据库EnterpriseLibraryShared.ConnectonString =ConnectionString;Microsoft.Practices.EnterpriseLibrary.Data.Database m_commonDb = DatabaseFactory.CreateDatabase();DbCommand cmd = m_commonDb.GetSqlStringCommand(sql);int rowAffected = m_commonDb.ExecuteNonQuery(cmd);我把企业库的连接字符串放到一个static class中,这样可以简化调用方式,不必要一定要加App/Web.config文件。 监控文件或目录的变化这个功能比较常用,在Data Loader也有一个PDF Watcher的程序,以监控指定的目录是否有新加入的PDF文件(可能来自远程传输,或是从网页中下载回来),然后对它进转换,导入到文档服务器中。public void StartMonitor(string path){ FileSystemWatcher watcher = new FileSystemWatcher(); watcher.Path = path; watcher.NotifyFilter = NotifyFilters.FileName; // Only watch pdf files. watcher.Filter = "*.pdf"; watcher.Created += new FileSystemEventHandler(OnChanged); watcher.EnableRaisingEvents = true;}// Event handler for when a file is created in the watched folderprivate void OnChanged(object source, FileSystemEventArgs e){ string word = DocumentUtility.ConvertPdfToDoc(e.FullPath);}
分享到:
评论

相关推荐

    AutoCAD .NET开发指南2012版》示例代码

    AutoCAD .NET开发指南2012版》示例代码主要内容包括AutoCAD .NET API介绍、使用AutoCAD .NET API控制AutoCAD工作环境、创建及编辑AutoCAD实体、创建和编辑尺寸标注、3D图形处理、定义打印布局、打印输出、处理Auto...

    《AutoCAD .NET开发指南2012版》示例代码

    《AutoCAD .NET开发指南2012版》的示例代码,只包含C#代码。 在vs2010sp1 + ObjectARX2014 + AutoCAD2014环境下测试通过,若在ObjectARX2012 + AutoCAD2012环境下测试需更改相应的引用库。

    [源代码] ASP.NET 3.5 网站开发全程解析 (C#版本)

    - 三层架构: 数据层、数据访问层(DAL)、业务逻辑层(BLL); - LINQ to Entities (实体框架) 应用; - 用户管理:成员(Membership)、用户配置(Profile)应用; - 本地化: (Localization)应用; - 新闻文章(Article)...

    [源代码] ASP.NET 3.5 商用开发架构精解

    - 三层架构: 数据访问层 (LINQ to SQL) 业务逻辑层 (BO 业务对象, EO 编辑对象) 用户界面层 (Div + CSS 布局、嵌套模板页、ASP.NET AJAX 控件、自定义服务器控件) - 异常处理 模块 (Microsoft Exception Handling...

    [源代码] ASP.NET 2.0 网站开发全程解析 (源代码)

    - 三层架构: 数据层、数据访问层(DAL)、业务逻辑层(BLL); - 用户管理:成员(Membership)、用户配置(Profile)应用; - 个性化设置: (Web Part)应用; - 本地化: (Localization)应用; - 论坛(Forum)模块; - 电子...

    [源代码] ASP.NET 3.5 电子商务网站开发全程解析

    《ASP NET 电子商务开发实战》教你一步一步地采用全新的 ASP NET 3 5 SQL Server 2008 构建电子商务站点 通过一个贯穿全书的案例 循序渐进地讲述了如何设计和开发一个优秀 灵活 完整的三层电子商务网站 介绍了改善...

    [源代码] ASP.NET 3.5 商用社交网站开发全程解析

    ★ 程序说明:★ ☆ 网站技术:☆ 架构体系: 数据访问层 (Data Access Layer) (LINQ to SQL 实现) 存储库层 (Repository Layer) (Repository 模式 实现) 服务层 (Service Layer) ...- [源代码] - [程序运行说明]

    [源代码] .NET Pet Shop 4.0 (精校代码)

    The .NET Pet Shop application is designed to show the best practices for building enterprise, n-tier .NET 2.0 applications that may need to support a variety of database platforms and deployment ...

    EasyPlat.Net快速开发平台源码20130805

    EasyPlat.Net提供基于DATASET的三层结构,可以通过直接使用BizSQL进行两层开发。包含账号、角色、权 限,菜单管理;导入、导出、打印、加密等方法;公共字典、XML字典使用;多种打印、导入导出、图表支持, 日志...

    ASP.NET新闻系统 三层架构

    数据库设计、文档编写(完) .NET三层后台代码编写(完) DIV+CSS前台界面设计(兼容IE6,7,8,firefox,opera,chrome)(完) 后台代码与前台界面的整合及其他杂七杂八的花哨(ajax,jQuery)(完) 采用到的技术: .NET三层...

    ASP.NET.3.5.SP1高级编程6e.part2.rar

    本书适用于想在应用程序中添加AJAX 功能的有经验的ASP.NET 开发人员,同样适用于想要结合使用ASP.NET和AJAX的经验丰富的Web开发人员。 本书是ASP.NET名著的升级版,与上一版相比,本版内容更全面、技术更新,新增了...

    ASP.NET.3.5.SP1高级编程6e.part3.rar

    本书适用于想在应用程序中添加AJAX 功能的有经验的ASP.NET 开发人员,同样适用于想要结合使用ASP.NET和AJAX的经验丰富的Web开发人员。 本书是ASP.NET名著的升级版,与上一版相比,本版内容更全面、技术更新,新增了...

    ASP.NET.3.5.SP1高级编程6e.part1.rar

    本书适用于想在应用程序中添加AJAX 功能的有经验的ASP.NET 开发人员,同样适用于想要结合使用ASP.NET和AJAX的经验丰富的Web开发人员。 本书是ASP.NET名著的升级版,与上一版相比,本版内容更全面、技术更新,新增了...

    示例代码 - AutoCAD .Net开发指南第4部分-标注与公差

    AutoCAD .Net开发指南第4部分-标注与公差的示例代码。开发环境为vs2010sp1,ObjectARX SDK放在c:\ObjectARX_2014,在AutoCAD2013/2014下调试通过,在AutoCAD2012下需换成2012版的ObjectARX SDK。

    著名的技术交流网站clubof.net的源代码

    著名的交流网站clubof.net的源代码 此版本包含有以下内容: FrienDevApps_20081201.zip: 包含有最新版核心开发包、WebCast应用程序示例、投票应用程序示例 FrienDevDatabase_20081201.zip: 最新的核心数据库、...

    [源代码] ASP.NET 4.0 商用社交网站开发全程解析

    ★ 程序说明:★ ☆ 网站技术:☆ 架构体系: 数据访问层 (Data Access Layer) (ADO.NET Entity Framework 实现) 存储库层 (Repository Layer) (Repository 模式 实现) ...- [源代码] - [程序运行说明]

    Microsoft .NET Framework 3.5 Service Pack 1

    ASP.NET 动态数据,它提供了丰富的框架,从而使用户可以快速进行数据驱动的开发,而无需编写代码;ASP.NET AJAX 的一项新增功能,对管理浏览器历史记录提供了支持(支持后退按钮)。有关更多信息,请参见 What’s ...

    K风网页搜索(.NET) V2.2 SP5

    K风网页搜索V2.1版本主要改进:使用.NET技术开发Web前台程序、采用UTF-8网页编码、全新索引系统、开放管理工具源代码;SP1改进:修正自动识别网页编码、改进哈希使蜘蛛爬行更全面、修正特殊情况出现的入库错误等; ...

    FScadaV3_.net_FScada_组态_

    ,支持.Net扩展,是中小监控组态系统的优选方案,特别适用于组态和管理合并系统,采用.Net开发管理平台与FScada无缝集成。 FScada提供定制开发和源码服务。 FScada支持WindowsXP SP3,Windows2003,Windows7及更高...

    精通ASP.NET2005 SQL+Server2005项目开发

    本系统在 Windows 2003 Server/Windows xp professinal sp2 VS.NET2005SQLServer2005 环境下调试通过 里面包含详细的页面前台以及后台代码 非常适合成程序员使用

Global site tag (gtag.js) - Google Analytics