数据库里有个日期表spdate,字段为date,
  我要把这个表里的数据显示在日历控件里,
 具体的做法就是:表里有数据的那些天在日历控件对应的那些天显示为指定的颜色或标记,
  然后在日历控件里点击哪一天,哪一天就变为指定的颜色,同时那天就存入数据库,在点击下就取消,就跟单选按钮一样,
      该怎么实现呢,怎么绑定日历控件呢
     
   

解决方案 »

  1.   

    给你写了个demo,aspx的(实际上我如果要人写这么个东西必须是ascx的),如果你要转换为ascx自己改吧。你可以直接在你的ajax enabled网站下创建一个aspx,然后把下面的代码完全覆盖到此aspx文件<%@ Page Language="C#" AutoEventWireup="true" CodeFile="TestCalendarDatasource.aspx.cs"
        Inherits="TestCalendarDatasource" %><%@ Assembly Name="System.Collections.Generic" %><script runat="server"> 
        List<DateTime> _ds = null;    List<DateTime> ds
        {
            get
            {
                if (_ds == null)
                    _ds = 读取数据库获得相应月份的日期列表(this.Calendar1.SelectedDate.Year, this.Calendar1.SelectedDate.Month);
                return _ds;
            }
        }    protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
        {
            if (ds.Contains(e.Day.Date))
                e.Cell.BackColor = System.Drawing.Color.Blue;
        }    protected void Calendar1_SelectionChanged(object sender, EventArgs e)
        {
            DateTime d = Calendar1.SelectedDate;
            更新数据库中的日期的选择状态(d);
            _ds = null;  //这使得再读取ds时重新访问数据库
        }    private List<DateTime> 读取数据库获得相应月份的日期列表(int year, int month)
        {
            throw new NotImplementedException();
        }    private void 更新数据库中的日期的选择状态(DateTime d)
        {
            throw new NotImplementedException();
        }
    </script><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server" />
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <asp:Calendar ID="Calendar1" runat="server" OnDayRender="Calendar1_DayRender" OnSelectionChanged="Calendar1_SelectionChanged">
                </asp:Calendar>
            </ContentTemplate>
        </asp:UpdatePanel>
        </form>
    </body>
    </html>
      

  2.   

    哦,没有code-behind代码,第一行请改为<%@ Page Language="C#" %>
      

  3.   

    这里的关键,就是在事件DayRender的处理中修改cell中的内容。实际上,你可以把以一个工作日志(例如一个GridView嵌入Cell,而一定是Calendar控件默认的仅仅显示一个LinkButton)。你自己google一下DayRender怎样编程吧。
      

  4.   

    而一定是Calendar控件默认的仅仅显示一个LinkButton)  -->  而不一定是Calendar控件默认的仅仅显示一个LinkButton)不过Calendar的这个DayRender机制有个毛病,它对状态处理不完善,造成你嵌入GridView更多地适合显示,而无法很方便地交互操作。尽管如此,在Cell中自定义显示内容也是很好的。例如:     protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
        {
            if (ds.Contains(e.Day.Date))
            {
                   Control c=动态创建我自己的控件例如状态用户控件(e.Day.Date);
                 c.ID="日期旁边的扩展内容";
                 e.Cell.Add(c);
            }
        }这样,在日期旁边就可以出现你自己定义的任何控件。
      

  5.   

    第二句应该是 <%@ Import Namespace="System.Collections.Generic" %>呵呵,这个程序写测试程序(给一些日期来模拟读取和更改数据库)有点麻烦,所以我只是手写而没有测试就贴出来了。
      

  6.   

    如何捕获每次点击calendar事件???如果在page_load中实现,可每次取得的都是上次点击的日期。   
      如果在OnSelectChanged()中实现,当连续点击相同的日期时,系统是不会调用这个事件。   
      那如何准确取得点取的日期? 
      

  7.   

        Mark 学习啦
      

  8.   


    namespace SRS.Calendar {
        [Guid ( "9c7c129b-9442-4d16-a30f-c1d43c35c0e3" )]
        public class WebPart1 : System.Web.UI.WebControls.WebParts.WebPart {
            public WebPart1 () {
            }
            System.Web.UI.WebControls.Calendar cal;
            string url;
            Literal redire = new Literal ();        private string _eventName = "SRS.Events";
            [Personalizable ( PersonalizationScope.Shared ), WebBrowsable ( true ), WebDisplayName ( "Event name" ), WebDescription ( "Input event name" )]
            public string eventName {
                get { return _eventName; }
                set { _eventName = value; }
            }
            protected override void OnInit ( EventArgs e ) {
                this.EnsureChildControls ();
                this.Load += new EventHandler (Calendar_Load);
                base.OnInit ( e );
            }
            void Calendar_Load ( object sender, EventArgs e ) {
                if ( string.IsNullOrEmpty ( Page.Request.Url.ToString() ) ) {
                    return;
                }        
            }        protected override void CreateChildControls () {
                cal = new System.Web.UI.WebControls.Calendar ();
                this.cal.ID = "Calendar";
                this.cal.BorderColor = System.Drawing.ColorTranslator.FromHtml ( "#f1f9e2" );
                this.cal.BorderStyle = BorderStyle.Solid;
                this.cal.BorderColor = System.Drawing.ColorTranslator.FromHtml ( "#f1f9e2" );
                this.cal.BorderWidth = 0;
                this.cal.SelectorStyle.Font.Bold = true;
                this.cal.CellPadding = 4;
                this.cal.CellSpacing = 4;
                this.cal.TitleStyle.CssClass = "ms-menutoolbar";
                this.cal.DayHeaderStyle.ForeColor = System.Drawing.ColorTranslator.FromHtml ( "#818080" );
                this.cal.OtherMonthDayStyle.ForeColor = System.Drawing.ColorTranslator.FromHtml ( "#f1f9e2" );
                this.cal.OtherMonthDayStyle.BackColor = System.Drawing.ColorTranslator.FromHtml ( "#f1f9e2" );
                this.cal.OtherMonthDayStyle.Font.Bold = false;
                this.cal.SelectedDayStyle.ForeColor = System.Drawing.ColorTranslator.FromHtml ( "#818080" );
                this.cal.SelectedDayStyle.BackColor = System.Drawing.ColorTranslator.FromHtml ( "#ffffff" );
                this.cal.DayRender += new System.Web.UI.WebControls.DayRenderEventHandler ( OnDayRender );
                this.cal.SelectionChanged += new EventHandler ( this.cal_SelectionChanged );
                this.Controls.Add ( cal );
                this.Controls.Add ( redire );        }
            protected void cal_SelectionChanged ( object sender, EventArgs e ) {
                System.Web.UI.WebControls.Calendar sendCal = ( System.Web.UI.WebControls.Calendar ) sender;
                RenderEventsByDate ( sendCal.SelectedDate );
            }        private void RenderEventsByDate ( DateTime selectedDate ) {
                if ( !string.IsNullOrEmpty ( eventName ) ) {
                    SPSecurity.RunWithElevatedPrivileges ( delegate () {
                        using ( SPSite site = new SPSite ( SPContext.Current.Site.ID ) ) {
                            try {
                                using ( SPWeb web = site.RootWeb ) {
                                    try {
                                        SPList calendarList = web.Lists [eventName];
                                        SPQuery query = new SPQuery ();
                                        query.Query = string.Format ( "<Where><Eq><FieldRef Name='EventDate'/><Value Type='DateTime'>{0}</Value></Eq></Where>", SPUtility.CreateISO8601DateTimeFromSystemDateTime ( selectedDate ) );
                                        SPListItemCollection calendarItems = calendarList.GetItems ( query );
                                        url = SPContext.Current.Web.Url + "/Lists/" + eventName.Replace ( ".", "" ) + "/calendar.aspx?CalendarDate=" +
                                             selectedDate.Month.ToString () + "/" + selectedDate.Day.ToString () + "/" +
                                             selectedDate.Year.ToString () + "&CalendarPeriod=month";
                                        redire.Text = "<script language='javascript'>window.location='" + url + "'</script>";                                } catch ( Exception ee ) {
                                        web.Dispose ();
                                        string error = ee.ToString ();
                                    }
                                }
                            } catch ( Exception ee ) {
                                site.Dispose ();
                                string error = ee.ToString ();
                            }
                        }
                    } );
                }
            }        protected void OnDayRender ( object sender, DayRenderEventArgs e ) {
                CalendarDay day = ( ( DayRenderEventArgs ) e ).Day;
                TableCell cell = ( ( DayRenderEventArgs ) e ).Cell;
               
                cell.Style.Add ( "color", "#818080" );
                if ( day.IsToday ) {
                   cell.Font.Bold = true;
                } else if ( day.IsOtherMonth ) {               
                    cell.Style.Add ( "color", "#f1f9e2" );
                }             if ( !string.IsNullOrEmpty ( eventName ) ) {
                    SPSecurity.RunWithElevatedPrivileges ( delegate () {
                        using ( SPSite site = new SPSite ( SPContext.Current.Site.ID ) ) {
                            try {
                                using ( SPWeb web = site.RootWeb ) {
                                    try {
                                        SPQuery query = new SPQuery ();
                                        query.Query = string.Format ( "<Where><Eq><FieldRef Name='EventDate'/><Value Type='DateTime'>{0}</Value></Eq></Where>", SPUtility.CreateISO8601DateTimeFromSystemDateTime ( day.Date ) );
                                        SPListItemCollection calendarItems = web.Lists [eventName].GetItems ( query );
                                        if ( calendarItems.Count > 0 ) {
                                            cell.BackColor = System.Drawing.Color.Khaki;
                                        }
                                    } catch ( Exception ee ) {
                                        web.Dispose ();
                                        string error = ee.ToString ();
                                    }
                                }
                            } catch ( Exception ee ) {
                                site.Dispose ();
                                string error = ee.ToString ();
                            }
                        }
                    } );
                }        }
            protected override void Render ( HtmlTextWriter writer ) {
                EnsureChildControls ();
                redire.RenderControl ( writer );
                cal.RenderControl ( writer );
            }
        }
    }
    这是之前 写sharepoint的一个webpart  可以照思路写 ,都是重写那几个函数的...