读书人

自定义控件传值有关问题(100分 急问)

发布时间: 2012-04-17 15:06:33 作者: rapoo

自定义控件传值问题(100分 急问)
我想做一个年月日下拉菜单的自定义控件放到gridview里面,然后选择日期后自动对
gridview里面同一行的textbox传值

具体代码如下
<%@ Control Language= "VB " AutoEventWireup= "false " CodeFile= "RsskYmdDrop.ascx.vb " Inherits= "RsskYmdDrop " %>
<asp:DropDownList ID= "drpYear " runat= "server ">
</asp:DropDownList>
年 <asp:DropDownList ID= "drpMonth " runat= "server ">
</asp:DropDownList>
月 <asp:DropDownList ID= "drpDay " runat= "server ">
</asp:DropDownList> 日  <br />


Partial Class RsskYmdDrop
Inherits System.Web.UI.UserControl


' 年
Private _year As Integer
Public Property year() As Integer
Get
Return _year
End Get
Set(ByVal value As Integer)
_year = value
End Set
End Property

' 月
Private _month As Integer
Public Property month() As Integer
Get
Return _month
End Get
Set(ByVal value As Integer)
_month = value
End Set
End Property

' 日
Private _day As Integer
Public Property day() As Integer
Get
Return _day
End Get
Set(ByVal value As Integer)
_day = value
End Set
End Property

' 日期选择改变之后需要设定具体日期的控件ID
Private _bindClientId As String
Public Property bindClientId() As String
Get
Return _bindClientId


End Get
Set(ByVal value As String)
_bindClientId = value
End Set
End Property

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
' 年
drpYear.Items.Clear()
drpYear.Items.Add( " ")
Dim i As Int16
For i = 2005 To 2020
drpYear.Items.Add(i)
Next
drpYear.Items(_year - 2004).Selected = True
' 月
drpMonth.Items.Clear()
drpMonth.Items.Add( " ")
For i = 1 To 12
drpMonth.Items.Add(i)
Next
drpMonth.Items(_month).Selected = True
' 日
Dim days = getDays(_month)
drpDay.Items.Clear()
drpDay.Items.Add( " ")
For i = 1 To days
drpDay.Items.Add(i)
Next
drpDay.Items(_day).Selected = True

Dim dateSetStr As String = " <script> " + vbCrLf
dateSetStr += "function dateSet(val1, val2, val3, val4) { " + vbCrLf
dateSetStr += "var daysInMonth = new Array(31, 28, 31, 30, 31, 30, 31, 31,30, 31, 30, 31); " + vbCrLf
dateSetStr += "var year = document.all[val1].value -1 " + vbCrLf
dateSetStr += "var month = document.all[val2].value -1 " + vbCrLf


dateSetStr += "if (1 == month) {days= ((0 == year % 4) && (0 != (year % 100))) ||(0 == year % 400) ? 29 : 28}; " + vbCrLf
dateSetStr += "else days = daysInMonth[month]; " + vbCrLf
dateSetStr += " document.all[val3].options.length = 0; " + vbCrLf
dateSetStr += "for (i=1;i <= days;i++) { " + vbCrLf
dateSetStr += " var op = window.document.createElement( 'OPTION '); " + vbCrLf
dateSetStr += " op.value = i; " + vbCrLf
dateSetStr += " op.innerHTML = i; " + vbCrLf
dateSetStr += " document.all[val3].appendChild(op); " + vbCrLf
dateSetStr += "} " + vbCrLf
dateSetStr += "toEDate(val1, val2, val3, val4) " + vbCrLf
dateSetStr += "} " + vbCrLf
dateSetStr += " </script> " + vbCrLf

Page.ClientScript.RegisterClientScriptBlock(Me.GetType, "dateSet ", dateSetStr)

