高分是手段,求助是目的,散分是结果:用户Calendar控件的问题(月份转换时的bug)

flyin2006 2006-11-02 01:27:38
做了一个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; ">和谐日历控件   
<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();
}
}
...全文
172 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyin2006 2006-11-03
  • 打赏
  • 举报
回复
差不多全部搞定了 当然还有bug 待测试
有机会把代码加到 我那无聊的blog上去 现在结贴
yjh521 2006-11-02
  • 打赏
  • 举报
回复
努力学习中....
flyin2006 2006-11-02
  • 打赏
  • 举报
回复
效果差不多做出来了,就是那个设了个时间属性,老是取不出来值,或者讲取出来不对,代码给你,麻烦看一下 ,谢谢 ,我想不出来了 全部代码发给你,麻烦有时间看下!
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   
<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>

HJS1820 2006-11-02
  • 打赏
  • 举报
回复
幫頂~~
順便接點分~~~~~~
flyin2006 2006-11-02
  • 打赏
  • 举报
回复
有个用户控件Calendar.ascx
有2个样式控制
StyleSheet.css Calendar.skin(放在工程内的一个文件夹里)
请问怎么调用,能实现对控件的控制!
flyin2006 2006-11-02
  • 打赏
  • 举报
回复
搞好了 麻烦你了
孟子E章 2006-11-02
  • 打赏
  • 举报
回复
<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>");
}



flyin2006 2006-11-02
  • 打赏
  • 举报
回复
div style=" position:absolute; display:none"
它初始化就是隐藏的
然后点击就打开了 然后换月份 回传
所以又隐藏了 我认为是这样的!
有没有什么办法解决?
flyin2006 2006-11-02
  • 打赏
  • 举报
回复
发现我表达是有问题
flyin2006 2006-11-02
  • 打赏
  • 举报
回复
是想让它换的时候不关闭
jun-2013 2006-11-02
  • 打赏
  • 举报
回复
转换时就到服务器端了,再返回来就又是页面的初始状态了。你的显示和隐藏是在客户端的。返回后没有了以前的状态了。
jndxk 2006-11-02
  • 打赏
  • 举报
回复
mark
孟子E章 2006-11-02
  • 打赏
  • 举报
回复
问题是那个月份换的时候 Calendar 关闭了?试试

txtDate.Text = calDate.SelectedDate.ToShortDateString();
calDate.Visible=false;
flyin2006 2006-11-02
  • 打赏
  • 举报
回复
就是应用的时候
有那个月份转换那个 就是前一个月 后一个月 那个
只要点那个 Div就隐藏了 但我看不出来为什么?
flyin2006 2006-11-02
  • 打赏
  • 举报
回复
麻烦你试一下这个代码
是完整的
孟子E章 2006-11-02
  • 打赏
  • 举报
回复
不明白你的问题是什么
liujia_0421 2006-11-02
  • 打赏
  • 举报
回复
学习了...
flyin2006 2006-11-02
  • 打赏
  • 举报
回复
好的
问题是那个月份换的时候 Calendar 关闭了
有方法吗?
孟子E章 2006-11-02
  • 打赏
  • 举报
回复
txtDate.Text = calDate.SelectedDate.ToString("yyyy-MM-dd");
转换成自己的格式,不要默认进行转换,有‘可能不同的地方会出现不同的结果

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