【发布时间】:2010-04-30 19:12:40
【问题描述】:
当我点击“查询”按钮时,我的 TestID 文本框 TestIDTxt 保留了它的值,但两个 myDatePicker 都是空白的,没有任何值。
问题:如何在回发之间保留 StartDate.SelectedDate 和 EndDate.SelectedDate?
解决方案:
正如多次建议的那样,删除 DateTxt 上的 ReadOnly="true" 会在回发中保留文本值。 (感谢Raj Kaimal!)
然后,我通过 Date.Parse'在 Page_Load() 上为该用户控件自动设置文本值来设置 SelectedDate(日期?)属性,请参见下面的代码。
我从来没有直接使用过 ViewState 对象。
myDatePicker.ascx.vb(最终版)
Imports System.Globalization
Partial Public Class myDate
Inherits System.Web.UI.UserControl
Public Property SelectedDate() As Date?
Get 'Simply return the date'
Return Me.DateTxt_CalendarExtender.SelectedDate
End Get
Set(ByVal value As Date?)
If value = Nothing Then Exit Property
Me.DateTxt_CalendarExtender.SelectedDate = value
Me.DateTxt.Text = Format(value, Me.DateTxt_CalendarExtender.Format)
End Set
End Property
Public Sub Refresh()
Dim tempDate As Date 'SelectedDate is nullable Date (Date?)'
Dim parseState As Boolean = False
parseState = Date.TryParseExact(DateTxt.Text, _
DateTxt_CalendarExtender.Format, _
DateTimeFormatInfo.CurrentInfo, _
DateTimeStyles.None, tempDate)
If parseState Then 'if successful, set the date'
Me.DateTxt_CalendarExtender.SelectedDate = tempDate
End If
End Sub
Private Sub Page_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Load
Me.Refresh()
End Sub
End Class
myDatePicker.ascx.vb(原始)
Partial Public Class myDate
Inherits System.Web.UI.UserControl
Public Property SelectedDate() As Date?
Get
Dim o As Object = ViewState("SelectedDate")
If o = Nothing Then
Return Nothing
End If
Return Date.Parse(o)
End Get
Set(ByVal value As Date?)
ViewState("SelectedDate") = value
End Set
End Property
End Class
myDatePicker.ascx
<%@ Control Language="vb" CodeBehind="myDatePicker.ascx.vb"
Inherits="Website.myDate" AutoEventWireup="false" %>
<%@ Register assembly="AjaxControlToolkit" namespace="AjaxControlToolkit"
tagprefix="asp" %>
<asp:TextBox ID="DateTxt" runat="server" ReadOnly="True" />
<asp:Image ID="DateImg" runat="server" ImageUrl="~/Calendar_scheduleHS.png"
EnableViewState="True" EnableTheming="True" />
<asp:CalendarExtender ID="DateTxt_CalendarExtender" runat="server" Enabled="True"
TargetControlID="DateTxt" PopupButtonID="DateImg"
DefaultView="Days" Format="ddd MMM dd, yyyy"
EnableViewState="True"/>
Default.aspx
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Default.aspx.vb"
Inherits="Website._Default" EnableEventValidation="false"
EnableViewState="true" %>
<%@ Register TagPrefix="my" TagName="DatePicker" Src="~/myDatePicker.ascx" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit"
TagPrefix="ajax" %>
<%@ Register Assembly="..." Namespace="System.Web.UI.WebControls"
TagPrefix="asp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
...
<body>
<form id="form1" runat="server">
<div class="mainbox">
<div class="query">
Start Date<br />
<my:DatePicker ID="StartDate" runat="server" EnableViewState="True" />
End Date
<br />
<my:DatePicker ID="EndDate" runat="server" EnableViewState="True" />
<br/>
<asp:TextBox ID="TestIdTxt" runat="server" /><br />
<div class="query_buttons">
<asp:Button ID="Button1" runat="server" Text="Query" />
</div>
</div>
<asp:GridView ID="GridView1" ... >
</form>
</body>
</html>
Default.aspx.vb
Imports System.Web.Services
Imports System.Web.Script.Services
Imports AjaxControlToolkit
Protected Sub Page_Load(ByVal sender As Object, _
ByVal e As EventArgs) Handles Me.Load
End Sub
Partial Public Class _Default
Inherits System.Web.UI.Page
Protected Sub Button1_Click(ByVal sender As Object, _
ByVal e As EventArgs) Handles Button1.Click
GridView1.DataBind()
End Sub
End Class
【问题讨论】:
-
我看不到你在哪里使用用户控件中的任何值,你能显示那部分吗?还是只是您希望 myDatePicker 显示用户在按下 Button1 之前选择的值?
-
当您说“我如何启用回发”时,您是在问“我如何让我的控件保留它的状态/after/回发”?这可能是其他海报(和我自己)混淆的根源。
-
是的。我适当地更新了问题。谢谢!
-
您是在谈论
SelectedDate保留它的价值(尽管我没有看到任何代码将其设置为任何东西)还是DateTxt? -
两者。我希望用户控件与回发之前完全相同(无论是外观还是价值)。
标签: asp.net vb.net user-controls postback