做了一个Calendar.ascx(参考自CodeProjects)
思路: 一个TextBox 一个asp:Calendar(一开始隐藏,浮动,放在一个Div里面)
结果: 点TextBox或者图标,出现Calendar ,选完时间写到TextBox或者点关闭图标就关闭 
问题: 转换月份的时候,Calendar就消失
完整代码:
1.Calendar.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="HexieCalendar.ascx.cs" Inherits="UserControl_HexieCalendar" %>
<!--这个函数是实现哪个Calendar显示或隐藏-->
<script type="text/javascript" language="javascript">function <%= this.ClientName %>_SetDisplay(doDisplay)
{
if(doDisplay == true)
{
document.getElementById('<%= this.ClientName %>').style.display='block';      
}
else
{
document.getElementById('<%= this.ClientName %>').style.display='none';   
}
}</script>
<table><tr>
<td  valign="top" align="left" nowrap onclick="javascript:<%= this.ClientName %>_SetDisplay(true);">
<asp:TextBox ID="txtDate" runat="server" MaxLength="10"  OnTextChanged="txtDate_TextChanged"   Width="100px"  ></asp:TextBox>
<asp:Image ID="imgDisplayCalendar" runat="server" ImageUrl="~/images/calendar/calendar.jpg" />
</td>
</tr></table><div id="<%= this.ClientName %>" style=" position:absolute; display:none" >
<table style="background-repeat:no-repeat; font-size:10pt"  cellpadding="1"  cellspacing="0">
 <tr>
   <td  align="right" valign="top" style=" height:14px; font-size:10px; font-weight:bold; font-family:Arial, Helvetica, sans-serif; color:#FFFFFF; background-color:#CCCCCC; ">和谐日历控件&nbsp;&nbsp;&nbsp;
        <a href="#" onclick="<%= this.ClientName %>_SetDisplay(false);">
        <img  id="imgX" alt="" style="border:0; top:0px"  src="../images/calendar/x.gif"/></a>
   </td>
 </tr>
 <tr >
   <td  >
        <asp:Calendar ID="calDate" runat="server"                                  
            OnSelectionChanged="calDate_SelectionChanged"  >                                  
        </asp:Calendar>
   </td>
 </tr>
</table>
</div>2.Calendar.ascx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;public partial class UserControl_HexieCalendar : System.Web.UI.UserControl
{
    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
    }
    protected void Page_Load(object sender, EventArgs e)
    {
       
    }
    public string ClientName //得到自定义名字
    {
        get { return this.ClientID + "_Selectable"; }
    }    protected void txtDate_TextChanged(Object sender, EventArgs e)
    { 
    }
    protected void calDate_SelectionChanged(Object sender, EventArgs e)//把时间写到TextBox
    {
        txtDate.Text = calDate.SelectedDate.ToShortDateString();
    }
}

