功能:在控件中输入数据后,按空格键或者回车键,可以数据库中检索出以当前输入数据相关的数据项。(类似于金山词霸中的索引功能)
控件有三个缺点(没有想到好的解决办法)
1、在调用控件前必须为控件添加一个命名为"butname"的htmlinputhidden控件,和添加一个写好的.js文件。
2、在选择数据列表中的数据项时,只能通过鼠标点击不能通过键盘选择。
3、必须手工设置显示数据的列表框的Top,Left 。
如果这三个毛病大家都能容忍,那么非常欢迎大家前来使用。
源码如下:
Coustom.vb
-----------------------------------------------------------------------------------------------------------------------
Imports System
Imports System.Web
Imports System.Web.UI
Imports System.Collections.Specialized
Namespace good_hy
Public Class Coustom
Inherits Control
Implements IPostBackDataHandler, IPostBackEventHandler, INamingContainer
Private _Text As String
Private _Top As Integer
Private _Left As Integer
Private _DataSource As DataTable
Private _DataField As String
Public Property Text() As String '可在后台代码中通过控件属性访问,返回或设置控件的text内容
Get
Dim val As String
val = Page.Request(Me.ID)
_Text = val
Return _Text
End Get
Set(ByVal Value As String)
_Text = Value
Page.RegisterStartupScript(CStr(Rnd() * 100), "<script lanuage=javascript>document.all('" & Me.ID & "').value=" & _Text & ";</script>")
End Set
End Property
Public Property Top() As Integer '可在后台代码中通过控件属性访问,返回或设置控件下拉框显示的top值
Get
Return _Top
End Get
Set(ByVal Value As Integer)
_Top = Value
End Set
End Property
Public Property Left() As Integer '可在后台代码中通过控件属性访问,返回或设置控件下拉框显示的left值
Get
Return _Left
End Get
Set(ByVal Value As Integer)
_Left = Value
End Set
End Property
Public Sub listDatabind(ByVal obj As String, ByVal x As Integer, ByRef y As Integer, ByVal ds As DataTable, ByVal field As String)
'将数据绑定到列表框中
Dim flag As String
flag = Page.Request(Me.ID & "_listvalues")
If Page.IsPostBack And Page.Request("butname") <> "" And flag = "need" Then '判断控件是否被请求显示数据列表
Dim key As String '获取所有控件name,以字符串形式
key = Page.Request("butname")
Dim str As String()
str = Split(key, ",") '提取最后一个控件的name
If Me.ID = str(str.Length - 1 - 1) Then '匹配发出请求控件
Dim i As Integer
Dim values As String
For i = 0 To ds.Rows.Count - 1
values = values & ds.Rows(i)(field) & ";" '生成数据列表,以字符串的形式
Next
Dim js As String '生成在前台运行的脚本语句
js = "<script language=javascript>"
For i = 0 To str.Length - 1 - 1
js = js & "document.all('" & str(i) & "').value='" & Page.Request(str(i)) & "';" '分别为页面上的所有控件的text赋值
Next '实现在postback后,控件的值仍然存在
js = js & "document.all('butname').value='" & key & "';"
key = str(str.Length - 1 - 1) & "_listvalues"
js = js & "document.all('" & key & "').value='" & values & "';"
js = js & "setXY('" & obj & "'," & x & "," & y & ");" '设置控件列表框的top,left
js = js & "showlist();</script>" '显示列表数据
Page.RegisterStartupScript(CStr(Rnd() * 100), js) '注册脚本程序
End If
End If
End Sub
Protected Overrides Sub Render(ByVal output As System.Web.UI.HtmlTextWriter)
MyBase.Render(output)
output.Write("<table border=1 cellpadding=0 cellspacing=0><tr><td bgcolor=green>") '输出界面
output.Write("<input type=text name=" & Me.UniqueID & " οnkeypress='getlist(this)'>")
'引起回发的另外一种方法
'output.Write("<input type=text name=" & Me.UniqueID & " onfocus ='getxy(this)' >", Page.GetPostBackEventReference(Me))
output.Write("<input type=hidden name=" & Me.UniqueID & "_listvalues>")
output.Write("<input type=hidden name=" & Me.UniqueID & "hidx>")
output.Write("<input type=hidden name=" & Me.UniqueID & "hidy>")
output.Write("</td></tr></table>")
End Sub
Protected Overrides Sub OnPreRender(ByVal e As System.EventArgs)
'预呈现
Page.RegisterClientScriptBlock("key1", "<script language=javascript src='javascript.js'></script>")
MyBase.OnPreRender(e)
End Sub
Public Sub RaisePostBackEvent(ByVal eventArgument As String) Implements IPostBackEventHandler.RaisePostBackEvent
'处理回发事件
End Sub
Public Overridable Sub RaisePostDataChangedEvent() Implements IPostBackDataHandler.RaisePostDataChangedEvent
'发送回发更改通知
End Sub
Public Overridable Function LoadPostData(ByVal postDataKey As String, ByVal values As NameValueCollection) As Boolean Implements IPostBackDataHandler.LoadPostData
'处理回发数据
Page.RegisterRequiresRaiseEvent(Me)
Return False
End Function
End Class
End Namespace
--------------------------------------------------------------------------------------------------------------------
'javascript.js'
var listPopup;
listPopup=window.createPopup();
//-------------------------------------------------------------------------------
function setXY(obj,x,y) //设置列表框的top,left
{
var left,top,width,tmp;
tmp = obj + "hidx";
document.all(tmp).value = x;
tmp = obj + "hidy";
document.all(tmp).value = y;
}
//---------------------------------------------------------------------------------
function showlist() //显示控件列表框,利用popup
{
var listPopupBody = listPopup.document.body;
listPopupBody.style.border ="solid black 1px";
listPopup.document.body.style.fontFamily="宋体"
listPopup.document.body.style.fontSize="9pt"
var listContent
listContent = "<table bgcolor=Moccasin width='100%' height='100%' border=0 cellspacing=0 cellpadding=0><tr>"
listContent = listContent + "<td align=center><SELECT id='listvalue' οnclick='parent.showvalue(document.all(/"listvalue/").options(document.all(/"listvalue/").selectedIndex).innerText)' style='WIDTH: 100%; HEIGHT: 100%' size=2>"
var str,values,oname ;
oname = document.all("butname").value;
var arrname;
str = document.all("butname").value;
arrname = str.split(",");
var y;
y=arrname.length -2; //-2是因为数组最后一个元素为空
oname = arrname[y] + "_listvalues"; //获取发出请求的控件名称
str = document.all(oname).value;
values = str.split(";"); //获取数据
var i;
for (i=0;i<values.length;i++) //生成数据项
{
listContent = listContent + "<OPTION>" + values[i] +"</OPTION>"
}
listContent = listContent + "</SELECT></td>"
listContent = listContent + "</tr></table>";
listPopupBody.innerHTML = listContent;
var left,top,width,tmp;
tmp = arrname[y] + "hidx";
left = document.all(tmp).value;
tmp = arrname[y] + "hidy";
top = document.all(tmp).value;
listPopup.show(top, left, 100, 200, document.body);
}
//---------------------------------------------------------------------------------
function getlist(obj)
{
if (event.keyCode == 13 || event.keyCode ==32)
{
var id;
id = obj.name;
var str;
str = document.all("butname").value; //butname控件专门用来存储控件的name
if ( str.indexOf(id) < 0 ) //确保最后一个name是发出请求的
{
document.all("butname").value = str + obj.name +","; //name之间用","分隔
}
else
{
id = id + ",";
str = str.replace(id,"");
str = str + id;
document.all("butname").value = str;
}
id = obj.name + "_listvalues";
document.all(id).value = "need"; //表示此控件请求显示数据
document.Form1.submit();
}
}
//---------------------------------------------------------------------------------
function showvalue(obj) //通过列表框选择数据值
{
var oname,str,arrname,y;
str = document.all("butname").value;
arrname = str.split(",");
y=arrname.length -2;
oname = arrname[y];
document.all(oname).value = obj;
listPopup.hide();
}
//----------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------
见笑见笑!