如图: 本技术的核心是通过ASP.NET Ajax Control Toolkit中的AutoCompleteExtender控件实现。 AutoCompleteExtender控件实现自动输入建议的功能,通过调用WebService或本页面对应的方法名来获取提示数据,供用户达到自动选择的功能。 实现过程: 1.首先建立数据大家随便啊,然后建立个简单的表。 2.新建1个Ajax网站,名字自己随便起哈,在建一个主页面Default.aspx. 3.在Default.aspx中添加1个ScriptManager控件、1个AutoCompleteExtender控件和1个TextBox控件,配置如下: 复制代码 代码如下: <asp:ScriptManager ID="ScriptManager1" runat="server" /> <cc1:AutoCompleteExtender ID="AutoCompleteExtender1" runat="server" TargetControlID="TextBox1" ServicePath="KeyFind.asmx" CompletionSetCount="10" MinimumPrefixLength="1" ServiceMethod="GetCompleteDepart"> </cc1:AutoCompleteExtender> <asp:TextBox ID="TextBox1" runat="server" Width="352px" Height="27px"></asp:TextBox> 4.创建1个Web服务,将其命名为KeyFind.asmx,该服务主要完成智能检索功能。 5.在KeyFind.asmx Web服务的KeyFind.cs文件下加入如下代码: 复制代码 代码如下: using System; using System.Web; using System.Collections; using System.Web.Services; using System.Web.Services.Protocols; //引入空间 using System.Data; using System.Data.OleDb; using System.Configuration; /// <summary> /// KeyFind 的摘要说明 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] //添加服务脚本(必须添,否则程序不能正常运行) [System.Web.Script.Services.ScriptService] public class KeyFind : System.Web.Services.WebService { public KeyFind() { //如果使用设计的组件,请取消注释以下行 //InitializeComponent(); } //定义数组保存获取的内容 private string[] autoCompleteWordList = null; //两个参数“prefixText”表示用户输入的前缀,count表示返回的个数 [WebMethod] public String[] GetCompleteDepart(string prefixText, int count) { ///检测参数是否为空 if (string.IsNullOrEmpty(prefixText) == true || count <= 0) return null; // 如果数组为空 if (autoCompleteWordList == null) { //读取数据库的内容 OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("Ex18_02.mdb")); conn.Open(); OleDbDataAdapter da = new OleDbDataAdapter("select keyName from keyInfo where keyName like'" + prefixText + "%' order by keyName", conn); DataSet ds = new DataSet(); da.Fill(ds); //读取内容文件的数据到临时数组 string[] temp = new string[ds.Tables[0].Rows.Count]; int i = 0; foreach (DataRow dr in ds.Tables[0].Rows) { temp[i] = dr["keyName"].ToString(); i++; } Array.Sort(temp, new CaseInsensitiveComparer()); //将临时数组的内容赋给返回数组 autoCompleteWordList = temp; if (conn.State == ConnectionState.Open) conn.Close(); } //定位二叉树搜索的起点 int index = Array.BinarySearch(autoCompleteWordList, prefixText, new CaseInsensitiveComparer()); if (index < 0) { //修正起点 index = ~index; } //搜索符合条件的数据 int matchCount = 0; for (matchCount = 0; matchCount < count && matchCount + index < autoCompleteWordList.Length; matchCount++) { ///查看开头字符串相同的项 if (autoCompleteWordList[index + matchCount].StartsWith(prefixText, StringComparison.CurrentCultureIgnoreCase) == false) { break; } } //处理搜索结果 string[] matchResultList = new string[matchCount]; if (matchCount > 0) { //复制搜索结果 Array.Copy(autoCompleteWordList, index, matchResultList, 0, matchCount); } return matchResultList; } } 完! 简单明了!