Dim toEDateStr As String = " <script> " + vbCrLf
toEDateStr += "function toEDate(val1, val2, val3,eDate) { " + vbCrLf
toEDateStr += "var yearValue = document.all[val1].value " + vbCrLf
toEDateStr += "var monthValue = document.all[val2].value " + vbCrLf
toEDateStr += "var dayValue = document.all[val3].value " + vbCrLf
toEDateStr += "document.all[eDate].value = yearValue + '- '+monthValue+ '- '+dayValue " + vbCrLf
toEDateStr += "} " + vbCrLf


toEDateStr += " </script> " + vbCrLf

Page.ClientScript.RegisterClientScriptBlock(Me.GetType, "toEDate ", toEDateStr)

drpYear.Attributes.Add( "onChange ", "dateSet( ' " + drpYear.ClientID + " ', ' " + drpMonth.ClientID + " ', ' " + drpDay.ClientID + " ', ' " + _bindClientId + " ') ")
drpMonth.Attributes.Add( "onChange ", "dateSet( ' " + drpYear.ClientID + " ', ' " + drpMonth.ClientID + " ', ' " + drpDay.ClientID + " ', ' " + _bindClientId + " ') ")
drpDay.Attributes.Add( "onChange ", "toEDate( ' " + drpYear.ClientID + " ', ' " + drpMonth.ClientID + " ', ' " + drpDay.ClientID + " ', ' " + _bindClientId + " ') ")
End Sub


Protected Function getDays(ByVal month As String) As Int16
Dim bigMonth() As String = {1, 3, 5, 7, 8, 10, 12}
Dim smallMonth() As String = {4, 6, 9, 11}
Dim runFlg As Boolean = False
If ((year Mod 4 = 0) And (year Mod 100 <> 0)) Or (year Mod 400 = 0) Then
runFlg = True
End If
If InStr(Join(bigMonth, " "), month) > 0 Then
Return 31
ElseIf InStr(Join(smallMonth, " "), month) > 0 Then
Return 29
ElseIf runFlg Then
Return 29
Else
Return 28
End If
End Function


End Class


在具体调用的时候
<asp:TemplateField>
  <HeaderTemplate>
<asp:Label ID= "lblJrgstdtcT " runat= "server " Text= "日期 "> </asp:Label>
</HeaderTemplate>
   <ItemTemplate>
<uc1:RsskYmdDrop ID= "RsskYmdDrop1 " runat= "server " year= ' <%# Eval( "YEAR ") %> ' month= ' <%# Eval( "MONTH ") %> ' day= ' <%# Eval( "DAY ") %> ' bindClientId= " <%=txtYmd.ClientId%> "/>
<br/>
<asp:textbox id= "txtYmd " readonly= "true "/>
   </ItemTemplate>
<HeaderStyle CssClass= "gridViewHeader " Width= "20% " />
  </asp:TemplateField>


出现的问题是:
<uc1:RsskYmdDrop ID= "RsskYmdDrop1 " runat= "server " year= ' <%# Eval( "YEAR ") %> ' month= ' <%# Eval( "MONTH ") %> ' day= ' <%# Eval( "DAY ") %> ' bindClientId= " <%=txtYmd.ClientId%> "/>

1 year= ' <%# Eval( "YEAR ") %> '
数据库中年月日的值传不到自定义控件中

2 bindClientId= " <%=txtYmd.ClientId%> "/>
将 " <%=txtYmd.ClientId%> "当作字符串传给了自定义控件 而没有解析 <%=%> 里面的东西




[解决办法]
谁知道啊,帮帮忙!
[解决办法]
webform不太了解,试试Tag属性,可以让你在控件里存储自定义的信息
[解决办法]
是自定义控件的值传不到引用自定义控件的页面中去
可以在自定义控件中定义相关的变量啊。在应用的页面中,定义一个自定义控件的变量,不就OK了?
[解决办法]
你说的自定义控件是指用户控件还是服务器端控件
[解决办法]
vb.net中 <Bindable(True)> Public Property year() As Integer....

读书人网 >asp.net

热点推荐