一个ListTextBox自描绘控件

功能:在控件中输入数据后,按空格键或者回车键,可以数据库中检索出以当前输入数据相关的数据项。(类似于金山词霸中的索引功能)
控件有三个缺点(没有想到好的解决办法)
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();
}

//----------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------------
见笑见笑!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值