本文实例讲述了asp.net实现数据从DataTable导入到Excel文件并创建表的方法。分享给大家供大家参考,具体如下:/// <summary>/// 把数据从DataTable导入到Excel文件里/// </summary>/// <param name="dataTable">数据源</param>/// <param name="AbsoluteExcelFilePath">Excel文件的绝对路径</param>/// <param name="TblColName">TBL里对应的列名</param>/// <param name="ColumnName">Excel中对应的列名</param>/// <returns>操作成功返回True,失败返回False</returns>public static bool ExportDataToExcel(DataTable dataTable, string AbsoluteExcelFilePath, string[] TblColName, string[] ColumnName){ int k = 0; if (dataTable == null) return false; OleDbConnection Conn = new OleDbConnection(); try { string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + AbsoluteExcelFilePath + ";Mode=Share Deny None;Extended Properties=Excel 8.0;Jet OLEDB:Create System Database=True"; Conn = new OleDbConnection(strConn); Conn.Open(); OleDbCommand command = Conn.CreateCommand(); string strSQL = ""; if (dataTable.Columns != null) { //建表 strSQL = "CREATE TABLE " + dataTable.TableName + "("; for (int i = 0; i < ColumnName.Length; i++) { strSQL += ColumnName[i] + " TEXT,"; } strSQL = strSQL.Substring(0, strSQL.Length - 1); strSQL += ")"; command.CommandText += strSQL; command.ExecuteNonQuery(); if (dataTable.Rows.Count > 0) { //导入数据 foreach (DataRow row in dataTable.Rows) { strSQL = "insert into " + dataTable.TableName + "("; for (k = 0; k < TblColName.Length; k++) { strSQL += ColumnName[k] + ","; } strSQL = strSQL.Substring(0, strSQL.Length - 1); strSQL += ") values( "; for (k = 0; k < TblColName.Length; k++) { strSQL += "'" + row[TblColName[k]] + "',"; } strSQL = strSQL.Substring(0, strSQL.Length - 1); strSQL += ")"; command.CommandText = strSQL; command.ExecuteNonQuery(); } } } } catch (Exception ex) { Conn.Close(); throw new Exception(ex.Message); return false; } Conn.Close(); return true;}调用方法:DataSet ds = (DataSet)Session["listMobile"];//获得要导出的表格的值if (ds.Tables[0].Rows.Count <= 0){ Page.RegisterStartupScript("", "<mce:script type="text/javascript"><!--alert('没有内容不能导出!')// --></mce:script>");}else{ //EXCEL页面的名称 string[] tableName = { "["+DateTime.Now.ToString("yyyyMMddhhmmss")+"]" }; string fileName = tools.CreateID() + ".xls"; string filePath = Server.MapPath("..//DownloadFiles//" + fileName); if (tools.ExportDataToExcel(ds, filePath, tableName)==true) { Response.Clear(); Response.Buffer = true; Response.Charset = "GB2312"; Response.AppendHeader("Content-Disposition", "attachment;filename=" + fileName); Response.ContentType = "application/vnd.ms-excel"; this.EnableViewState = false; Response.WriteFile(filePath); Response.Flush(); if (System.IO.File.Exists(filePath)) System.IO.File.Delete(filePath); Response.Redirect(this.Request.UrlReferrer.AbsoluteUri, true); Response.End(); }}希望本文所述对大家asp.net程序设计有所帮助。

