摘要: 有时我们会在一个页面上使用多个AutoCompleteExtender,而且后面的AutoCompleteExtender可能依赖于前面AutoCompleteExtender的结果,这可能是有人说的联动效果吧。 实现方法可能有多种,我的一种方法如下阅读全文
posted @ 2008-12-16 14:53 要有好的心情 阅读(2433) 评论(6) 编辑
posted @ 2008-10-26 21:38 要有好的心情 阅读(4449) 评论(8) 编辑

在使用AutoCompleteExtender控件时,有时候我们希望同时返回选中项的文本和Id号,即支持键值对数据,比如利用AutoCompleteExtender选择员工时,选中一个员工姓名的同时,也将员工的Id号返回,这样我们就可以直接使用员工Id,下面介绍两种方法(本文使用.Net 2.0 版本说明具体步骤):

第一种方式:最直接的方式
主要有3个步骤:
1、改造返回字符串数组的WebServices方法,让返回的为NameVlue键值对数据,但仍旧为字符串数组格式.

以中自带的例子来说明,原代码为:
items.Add(prefixText + c1 + c2 + c3);
改为
items.Add(prefixText + c1 + c2 + c3 + "|" + Guid.NewGuid().ToString());
这里用分隔符来分割NameVlue键值对,以方便客户端取出。

2、改造JavaScript文件中AutoCompleteBehavior类的_update方法

_update方法中的completionItems参数,就是WebServices返回的JSON数据生成的JavaScript数组。
找到_update方法中的下面这句代码
itemElement.appendChild(document.createTextNode(this._getTextWithInsertedWord(text)));
改为
if(typeof( completionItems[i]) == "string" && completionItems[i].indexOf("|") >= 0)
{
    itemElement.setAttribute("title", completionItems[i].split("|")[1]);
    itemElement.appendChild(document.createTextNode(this._getTextWithInsertedWord(completionItems[i]).split("|")[0]));
}
else
{
    itemElement.appendChild(document.createTextNode(this._getTextWithInsertedWord(text)));
}
  
3、修改_setText方法,以便在选中一项suggestion的同时,获取其相应的Id
找到下面这句
element.value = text;
在此句下面加上
if($get(element.id + "Id"))
{
 $get(element.id + "Id").value = item.getAttribute("title");
}
在这里,还要在aspx页面上,在AutoComplete的TextBox后面加一个隐藏域,且Id号为AutoComplete的TextBox的Id号后再加“Id”,这个可以自己任意取,同时也可以不用隐藏域,也可以通过其他方法得到选中项的Id。


第二种方式:利用AutoCompleteBehavior中_update方法的变量pair

1、改造返回字符串数组的WebServices方法,让返回的为NameVlue键值对数据

你可以用下面三个方法中的任意一个

Code

 

 



[WebMethod]
public List<Pair> GetCompletionList2(string prefixText, int count)
{
    
if (count == 0)
    {
        count 
= 10;
    }

    
if (prefixText.Equals("xyz"))
    {
        
return new List<Pair>(0);
    }

    Random random 
= new Random();
    List
<Pair> items = new List<Pair>(count);
    
for (int i = 0; i < count; i++)
    {
        
char c1 = (char)random.Next(6590);
        
char c2 = (char)random.Next(97122);
        
char c3 = (char)random.Next(97122);

        items.Add( 
new Pair( prefixText + c1 + c2 + c3, Guid.NewGuid().ToString()));
    }

    
return items;
}

 

 

[WebMethod]
public string[] GetCompletionList3(string prefixText, int count)
{
    
if (count == 0)
    {
        count 
= 10;
    }

    
if (prefixText.Equals("xyz"))
    {
        
return new string[0];
    }

    Random random 
= new Random();
    List
<string> items = new List<string>(count);
    
for (int i = 0; i < count; i++)
    {
        
char c1 = (char)random.Next(6590);
        
char c2 = (char)random.Next(97122);
        
char c3 = (char)random.Next(97122);

        items.Add(String.Format(
"{{\"First\":\"{0}\", \"Second\":\"{1}\"}}", prefixText + c1 + c2 + c3, Guid.NewGuid().ToString()));
    }

    
return items.ToArray();
}

 

2、改造JavaScript文件中AutoCompleteBehavior类的_update方法

找到
catch (ex) {
    text = completionItems[i];
    value = completionItems[i];
}
改为
catch (ex) {
 try {
  if (completionItems[i].First) {
   text = completionItems[i].First;
   value = completionItems[i].Second;
  }
  if (completionItems[i].Value) {
   text = completionItems[i].Key;
   value = completionItems[i].Value;
  }
  else {
   text = completionItems[i];
   value = completionItems[i];
  }
 }
 catch (ex2) {}
}

3、修改_setText方法,以便在选中一项suggestion的同时,获取其相应的Id
找到下面这句
element.value = text;
在此句下面加上
if($get(element.id + "Id"))
{
 $get(element.id + "Id").value = itemElement._value;
}
在这里,也是在AutoComplete的TextBox后面加一个隐藏域,当然你也可以用其他手段。


