2010-04-08 2 views
1

Я пытаюсь создать свой собственный выбор даты, используя код из нескольких источников.ASP User Control Issue

Почему календарь не будет скрыт, если он будет видимым?

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 звонят каждый раз, прежде чем любая кнопка или календарь даже повышается. Таким образом, вы меняете видимость истинные и затем, используя измененное значение видимости в событиях:

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 звонит и скрывает календарь.

Вы должны установить Visible = "false" в файле ascx для календаря. Или позвоните

dateCal.Visible = False 

только при первой загрузке страницы (! IsPostBack недвижимость)

так, в C# это будет

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

Итак, postback - это страница, на самом деле освежающая с новым внешним видом. Это верно? Как я могу закодировать свой элемент управления, чтобы не обновлять страницу при каждом взаимодействии с календарем, например, большинство элементов выбора даты (например: www.delta.com)? – Steven

+0

Сделайте это на стороне клиента, используя JQuery - http://stackoverflow.com/questions/94729/need-a-free-datepicker-for-aspx –

+0

Для этого вам нужно использовать javascript datapicker вместо серверной. Попробуйте использовать http://docs.jquery.com/UI/API/1.8/Datepicker. Эта страница содержит пример и код, необходимые для его создания. –

2

Это не будет скрывать, когда видно, потому что Page_Load работает каждый раз, когда страница загружается, включая обратную передачу (нажатия кнопок и т. д.).

Таким образом, вы должны использовать свойство IsPostBack установить visiblity в Page_Load:

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

Иногда получение инициализации прямо в Page_Load с IsPostBack может привести к массе странных условий, так что используйте его с умом.

Я думаю, что я был бы склонен устанавливать свойство в файле ascx, а не в page_load.