SharePoint 添加 自定义 WebControl

介绍下如何在 SharePoint 部署自定义WebControl. 如下图,我们需要在左下方加一个 自定义控件个人活动日历。



新建一个 Class 继承 System.Web.UI.WebControls.WebControl   源码如下:


ContractedBlock.gif ExpandedBlockStart.gif CustomCalendar
public class CustomCalendar : System.Web.UI.WebControls.WebControl {
        Literal redire 
= new Literal ();
        Calendar cal;
        
private string _listName = Command.ClassListName;
        
public string ListName {
            
get { return _listName; }
            
set { _listName = value; }
        }
        
private string _viewName = Command.ClassListView;
        
public string ViewName {
            
get { return _viewName; }
            
set { _viewName = value; }
        }

        
public DateTime StartTime { getset; }
        
public DateTime EndTime { getset; }

        
public List<SPListItem> EventList { getset; }
        
private bool setMonth = false;

        
protected override void OnInit ( EventArgs e ) {
            
this.EnsureChildControls ();
            
this.Load += new EventHandler ( Calendar_Load );
            
base.OnInit ( e );
        }
        
void Calendar_Load ( object sender, EventArgs e ) {

        }
        
protected override void CreateChildControls () {
            cal 
= new System.Web.UI.WebControls.Calendar ();
            
this.cal.ID = "Calendar";
            
this.cal.CssClass = "Calendar_Main";
            
this.cal.BorderWidth = Unit.Pixel ( 0 );
            
this.cal.BorderStyle = BorderStyle.None;
            
this.cal.TitleStyle.CssClass = "Calenader_Header";
            
this.cal.OtherMonthDayStyle.CssClass = "Calendar_IsOtherMonth";
            
this.cal.SelectedDayStyle.CssClass = "Calendar_SelectedDay";
            
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 );
        }
        
protected void RenderEventsByDate ( DateTime selectedDate ) {
            
string url = SPContext.Current.Site.AllWebs [Command.TSWebName].Url + "/Lists/" + ListName.Replace ( ".""" ) + "/" + ViewName + ".aspx?CalendarDate=" +
            
string.Format ( "{0:00}", selectedDate.Day ) + Page.Server.UrlEncode ( "/" ) + string.Format ( "{0:00}", selectedDate.Month ) + Page.Server.UrlEncode ( "/" ) +
            selectedDate.Year.ToString () 
+ "&CalendarPeriod=day";
            redire.Text 
= "<script language='javascript'>window.location='" + url + "'</script>";
        }
        
protected void OnDayRender ( object sender, DayRenderEventArgs e ) {
            CalendarDay day 
= ( ( DayRenderEventArgs ) e ).Day;
            TableCell cell 
= ( ( DayRenderEventArgs ) e ).Cell;
            cell.CssClass 
= "Calendar_Day";
            
if ( !setMonth && day.IsOtherMonth ) {
                StartTime 
= day.Date.AddDays ( 1 - day.Date.Day ).AddMonths ( 1 );
                EndTime 
= StartTime.AddMonths ( 1 ).AddDays ( -1 );
                setMonth 
= true;
                EventList 
= GetEventList ();
            }
            
if ( day.IsToday && !day.IsOtherMonth ) {
                cell.CssClass 
= "Calendar_IsToday";
            } 
else if ( day.IsOtherMonth ) {
                cell.CssClass 
= "Calendar_IsOtherMonth";
                
if ( DateTime.Compare ( day.Date, StartTime ) < 0 ) {
                    DateTime weekend 
= day.Date.AddDays ( 6 - day.Date.DayOfWeek.GetHashCode () );
                    
if ( weekend.Month == day.Date.Month ) {
                        cell.Text 
= "&nbsp;";
                    } 
else {
                        cell.ForeColor 
= System.Drawing.Color.Gray;
                    }
                } 
else if ( DateTime.Compare ( day.Date, StartTime ) > 0 ) {
                    DateTime weekStart 
= day.Date.AddDays ( -day.Date.DayOfWeek.GetHashCode () );
                    
if ( weekStart.Month == day.Date.Month ) {
                        cell.Text 
= "&nbsp;";
                    } 
else {
                        cell.ForeColor 
= System.Drawing.Color.Gray;
                    }
                }
            }
            DateTime dayStart 
= day.Date;
            DateTime dayEnd 
= day.Date.AddDays ( 1 ).AddMinutes ( -1 );
            
if ( EventList.Where ( item =>
                  ( dayStart 
<= ( DateTime ) item ["EventDate"&& ( DateTime ) item ["EventDate"<= dayEnd && dayEnd <= ( DateTime ) item ["EndDate"] ) ||
                  ( ( DateTime ) item [
"EventDate"<= dayStart && dayEnd <= ( DateTime ) item ["EndDate"&& ( DateTime ) item ["EndDate"<= dayEnd ) ||
                  ( ( DateTime ) item [
"EventDate"<= dayStart && dayEnd <= ( DateTime ) item ["EndDate"] ) ||
                  ( dayStart 
<= ( DateTime ) item ["EventDate"&& ( DateTime ) item ["EndDate"<= dayEnd )
                 ).Count () 
> 0 ) {
                cell.CssClass 
= "Calendar_EventDay";
            }
        }
        
protected override void Render ( HtmlTextWriter writer ) {
            EnsureChildControls ();
            redire.RenderControl ( writer );
            cal.RenderControl ( writer );
        }
        
private List<SPListItem> GetEventList () {
            Dao dao 
= new Dao ( Page.Request.Url.Authority, Page.Request.Url.Port.ToString () );
            
return dao.GetEventList ( new CalendarSearchParameter ()
            {
                EndTime 
= EndTime,
                ListName 
= ListName,
                StartTime 
= StartTime
            } );
        }
    }

原理很简单,提取Calender List 里面当月的所有Event ,然后以不同颜色表示,最后Render这个Calender 控件出来。
编译好,在webconfig添加<safecontrol>, 然后在page注册这个控件 如图:





<% @ Register TagPrefix = " uc1 "  Namespace = " SharePoint.Panda.Page "  Assembly = " SharePoint.Panda.Page, Version=1.0.0.0 "   %>

使用的时候

< uc1:CustomCalendar  runat ="server"   />

完工后的结果图:

SharePoint Panda



转载于:https://www.cnblogs.com/chris_thanks/archive/2009/08/21/1551671.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值