这里需要说一下服务器端的 GetCompletionList3方法,实际上返回的每一个suggestion都是一个JSON文本,在客户端的_update方法中,有句代码为
var pair = Sys.Serialization.JavaScriptSerializer.deserialize('(' + completionItems[i] + ')');
此句代码只有在服务器端返回的每一个suggestion是一个JSON文本才会正确执行,因此我们的第一种方式和第二种方式中的GetCompletionList1和GetCompletionList2,这三个WebServices方法
返回的数据都不会使此句执行,真正执行的是catch里的代码,因为这三个WebServices方法返回的数据都会导致此句代码抛出异常。只有GetCompletionList3方法方法才会导致此句代码执行。

其实客户端使用Sys.Net.WebServiceProxy.invoke返回的数据已经进行了反串行化,已经是JavaScript对象了,从Sys.Net.WebRequestExecutor的get_object()方法就可以知道。


另外提一下就是在asp.net 2.0中当使用frame时,MicrosoftAjax.js中的一个小bug,这个bug在asp.net 3.5中已经修复。
在asp.net 2.0 的 Sys.UI.DomElement 对象中有个getLocation静态方法,里面有这句 offsetL += (f.frameBorder || 1) * 2 + ...

其中f.frameBorder与页面上设置的值紧密相关,frameBorder 属性设置或返回是否显示框架周围的边框,1表示有边框,0表示没有边框。由于我是仿照着别人的界面,使用了frame,是这样写的
<frame ... frameborder="NO"> frameBorder既不是1也不是0,造成f.frameBorder为NaN,导致getLocation方法返回的是NaN。因为MicrosoftAjax.js是嵌入的资源,无法修改,只好修改AjaxControlToolkit中的Common.js文件
找到里面的getLocation方法的最后一句,改为
var returnValue = Sys.UI.DomElement.getLocation(element);
if(isNaN(returnValue.x) && Sys.Browser.agent == Sys.Browser.InternetExplorer)
{
 // 这里将asp.net 3.5中MicrosoftAjax.js文件的getLocation代码复制过来,在这里不详细写了
 // 找到这句var offset = (f.frameBorder === "0" || f.frameBorder === "no") ? 2 : 0;
 // 替换为  var offset = (f.frameBorder === "0" || f.frameBorder === "no" || f.frameBorder === "NO" || isNaN(f.frameBorder)) ? 2 : 0;
}

posted @ 2008-09-28 23:24 要有好的心情 阅读(942) 评论(1) 编辑
摘要: 一、在添加一个缓存项时,允许指定一个过期策略,这个过期策略对象要实现ICacheItemExpiration接口,常见的过期策略有:绝对过期时间 : AbsoluteTime表达式表示的时间过期策略:ExtendedFormatTime程序运行中一直不会过期NeverExpired: 每次读取之后,再延长指定的时间后才会过期:SlidingTime。文件依赖:FileDependency二、自己实...阅读全文
posted @ 2008-08-12 09:59 要有好的心情 阅读(851) 评论(0) 编辑
Visual Studio 2008 users will need to download and install Service Pack 1 which will be available here after August 11, 2008.
posted @ 2008-08-08 06:26 要有好的心情 阅读(72) 评论(0) 编辑
摘要: 跟小D学英语口语2008.5.8 - 7.16打包下载 :/Files/SilverLight/200805080716.rar 下载每日一句的小程序 起始号 与 截至号的设定:例如 跟小D学英语口语,每日一句(7.26)的url为 http://space.cnblogs.com/group/topic/3965/ 则 起始号 与 截至号有一个设定为 3965程序没有做任何验证处理,没有用多线程...阅读全文
posted @ 2008-07-17 15:18 要有好的心情 阅读(120) 评论(0) 编辑
摘要: 看到这样一段视频,就发生在我们奎文区,我还真没听说过,无语了。http://www.youtube.com/watch?v=LIQLjsgeO2Q阅读全文
posted @ 2008-06-24 12:59 要有好的心情 阅读(49) 评论(0) 编辑
摘要: [转]WPF or WinForms, choose wisely原文地址: http://weblogs.asp.net/bsimser/archive/2008/02/25/wpf-or-winforms-choose-wisely.aspxWPF is all the rage (at least that's what they tell me) and it's IMHO one of ...阅读全文
posted @ 2008-02-27 15:53 要有好的心情 阅读(343) 评论(0) 编辑
摘要: In our premier issue, back in October 2002, we ran a full-length interview with Anders Hejlsberg, the Distinguished Engineer at Microsoft responsible for the creation of the C# programming language. Then, in March 2005, we presented a follow-up interview conducted by .NETDJ's editor-in-chief, Derek Ferguson, at Microsoft's Tech Ed 2004 conference in San Diego, California. Here it is again in full.阅读全文
posted @ 2008-01-30 16:25 要有好的心情 阅读(114) 评论(0) 编辑
posted @ 2007-06-18 12:25 要有好的心情 阅读(158) 评论(1) 编辑