解决方案 »

  1.   

    txtDate.Text = calDate.SelectedDate.ToString("yyyy-MM-dd");
    转换成自己的格式,不要默认进行转换,有‘可能不同的地方会出现不同的结果
      

  2.   

    好的
    问题是那个月份换的时候 Calendar 关闭了
    有方法吗?
      

  3.   

    就是应用的时候
    有那个月份转换那个 就是前一个月 后一个月 那个
    只要点那个 Div就隐藏了 但我看不出来为什么?
      

  4.   

    问题是那个月份换的时候 Calendar 关闭了?试试txtDate.Text = calDate.SelectedDate.ToShortDateString();
    calDate.Visible=false;
      

  5.   

    div style=" position:absolute; display:none" 
    它初始化就是隐藏的
    然后点击就打开了 然后换月份 回传
    所以又隐藏了 我认为是这样的!
    有没有什么办法解决?
      

  6.   

    <asp:Calendar ID="calDate" runat="server"                                  
                OnSelectionChanged="calDate_SelectionChanged" OnVisibleMonthChanged="calDate_VisibleMonthChanged"  >                                  
            </asp:Calendar>
     protected void calDate_VisibleMonthChanged( object sender, MonthChangedEventArgs e )
      {
        Page.RegisterStartupScript("a", "<script>document.getElementById('" + this.ClientName + "').style.display='block'; </script>");
      }
      

  7.   

    有个用户控件Calendar.ascx
    有2个样式控制  
    StyleSheet.css   Calendar.skin(放在工程内的一个文件夹里)
    请问怎么调用,能实现对控件的控制!
      

  8.   

    效果差不多做出来了,就是那个设了个时间属性,老是取不出来值,或者讲取出来不对,代码给你,麻烦看一下 ,谢谢 ,我想不出来了   全部代码发给你,麻烦有时间看下!
    cs
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;public partial class UserControl_HexieCalendar : System.Web.UI.UserControl
    {
        string _DateValue;    public string DateValue
        {
            get
            {
                return txtDate.Text;
            }
            //set
            //{
            //    _DateValue = value;
            //}
        }    public TextBox theTextBox
        {
            get
            {
                return txtDate;
            }
        }
      
        
        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                string strKey = System.DateTime.Now.ToString();
                for (int i = 0; i < 10000; i++)
                {
                    if (!this.Page.IsClientScriptBlockRegistered(strKey + i.ToString()))
                    {
                        break;
                    }
                }
                Page.RegisterStartupScript(strKey, string.Format("<script language='javascript'>{0}_SetDisplay(false)</script>", this.ClientName));
            }        Page.RegisterStartupScript("st'rKey", string.Format("<script language='javascript'>window.alert({0})</script>", this.txtDate.Text));
        }
        public string ClientName //得到自定义名字
        {
            get { return this.ClientID + "_Selectable"; }
        }    protected void txtDate_TextChanged(Object sender, EventArgs e)
        {     }    protected void calDate_SelectionChanged(Object sender, EventArgs e)//把时间写到TextBox
        {
            txtDate.Text = calDate.SelectedDate.ToString("yyyy-MM-dd");
            _DateValue = calDate.SelectedDate.ToString("yyyy-MM-dd");
            string strKey = System.DateTime.Now.ToString();
            for ( int i = 0; i < 10000; i++)
            {
                if (!this.Page.IsClientScriptBlockRegistered(strKey + i.ToString()))
                {
                    break;
                }
            }
            Page.RegisterStartupScript(strKey, string.Format("<script language='javascript'>{0}_SetDisplay(false)</script>", this.ClientName));
        }
        protected void calDate_VisibleMonthChanged(object sender, MonthChangedEventArgs e)
        {
            string strKey = System.DateTime.Now.ToString();
            for (int i = 0; i < 10000; i++)
            {
                if (!this.Page.IsClientScriptBlockRegistered(strKey + i.ToString()))
                {
                    break;
                }
            }
            Page.RegisterStartupScript(strKey, string.Format("<script language='javascript'>{0}_SetDisplay(true)</script>", this.ClientName));
        }
    }ascx
    <%@ Control Language="C#" AutoEventWireup="true" CodeFile="HexieCalendar.ascx.cs"  Inherits="UserControl_HexieCalendar" %>
    <!--
    决定是隐藏还是显示某Calendar
    另外建一个iframe使其大小跟Div完全相同从而能够覆盖select
    因为div比一般object的渲染度高,所以可以覆盖其他,但是select比div高,
    所以无法覆盖select html控件,于是就用一个更牛的控件iframe去覆盖select
    -->
    <script type="text/javascript" language="javascript">function <%= this.ClientName %>_SetDisplay(doDisplay)
    {
    if(doDisplay == true)
    {
    document.getElementById('<%= this.ClientName %>').style.display='block';      
            document.getElementById('<%= this.ClientName %>_overShelf').style.display = 'block';
    }
    else
    {
    document.getElementById('<%= this.ClientName %>').style.display='none';   
    document.getElementById('<%= this.ClientName %>_overShelf').style.display = 'none';
    }
        document.getElementById('<%= this.ClientName %>_overShelf').style.width = document.getElementById('<%= this.ClientName %>').offsetWidth;
        document.getElementById('<%= this.ClientName %>_overShelf').style.height = document.getElementById('<%= this.ClientName %>').offsetHeight;
        document.getElementById('<%= this.ClientName %>_overShelf').style.top = document.getElementById('<%= this.ClientName %>').offsetTop;
        document.getElementById('<%= this.ClientName %>_overShelf').style.left = document.getElementById('<%= this.ClientName %>').offsetLeft;
        document.getElementById('<%= this.ClientName %>_overShelf').style.x = document.getElementById('<%= this.ClientName %>').offsetTop;
        document.getElementById('<%= this.ClientName %>_overShelf').style.left = document.getElementById('<%= this.ClientName %>').offsetLeft;
        document.getElementById('<%= this.ClientName %>').style.zIndex = 99999;
        document.getElementById('<%= this.ClientName %>_overShelf').style.zIndex = 99999;
        
    }
    </script><iframe id="<%= this.ClientName %>_overShelf" scrolling="no" frameborder="0" 
    style="position:absolute; top:0px; left:0px; display:none;"></iframe><link   href="~style/App_Themes/CalendarTheme/StyleSheet.css"   type="text/css"   rel="stylesheet"/> <table>
    <tr>
        <td  valign="top" align="left" nowrap onclick="javascript:<%= this.ClientName %>_SetDisplay(true);">
            <asp:TextBox ID="txtDate" runat="server" MaxLength="10"  OnTextChanged="txtDate_TextChanged"   Width="100px"  ></asp:TextBox>
            <asp:Image ID="imgDisplayCalendar" runat="server" ImageUrl="~/images/calendar/calendar.jpg" />
        </td>
    </tr>
    </table><div  id="<%= this.ClientName %>" style=" position:absolute; display:none" >
    <table style="background-repeat:no-repeat; font-size:10pt"  cellpadding="0"  cellspacing="0">
     <tr>
       <td  align="right" valign="top" style=" height:14px; font-size:10px; font-weight:bold; font-family:Arial, Helvetica, sans-serif; color:#FFFFFF; background-color:#CCCCCC; ">SELECT DATE&nbsp;&nbsp;&nbsp;
            <a href="#" onclick="<%= this.ClientName %>_SetDisplay(false);">
            <img  id="imgX" alt="" style="border:0; top:0px"  src="../images/calendar/x.gif"/></a>
       </td>
     </tr>
     <tr >
       <td  >
            <asp:Calendar ID="calDate" runat="server"                                  
                OnSelectionChanged="calDate_SelectionChanged" OnVisibleMonthChanged="calDate_VisibleMonthChanged"  >                                  
            </asp:Calendar>
       </td>
     </tr>
    </table>
    </div>
      

  9.   

    差不多全部搞定了 当然还有bug 待测试 
    有机会把代码加到 我那无聊的blog上去  现在结贴