有关OutputCache的相关资料大家可以查看 OutputCacheProvider OutputCache的一点点认识 ,我们还是复习一下OutputCache内容,OutputCache 的处理是在OutputCacheModule类中注册ResolveRequestCache、UpdateRequestCache这2个方法,一个 用于获取一个用于设置缓存。缓存内容分为两部分,一部分为缓存策略CachedVary,一部分为缓存数据CachedRawResponse,一个页面 缓存策略只有一个CachedVary,但是它却可以有多个缓存内容CachedRawResponse。缓存内容的获取和设置主要是依赖于HttpResponse的GetSnapshot() UseSnapshot(HttpRawResponse rawResponse, bool sendBody)方法。一般我们的缓 存都是要占用存储空间的尽量减少缓存内容的副本是非常重要的,那么我们现在就来看看缓存key是如何创建的,key的创建取决于 CreateOutputCachedItemKey方法。CreateOutputCachedItemKey方法的内容还是比较复杂的,现在让我们一 起来看看它的具体实现吧。 CreateOutputCachedItemKey方法又是如何调用的了,创建缓存策略key的代码:this.CreateOutputCachedItemKey(context, null);创建缓存key的代码:this.CreateOutputCachedItemKey(context, cachedVary)区别就在于参数CachedVary 的值一个为null,一个是真正的CachedVary 实例。我这里的代码是通过Reflector.exe反编译得到,感觉和真实的代码有点差别,不过逻辑上是一样的。 我还是以一个实际的例子来变解析边说明,我这里是用asp.net mvc建立的一个demo。请求url:http://localhost:7503/Home/index 那么path就应该是:Home/index 首先我们的可以需要区分我们的请求是Get还是Post,Post以a1打头,否则已a2打头,紧接着追加当前的Path: 复制代码 代码如下: if (verb == HttpVerb.POST) { builder = new StringBuilder("a1", path.Length + "a1".Length); } else { builder = new StringBuilder("a2", path.Length + "a2".Length); } builder.Append(CultureInfo.InvariantCulture.TextInfo.ToLower(path)); 到这个时候我们的缓存策略key及确定的,我这里的策略key为:a2/home/index 如果我们的cachedVary不为null则继续执行: 复制代码 代码如下: for (int i = 0; i <= 2; i++) { int num; string[] array = null; NameValueCollection serverVarsWithoutDemand = null; bool flag = false; switch (i) { case 0: builder.Append("H"); array = cachedVary._headers; if (array != null) { serverVarsWithoutDemand = request.GetServerVarsWithoutDemand(); } break; case 1: builder.Append("Q"); array = cachedVary._params; if (request.HasQueryString && ((array != null) || cachedVary._varyByAllParams)) { serverVarsWithoutDemand = request.QueryString; flag = cachedVary._varyByAllParams; } break; default: builder.Append("F"); if (verb == HttpVerb.POST) { array = cachedVary._params; if (request.HasForm && ((array != null) || cachedVary._varyByAllParams)) { serverVarsWithoutDemand = request.Form; flag = cachedVary._varyByAllParams; } } break; } if (flag && (serverVarsWithoutDemand.Count > 0)) { array = serverVarsWithoutDemand.AllKeys; num = array.Length - 1; while (num >= 0) { if (array[num] != null) { array[num] = CultureInfo.InvariantCulture.TextInfo.ToLower(array[num]); } num--; } Array.Sort(array, InvariantComparer.Default); } if (array != null) { num = 0; int length = array.Length; while (num < length) { string str = array[num]; if (serverVarsWithoutDemand == null) { varyByCustomString = "+n+"; } else { varyByCustomString = serverVarsWithoutDemand[str]; if (varyByCustomString == null) { varyByCustomString = "+n+"; } } builder.Append("N"); builder.Append(str); builder.Append("V"); builder.Append(varyByCustomString); num++; } } } 这段代码说白了就是给key值追加HQF3个字符,这个循环首先处理服务器的数据, array = cachedVary._headers; serverVarsWithoutDemand = request.GetServerVarsWithoutDemand(); 其次是处理QueryString数据: array = cachedVary._params; serverVarsWithoutDemand = request.QueryString; 最后处理Form数据 array = cachedVary._params; serverVarsWithoutDemand = request.Form; serverVarsWithoutDemand是NameValueCollection 类型的数据,这里循环serverVarsWithoutDemand里面的每个key,每个key对应的追加字符串为N+key+V+value,如果value是null则从新赋值为“+n+”,可以看见不同的请求这里的key及有所不同了。在QueryString和Form时这里的serverVarsWithoutDemand的取值与 cachedVary._varyByAllParams有关,cachedVary的创建是在OutputCacheModule 的OnLeave方法中: vary = new CachedVary(varyByContentEncodings, varyByHeaders, varyByParams, varyByAllParams, currentSettings.VaryByCustom); varyByAllParams的取值如下: 复制代码 代码如下: bool varyByAllParams = false; if (varyByParams != null) { varyByAllParams = (varyByParams.Length == 1) && (varyByParams[0] == "*"); } 可见varyByAllParams基本都是false,只有varyByParams有且紧有一个元素并且为*时,varyByAllParams才为true,varyByAllParams为false时这里的serverVarsWithoutDemand取值为GetServerVarsWithoutDemand方法,与我们的QueryString、Form3没什么关系。GetServerVarsWithoutDemand()方法大家可能都不怎么熟悉,我们来看看它的定义: 复制代码 代码如下: internal NameValueCollection GetServerVarsWithoutDemand() { return this.GetServerVars(); } 对这个方法不了解不要紧,我们有一个ServerVariables(获取 Web 服务器变量的集合)属性和他相似: 复制代码 代码如下: public NameValueCollection ServerVariables { get { if (HttpRuntime.HasAspNetHostingPermission(AspNetHostingPermissionLevel.Low)) { return this.GetServerVars(); } return this.GetServerVarsWithDemand(); } } 其中GetServerVarsWithDemand方法也是调用GetServerVars方法。现在serverVarsWithoutDemand的数据我们也搞清楚了。 builder.Append("C"); 接下来在追加字符C 接下来我们该处理缓存_varyByCustom的配置了 复制代码 代码如下: if (cachedVary._varyByCustom != null) { builder.Append("N"); builder.Append(cachedVary._varyByCustom); builder.Append("V"); try { varyByCustomString = context.ApplicationInstance.GetVaryByCustomString(context, cachedVary._varyByCustom); if (varyByCustomString == null) { varyByCustomString = "+n+"; } } catch (Exception exception) { varyByCustomString = "+e+"; HttpApplicationFactory.RaiseError(exception); } builder.Append(varyByCustomString); } 这个方法很好明白,如果_varyByCustom不为null那么我们就追加N+key+V+value格式的字符。其中key就是_varyByCustom字符串,value是调用context.ApplicationInstance.GetVaryByCustomString(context, cachedVary._varyByCustom)得到的value,如果value值为null,则设置为“+n+” builder.Append("D"); 复制代码 代码如下: if (((verb == HttpVerb.POST) && cachedVary._varyByAllParams) && (request.Form.Count == 0)) { int contentLength = request.ContentLength; if ((contentLength > 0x3a98) || (contentLength < 0)) { return null; } if (contentLength > 0) { byte[] asByteArray = ((HttpInputStream) request.InputStream).GetAsByteArray(); if (asByteArray == null) { return null; } varyByCustomString = Convert.ToBase64String(MachineKeySection.HashData(asByteArray, null, 0, asByteArray.Length)); builder.Append(varyByCustomString); } } 这段代码主要是给key追加一个字符D,然后在处理Post的请求(非表单request.Form.Count == 0)把请求的内容(字节)转化为字符追加到key中,一般的http很少会发生此情况,典型的是HttpWebRequest发生的Post请求会触发。 复制代码 代码如下: builder.Append("E"); string[] strArray2 = cachedVary._contentEncodings; if (strArray2 != null) { string httpHeaderContentEncoding = context.Response.GetHttpHeaderContentEncoding(); if (httpHeaderContentEncoding != null) { for (int j = 0; j < strArray2.Length; j++) { if (strArray2[j] == httpHeaderContentEncoding) { builder.Append(httpHeaderContentEncoding); break; } } } } 这段代码首先给key追加一个字符E,然后最佳ContentEncoding,ContentEncoding的取值为 context.Response.GetHttpHeaderContentEncoding()并且在缓存策略中的 _contentEncodings存在才追加。 到现在为止我们的CreateOutputCachedItemKey方法讲完了,缓存策略的key没什么说的,与Http请求方式Get和Post、Request的Path属性有关。但是缓存数据的key有关对象: (1)与我们的_headers有关,即配置中的 VaryByHeader属性有关,VaryByHeader取值不同,key则不同 (2)与_varyByAllParams有关,当它为true时,实际上就是与 request.QueryString有关,如果此请求是Post则还与request.Form有关;_varyByAllParams默认为 false,为true的情况也很单一 varyByAllParams = (varyByParams.Length == 1) && (varyByParams[0] == "*") (3)与_varyByCustom有关,它会把 context.ApplicationInstance.GetVaryByCustomString(context, cachedVary._varyByCustom)方法返回值追加到key中, (4)与_contentEncodings有关,如果 context.Response.GetHttpHeaderContentEncoding()返回的值在_contentEncodings中则追加其返回值。 注意:如果此Http处理是一个Post并且request.Form.Count ==0&& _varyByAllParams为rue的时候海域我们post过来的数据有关。

