2010-04-08 62 views
1

我正在嘗試使用來自多個來源的代碼構建我自己的日期選擇器。ASP用戶控制問題

爲什麼在可見時不會隱藏日曆?

myDate.ascx

<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="myDate.ascx.vb" 
    Inherits="Website.myDate" %> 

<asp:TextBox ID="dateText" runat="server" > </asp:TextBox> 
<asp:Button ID="dateBtn" runat="server" UseSubmitBehavior="false" Text="x" /> 
<asp:Calendar ID="dateCal" runat="server" ></asp:Calendar> 

myDate.ascx.vb

Partial Public Class myDate 
    Inherits System.Web.UI.UserControl 

    Protected Sub dateCal_SelectionChanged(ByVal sender As Object, ByVal e As EventArgs) Handles dateCal.SelectionChanged 
     dateText.Text = dateCal.SelectedDate ' Update text box' 
     dateCal.Visible = False    ' Hide calendar' 
    End Sub 

    Protected Sub dateCal_VisibleMonthChanged(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.MonthChangedEventArgs) Handles dateCal.VisibleMonthChanged 
     dateCal.Visible = True ' For some reason, changing the month hides the calendar (so show it)' 
    End Sub 

    Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     dateCal.Visible = False ' Hide calendar on load' 
    End Sub 

    Protected Sub dateBtn_Click(ByVal sender As Object, ByVal e As EventArgs) Handles dateBtn.Click 
     dateCal.Visible = Not dateCal.Visible ' On button press, toggle visibility' 
    End Sub 
End Class 

回答

1

首先,如果你想頁面回發之間進行切換控制,你需要使用的ViewState。檢查一下,你的頁面是否使用ViewState。

頁面的EnableViewState在您的情況下必須設置爲true。

另外,檢查你的Page_load函數。

在要隱藏你的日曆

的Page_Load呼籲每當任何按鈕或日曆甚至要上升之前的頁面的加載每次。 所以,你正在改變的可視性爲true,然後在活動使用變更的可視性值:

dateCal.Visible = Not dateCal.Visible 

這使得日曆始終可見,當你在dateBtn

點擊

要清楚你我將下令事件在你的代碼的順序,他們呼籲:

Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     dateCal.Visible = False ' Hide calendar on load' 
    End Sub 

Protected Sub dateCal_SelectionChanged(ByVal sender As Object, ByVal e As EventArgs) Handles dateCal.SelectionChanged 
     dateText.Text = dateCal.SelectedDate ' Update text box' 
     dateCal.Visible = False    ' Hide calendar' 
    End Sub 

Protected Sub dateCal_VisibleMonthChanged(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.MonthChangedEventArgs) Handles dateCal.VisibleMonthChanged 
     dateCal.Visible = True ' For some reason, changing the month hides the calendar (so show it)' 
    End Sub 

Protected Sub dateBtn_Click(ByVal sender As Object, ByVal e As EventArgs) Handles dateBtn.Click 
     dateCal.Visible = Not dateCal.Visible ' On button press, toggle visibility' 
    End Sub 

現在你可以看到每一個當頁面加載時間,Page_Load事件呼喚和隱藏的日曆。

您應該在日曆的ascx文件中設置Visible =「false」。或致電

dateCal.Visible = False 

只有當它的頁面的第一加載(!IsPostBack屬性)

所以,在C#這將是

protected void Page_Load(object sender, EventArgs args) { 
    if (!IsPostback) 
     dateCal.Visible = false; 
} 
+0

所以,回傳是實際刷新一個新的外觀的頁面。那是對的嗎?我如何編寫我的控件來不刷新每個日曆交互中的頁面,就像大多數日期選擇器(例如:www.delta.com)一樣? – Steven 2010-04-08 21:37:57

+0

使用jquery做它的客戶端 - http://stackoverflow.com/questions/94729/need-a-free-datepicker-for-aspx – 2010-04-08 21:50:22

+0

爲此目的,你需要使用javascript數據代替而不是服務器端。嘗試使用http://docs.jquery.com/UI/API/1.8/Datepicker。該頁面包含構建它所需的示例和代碼 – 2010-04-08 21:52:19

2

時可見的,因爲Page_Load中運行它不會隱瞞每次頁面加載包括回發(按鈕點擊等)。

所以你需要使用的IsPostBack屬性設置可見性在Page_Load中:

if Not Page.IsPostBack then 
    dateCal.Visible = False ' Hide calendar on load' 
end if 

有時得到初始化對符合的IsPostBack的Page_Load可能導致的奇怪條件,大規模所以明智地使用它。

我想我會傾向於在ascx文件而不是Page_load中設置屬性。