【问题标题】:ASP User Control IssueASP 用户控制问题
【发布时间】:2010-04-08 19:55:22
【问题描述】:

我正在尝试使用来自多个来源的代码构建自己的日期选择器。

为什么日历在可见时不会隐藏?

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

【问题讨论】:

    标签: asp.net vb.net


    【解决方案1】:

    它在可见时不会隐藏,因为每次加载页面时都会运行 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 中设置属性。

    【讨论】:

      【解决方案2】:

      首先,如果要在页面回发之间切换控件,则需要使用 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;
      }
      

      【讨论】:

      • 所以,回发实际上是刷新了新外观的页面。那是对的吗?如何像大多数日期选择器(例如:www.delta.com)一样,对我的控件进行编码以在每次日历交互时不刷新页面?
      • 使用 Jquery 做客户端 - stackoverflow.com/questions/94729/…
      • 为此,您需要使用 javascript datapicker 而不是服务器端。尝试使用docs.jquery.com/UI/API/1.8/Datepicker。该页面包含构建它所需的示例和代码
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多