程序健壮性最基本要求就是程序错误的处理与捕捉,在ASP.NET中,错误的处理有和其他编程语言一样的机制,可以使用Try…Catch…Finally等方式,这一点和ASP相比具有较大的进步。而且,使用这些错误处理方法,可以大大提高程序的可读性和程序调试速度,在这几个优势结合的情况下,我们更加应该注意这一点。  关于错误的处理,我们可以参考这篇文章: Try...Catch...Finally in ASP.NET Introduction Error handling in Classic ASP was not the best. We were having only limited options available for error handling in Classic ASP such as, "On Error Resume Next". In ASP 3.0 we saw the new ASP object called Error Object. But we were not able to handle all exception/errors efficiently. Now in ASP.NET we have a new error handling mechanism which was already their in other languages such as C, C++ and JAVA. We can also call the try...catch mechanism as "Exception Handling"  What is Try...Catch....Finally This is a new error handling mechanism in VB.NET, so as in ASP.NET. Well we have three blocks of code, were each block has it own functionality. The Try...Catch...Finally block of code surrounds the code where an exception might occur. The simple Try statement comes before the block of code, the Catch block of code is where we specify what type of error to look for, and the Finally block of code is always executed and contains cleanup routines for exception situations. Since the catch block is specific to the type of error we want to catch, we will often use multiple Catch blocks in our Try...Catch...Finally structure.  A simple Database operation Dim mySqlConnection as New SqlConnection (ConnectionString)  Dim mySqlCommand as SqlCommand  Dim strSql as String  strSql = "insert into yourtable (f1, f2) values ('f1', 'f2')"  mySqlCommand = new SqlCommand(strSql, mySqlConnection)  Try  mySqlConnection.Open()  mySqlCommand.ExecuteReader(CommandBehavior.CloseConnection)  Message.text = "New Forward information added"  Catch SQLexc as sqlexception  Message.text = Message.text + sqlexc.tostring()  Catch exc as exception  if Instr(1, exc.tostring, "duplicate key") > 0 then  Message.text = Message.text + "Cannot insert duplicate values."  else  Message.text = Message.text + exc.tostring()  end if  Finally  mySqlConnection.Close()  End Try  What does the above example exactly do? Well, in the above example we were trying to insert some values to a database table. The possible chances while performing a database operation are invalid connection string, database server too busy resulting in connection time out, database server not currently running etc etc. We should anticipate all these errors while performing a database operation. So, we have a Try block, which contains the statements such as opening the connection and executing the operation. Basically, we have two major statements inside the try block which may result in an exception/error.  As I said, any exception can occur during a database operation. Catching all these exception is now very easy with the Catch block. All we need is to have a Catch block. We can have any number of Catch blocks. Each Catch block may have a different error/exception trapping mechanism. In the above example, we have two catch blocks, one which captures a general exception and the other one which traps the SqlException.  When all the statements inside the catch blocks are executed, the finally block comes into the picture. As I said earlier, finally block contains cleanup routines for exception situations.  Exit Try statement We can also have the Exit Try statement inside any of the try...catch block. The objective of this statement is to break out of the Try or Catch block. Once the Exit Try statement is executed, the control goes to the Finally block. So, Exit Try statement can be best used were we need to execute the cleanup routines.  How about nested Try statments? We can have nested Try and Catch blocks. Can you imagine, when we should use nested try statements. Well, errors can occur within the Catch portion of the Try structures, and cause further exception to occur. The ability to nest try structures is available so that we can use a second Try structure to cover exceptions.  Links http://www.vbweb.co.uk/show/1889/2/ http://www.oreillynet.com/pub/a/dotnet/2001/09/04/error_handling.html?

点击按钮,执行提交操作,弹出消息框后,页面的样式变乱,解决方法: 首先,确定使用的css样式正确,页面中的宽高值保持规范统一; 然后,弹出框避免使用Response.Write(),如下所示复制代码 代码如下: Response.Write("<script language=javascript>"); Response.Write("window.alert('"); Response.Write("计划添加失败!"); Response.Write("');"); Response.Write("</script>"); 修改为:ClientScript.RegisterStartupScript(GetType(), "", "window.alert('计划添加失败!');",

分类:腾博会手机版下载

时间:2016-06-18 07:26:18