ASP.NET AJAX Toolkit - 在Postback上重置CalendarExtender

时间:2009-06-05 17:33:29

标签: asp.net calendarextender

我有一个ASP.NET页面,它有两个输入元素:

  1. ReadOnly的TextBox。此TextBox是CalendarExtender的TargetControl
  2. 具有AutoPostBack = true的DropDownList
  3. 以下是代码:

    <table border="0" cellpadding="0" cellspacing="0">
      <tr><td colspan="2">Date:</td></tr>
      <tr><td colspan="2">
        <asp:TextBox ID="dateTextBox" runat="server" ReadOnly="true" />
        <ajax:CalendarExtender ID="datePicker" runat="server" Format="MM/dd/yyyy" OnLoad="datePicker_Load" TargetControlID="dateTextBox" />
      </td></tr>
    
      <tr><td colspan="2">Select an Option:</td></tr>
      <tr>
        <td>Name:&nbsp;</td>
        <td><asp:DropDownList ID="optionsDropDownList" runat="server" AutoPostBack="true"  
          OnLoad="optionsDropDownList_Load" 
          OnSelectedIndexChanged="optionsDropDownList_SelectedIndexChanged" 
          DataTextField="Name" DataValueField="ID" />
      </td></tr>
    
      <tr><td><asp:Button ID="saveButton" runat="server" Text="Save" OnClick="saveButton_Click" /></td></tr>
    </table>
    

    当DropDownList回发时,用户使用datePicker选择的日期将重置为当前日期。另外,如果我查看dateTextBox的Text属性,它等于string.Empty。

    如何保留用户在PostBack上选择的日期?

9 个答案:

答案 0 :(得分:12)

当然你必须像其他人已经建议的那样做:动态设置readonly字段而不是标记,并确保在回发期间不会意外地重置Page_Load()中的值...

...但您还必须在Page_Load()内执行以下操作,因为CalendarExtender对象具有必须强制更改的日期的内部副本:

if (IsPostBack)  // do this ONLY during postbacks
{
    if (Request[txtDate.UniqueID] != null)
    {
        if (Request[txtDate.UniqueID].Length > 0)
        {
            txtDate.Text = Request[txtDate.UniqueID];
            txtDateExtender.SelectedDate = DateTime.Parse(Request[txtDate.UniqueID]);
        }
    }
}

答案 1 :(得分:10)

文本框是只读的这一事实似乎导致了这个问题。我在任何绑定事件中都没有使用代码复制您的问题,并且日期仍然消失。但是,当我将文本框更改为ReadOnly = False时,它工作正常。您是否需要将文本框设置为只读,还是可以禁用它或验证输入的日期?

编辑:好的,我有一个答案。根据{{​​3}},只读控件不会发回服务器。因此,当您进行回发时,您将失去只读控件中的值。您将不需要将控件设为只读。

答案 2 :(得分:3)

protected void Page_Load(object sender, EventArgs e)
{
    txt_sdate.Text = Request[txt_sdate.UniqueID];
}

答案 3 :(得分:2)

如果您希望在回发后记住文本框内容并仍然将其保持为只读控件,那么您必须从标记中删除readonly属性,并将其添加到codebehind pageload中:

protected void Page_Load(object sender, EventArgs e){
    TextBox1.Attributes.Add("readonly", "readonly");
    // ...
}

答案 4 :(得分:1)

该问题的解决方案是使用Request.Form集合。由于此集合具有回发到服务器的所有字段的值,并且它具有使用JavaScript等客户端脚本设置的值。

因此,我们需要对获取值服务器端的方式进行一些小改动。

C#

protected void Submit(object sender, EventArgs e)
{
   string date = Request.Form[txtDate.UniqueID];
}

答案 5 :(得分:0)

我怀疑你的datePicker_Load正在设置一些内容,而不是检查它是否在回发中。这将使它每次都发生,看起来像是“重置”。

答案 6 :(得分:0)

不设置ReadOnly =“False”,设置Enabled =“False”。这应该可以解决您的问题。

答案 7 :(得分:0)

@ taeda的回答对我有用。仅供参考,如果有人使用enabled = "false"代替readonly = "true",则无法使用该答案,因为Request[TxtDate.UniqueId]会抛出空例外。

答案 8 :(得分:-1)

保存不是问题,在设置 readonly = true之后,特定文本框的值不会返回给服务器 所以

使用contentEditable="false"制作 readonly = false

除了Calendar Extender之外,还会输入阻止值的选项还会将文本框的值返回给服务器