有时在显示日历时,有必要阻止周末日期和日期标题中的周末名称显示,有没有办法使用ASP.NET日历控件执行此操作?
提供控件时,如果不覆盖控件,则无法执行此操作.这样做的一种方法是覆盖OnDayRender和Render方法,以便在将信息发送回客户端之前从输出中删除信息.
以下是渲染时控件的外观的屏幕截图:
以下是一个基本的控件覆盖,演示从控件中删除周末日列.
/*------------------------------------------------------------------------------ * Author - Rob (http://stackoverflow.com/users/1185/rob) * ----------------------------------------------------------------------------- * Notes * - This might not be the best way of doing things, so you should test it * before using it in production code. * - This control was inspired by Mike Ellison's article on The Code Project * found here: http://www.codeproject.com/aspnet/MellDataCalendar.asp * ---------------------------------------------------------------------------*/ using System; using System.Web.UI; using System.Web.UI.WebControls; using System.Text; using System.IO; using System.Xml; namespace DataControls { ////// Example of a ASP.NET Calendar control that has been overriden to force /// the weekend columns to be hidden on demand. /// public class DataCalendar : Calendar { private bool _hideWeekend; private int _saturday; private int _sunday; ///Constructor public DataCalendar() : base() { // Default to showing the weekend this._hideWeekend = false; // Set the default values for Saturday and Sunday this.Saturday = 6; this.Sunday = 0; } ////// Indicate if the weekend days should be shown or not, set to true /// if the weekend should be hidden, false otherwise. This field /// defaults to false. /// public bool HideWeekend { get { return this._hideWeekend; } set { this._hideWeekend = value; } } ////// Override the default index for Saturdays. /// ///This option is provided for internationalization options. public int Saturday { get { return this._saturday; } set { this._saturday = value; } } ////// Override the default index for Sundays. /// ///This option is provided for internationalization options. public int Sunday { get { return this._sunday; } set { this._sunday = value; } } ////// Render the day on the calendar with the information provided. /// /// The cell in the table. /// The calendar day information protected override void OnDayRender(TableCell cell, CalendarDay day) { // If this is a weekend day and they should be hidden, remove // them from the output if (day.IsWeekend && this._hideWeekend) { day = null; cell.Visible = false; cell.Text = string.Empty; } // Call the base render method too base.OnDayRender(cell, day); } ////// Render the calendar to the HTML stream provided. /// /// The output control stream to write to. protected override void Render(HtmlTextWriter html) { // Setup a new HtmlTextWriter that the base class will use to render StringBuilder sb = new StringBuilder(); StringWriter sw = new StringWriter(sb); HtmlTextWriter calendar = new HtmlTextWriter(sw); // Call the base Calendar's Render method allowing OnDayRender() // to be executed. base.Render(calendar); // Check to see if we need to remove the weekends from the header, // if we do, then remove the fields and use the new verison for // the output. Otherwise, just use what was previously generated. if (this._hideWeekend && this.ShowDayHeader) { // Load the XHTML to a XML document for processing XmlDocument xml = new XmlDocument(); xml.Load(new StringReader(sw.ToString())); // The Calendar control renders as a table, so navigate to the // second TR which has the day headers. XmlElement root = xml.DocumentElement; XmlNode oldNode = root.SelectNodes("/table/tr")[1]; XmlNode sundayNode = oldNode.ChildNodes[this.Sunday]; XmlNode saturdayNode = oldNode.ChildNodes[this.Saturday]; XmlNode newNode = oldNode; newNode.RemoveChild(sundayNode); newNode.RemoveChild(saturdayNode); root.ReplaceChild(oldNode, newNode); // Replace the buffer html.WriteLine(root.OuterXml); } else { html.WriteLine(sw.ToString()); } } } }