菜鸟提问——关于自定义控件
下面这个自定义控件只能获取按钮的名称。我的问题是如何获取其中txtUser和txtPwd的text,请指教:
Public Class LoginBox
Inherits System.Web.UI.WebControls.WebControl
Implements IPostBackEventHandler
Event BClick(ByVal buttonName As String)
Protected Overrides Sub CreateChildControls()
Dim str As String
str = _
"<TABLE cellSpacing='0' cellPadding='0' width='200' border='0'>" & _
"<TR>" & _
"<TD height='30' align='center' width='80' style='FONT-SIZE: 12px'>用户名</TD>" & _
"<TD width='120'>"
Dim ctrlL As New LiteralControl(str)
Me.Controls.Add(ctrlL)
Dim ctrlTUser As New TextBox
ctrlTUser.Width = Unit.Pixel(100)
ctrlTUser.ID = "txtUser"
Me.Controls.Add(ctrlTUser)
str = "</td></tr><tr><td height='30' align='center' width='80' style='font-size:12px'>密码</td><td width='120'>"
ctrlL = New LiteralControl(str)
Me.Controls.Add(ctrlL)
Dim ctrlTpwd = New TextBox
ctrlTpwd.Width = Unit.Pixel(100)
ctrlTpwd.ID = "txtPwd"
Me.Controls.Add(ctrlTpwd)
str = "</td></tr><tr><td></td><td align='right'>"
ctrlL = New LiteralControl(str)
Me.Controls.Add(ctrlL)
Dim ctrlB As New Button
ctrlB.Width = Unit.Pixel(50)
ctrlB.Text = "登录"
ctrlB.Attributes("OnClick") = Page.GetPostBackEventReference(Me, ctrlB.Text)
Me.Controls.Add(ctrlB)
str = "</td><tr></table>"
ctrlL = New LiteralControl(str)
Me.Controls.Add(ctrlL)
End Sub
Public Overridable Overloads Sub RaisePostBackEvent(ByVal eventArgument As String) Implements IPostBackEventHandler.RaisePostBackEvent
RaiseEvent BClick(eventArgument)
End Sub
End Class
问题点数:100、回复次数:19Top
1 楼hedonister(冰戈)回复于 2005-02-01 13:31:06 得分 0
vb不是很明白,顶上去吧Top
2 楼liulxmooo(娃娃)回复于 2005-02-01 13:35:39 得分 0
upTop
3 楼bidisty(浪漫草)回复于 2005-02-01 13:39:08 得分 20
若要使控件能够检查客户端发回的窗体数据,控件必须实现 System.Web.UI.IPostBackDataHandler 接口。此接口的协定允许控件确定是否在回发后改变其状态以及引发相应的事件。IPostBackDataHandler 接口包含两个方法。
[Visual Basic]
Public Interface IPostBackDataHandler
Public Function LoadPostData(postDataKey As String, _
postCollection As NameValueCollection) As Boolean
Public Sub RaisePostDataChangedEvent()
End Interface
Top
4 楼duguguiyu1984(把失败扼杀在摇篮中。。。)回复于 2005-02-01 13:42:46 得分 0
直接用 控件id.txtUser.text 不行吗?
你也可以遍历控件control里的控件,取出所有textbox的textTop
5 楼gaofeng2000(高老师)回复于 2005-02-01 13:54:38 得分 0
bidisty(浪漫草) :
能把实现的代码帮写出来吗?我很菜:(Top
6 楼web_gus(树欲静而风不止)回复于 2005-02-01 14:04:51 得分 0
vb不知道,c#里只要在后台文件里写上
public string a
{
get{};
set{};
}
就可以了,帮顶。。。。。。。。。Top
7 楼meixiaofeng(yesmsn)回复于 2005-02-01 14:06:09 得分 0
找错门了吧Top
8 楼bidisty(浪漫草)回复于 2005-02-01 14:06:42 得分 20
角比我多,还让我写:(
下面代码来自己MS
回发后,页框架在发送的内容中搜索与实现 IPostBackDataHandler 的服务器控件的 UniqueID 匹配的值。然后,页框架按顺序在每个实现该接口的控件上调用 LoadPostData。LoadPostData 的两个参数是:标识控件的关键字以及包含发送数据的集合 NameValueCollection。通常实现 LoadPostData,以便在回发后更新控件的状态。以下示例说明用于自定义文本框 (TextBox) 控件的 LoadPostData 实现。
[Visual Basic]
Public Overridable Function LoadPostData(postDataKey As String, postCollection As NameValueCollection) As Boolean
Dim presentValue As String = Text
Dim postedValue As String = postCollection(postDataKey)
If Not presentValue.Equals(postedValue) Then
Text = postedValue
Return True
End If
Return False
End Function
如果控件状态因回发而更改,则 LoadPostData 返回 true;否则返回 false。页框架跟踪所有返回 true 的控件并在这些控件上调用 RaisePostDataChangedEvent。更改事件(如果有)就是从该方法引发的。因此,回发数据处理分两个阶段进行,即更新状态和引发更改通知。这可防止在加载回发数据过程中引发更改通知,在该过程中,更改通知可能在各控件加载回发数据之前错误地修改状态。以下代码片段显示了用于自定义文本框 (TextBox) 控件的 RaisePostDataChanged 实现。
[Visual Basic]
Public Overridable Sub RaisePostDataChangedEvent()
OnTextChanged(EventArgs.Empty)
End Sub
呈现逻辑必须为控件的名称特性分配 UniqueID。否则,页框架就无法将回发数据传送给控件。如果控件发出多个窗体元素,则至少有一个元素必须具有与控件 UniqueID 对应的名称特性。有关发出多个窗体字段的自定义控件的示例,请参见撰写与呈现。以下代码片段将 UniqueID 分配给名称特性。
[Visual Basic]
Protected Overrides Sub Render(output As HtmlTextWriter)
output.AddAttribute(HtmlTextWriterAttribute.Type, "text")
output.AddAttribute(HtmlTextWriterAttribute.Value, me.Text)
output.AddAttribute(HtmlTextWriterAttribute.Name, me.UniqueID)
output.RenderBeginTag(HtmlTextWriterTag.Input)
output.RenderEndTag()
End Sub
看看可能明白吧Top
9 楼njuzgj(罐子)回复于 2005-02-01 14:47:10 得分 0
UPTop
10 楼haoco()回复于 2005-02-01 16:03:04 得分 0
upTop
11 楼minghui000(沉迷网络游戏)回复于 2005-02-01 16:28:09 得分 0
upTop
12 楼rickjelly2004(每逢佳节倍思亲-------------快乐生活)回复于 2005-02-01 16:41:23 得分 20
txtUser和txtPwd
的定义不是象你这样定义的,你要用
PRIVATE txtUser as textbox
你要改ID的话,要在从在父控件的ID中写Top
13 楼rickjelly2004(每逢佳节倍思亲-------------快乐生活)回复于 2005-02-01 16:44:32 得分 20
Private WithEvents txtUser As TextBox
Private WithEvents txtPwd As TextBox
Public Overrides Property ID() As String
Get
Me.EnsureChildControls()
mIDs = IIf(viewstate("id") Is Nothing, MyBase.ID, viewstate("id"))
txtUser.ID = mIDs & "_textbox1"
txtPwd.ID = mIDs & "_textbox2"
Return mIDs
End Get
Set(ByVal Value As String)
viewstate("id") = Value
End Set
End Property
Top
14 楼rickjelly2004(每逢佳节倍思亲-------------快乐生活)回复于 2005-02-01 16:46:35 得分 20
<DesignerSerializationVisibility( _
DesignerSerializationVisibility.Content), _
NotifyParentProperty(True), _
PersistenceMode(PersistenceMode.InnerProperty), _
Category("ChildControl"), Description("dfasf")> _
Public ReadOnly Property SubKosyouLabel() As textbox
Get
Me.EnsureChildControls()
Return txtUser
End Get
End PropertyTop
15 楼njuzgj(罐子)回复于 2005-02-01 16:49:11 得分 0
不懂VBTop
16 楼gaofeng2000(高老师)回复于 2005-02-01 16:55:06 得分 0
还是不太明白:(
不知哪里有比较系统点儿的资料,最好是中文的,请大家帮忙推荐一下。多谢!Top
17 楼rickjelly2004(每逢佳节倍思亲-------------快乐生活)回复于 2005-02-01 16:58:29 得分 0
看看我的BLOG,我上面有个翻页控件的,你看看Top
18 楼gaofeng2000(高老师)回复于 2005-02-01 17:00:00 得分 0
好的,多谢!
C#的也可以。
收工!明天再搞……Top
19 楼CreaTive1911(草草了之)回复于 2005-02-01 17:17:31 得分 0
你把这两个控件做为成员变量
例如: private ctrlTpwd As TextBox;
在 CreateChildControls()里就直接 ctrlTpwd = new xxxxxx
然后在btn的事件里ctrlTpwd .textTop




