Я бы использовал асинхронную обратную передачу для события TextChanged, чтобы установить свойство VisibleDate:
aspx:
<asp:UpdatePanel ID="UdpDatePanel" runat="server" UpdateMode="conditional" ChildrenAsTriggers="false" >
<ContentTemplate>
<asp:Calendar ID="Calendar1" runat="server" />
<asp:TextBox ID="TxtDate" AutoPostBack="true" runat="server" />
<asp:CalendarExtender ID="CalendarExtender1" TargetControlID="TxtDate" runat="server" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="TxtDate" EventName="TextChanged" />
</Triggers>
</asp:UpdatePanel>
codebehind:
Public Partial Class CalendarDemo
Inherits System.Web.UI.Page
Private Sub TxtDate_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TxtDate.TextChanged
Dim d As Date
If Date.TryParse(Me.TxtDate.Text, d) Then
Me.Calendar1.VisibleDate = d
End If
End Sub
End Class
На этом путион сохраняет производительность, и вам не придется возиться с javascript, который может измениться в будущих выпусках инструментария asp.net-ajax.