The CORE: Schedule XML and the Schedule UI
#region Schedule Settings
#region GET
private string GetMatchData()
{
#region time
System.DateTime _startTime,_endTime;
bool _hasEndTime=false;
try
{
_startTime=Convert.ToDateTime(this.txt_StartDate.Text);
}
catch
{
_startTime=System.DateTime.Now;
}
try
{
_endTime=Convert.ToDateTime(this.txt_EndDate.Text);
_hasEndTime=true;
}
catch
{
_endTime=System.DateTime.Now;
}
#endregion
ScheduleDefinition schedule = new ScheduleDefinition();
schedule.StartDateTime = _startTime;
if(_hasEndTime)
{
schedule.EndDateSpecified = true;
schedule.EndDate=_endTime;
}
schedule.Item = GetPattern();
XmlDocument xmlDoc = GetScheduleAsXml(schedule);
return xmlDoc.OuterXml;
}
private XmlDocument GetScheduleAsXml(ScheduleDefinition schedule)
{
MemoryStream buffer = new MemoryStream();
XmlSerializer xmlSerializer = new XmlSerializer(typeof(ScheduleDefinition));
xmlSerializer.Serialize(buffer, schedule);
buffer.Seek(0, SeekOrigin.Begin);
XmlDocument doc = new XmlDocument();
doc.Load(buffer);
// patch up WhichWeek
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("rp","http://schemas.microsoft.com/sqlserver/2003/12/reporting/reportingservices");
XmlNode node = doc.SelectSingleNode("/ScheduleDefinition/rp:MonthlyDOWRecurrence/rp:WhichWeek", nsmgr);
if(node != null)
{
switch (node.InnerXml)
{
case "FirstWeek":
node.InnerXml = "FIRST_WEEK"; break;
case "SecondWeek":
node.InnerXml = "SECOND_WEEK"; break;
case "ThirdWeek":
node.InnerXml = "THIRD_WEEK"; break;
case "FourthWeek":
node.InnerXml = "FOURTH_WEEK"; break;
case "LastWeek":
node.InnerXml = "LAST_WEEK"; break;
}
}
return doc;
}
//订阅设置参数
#region GetPattern
private RecurrencePattern GetPattern()
{
if(this.rad_ScheduleOnce.Checked)//Once
{
///////////OnceRecurrence
return null;
}
#region monthSelector
MonthsOfYearSelector monthSelector = new MonthsOfYearSelector();
if(this.rad_ScheduleDay.Checked)
{
monthSelector.January =true;
monthSelector.February =true;
monthSelector.March =true;
monthSelector.April =true;
monthSelector.May =true;
monthSelector.June =true;
monthSelector.July =true;
monthSelector.August =true;
monthSelector.September =true;
monthSelector.October =true;
monthSelector.November =true;
monthSelector.December =true;
}
else
{
bool _jan=this.chk_MonthOfJan.Checked,_feb=this.chk_MonthOfFeb.Checked,_mar=this.chk_MonthOfMar.Checked,
_apr=this.chk_MonthOfApr.Checked,_may=this.chk_MonthOfMay.Checked,_jun=this.chk_MonthOfJun.Checked,
_jul=this.chk_MonthOfJul.Checked,_aug=this.chk_MonthOfAug.Checked,_sep=this.chk_MonthOfSep.Checked,
_oct=this.chk_MonthOfOct.Checked,_nov=this.chk_MonthOfNov.Checked,_dec=this.chk_MonthOfDec.Checked;
monthSelector.January =_jan;
monthSelector.February =_feb;
monthSelector.March =_mar;
monthSelector.April =_apr;
monthSelector.May =_may;
monthSelector.June =_jun;
monthSelector.July =_jul;
monthSelector.August =_aug;
monthSelector.September =_sep;
monthSelector.October =_oct;
monthSelector.November =_nov;
monthSelector.December =_dec;
}
#endregion
#region daySelector
DaysOfWeekSelector daySelector=new DaysOfWeekSelector();
if(this.rad_ScheduleDay.Checked && this.rad_EveryWeekDay.Checked)
{
daySelector.Monday =true;
daySelector.Tuesday =true;
daySelector.Wednesday =true;
daySelector.Thursday =true;
daySelector.Friday =true;
daySelector.Saturday =false;
daySelector.Sunday =false;
}
else
{
bool _mon=this.chk_daysOfWeekMon.Checked,_tue=this.chk_daysOfWeekTue.Checked,_wed=this.chk_daysOfWeekWed.Checked,
_thu=this.chk_daysOfWeekThu.Checked,_fri=this.chk_daysOfWeekFri.Checked,_sat=this.chk_daysOfWeekSat.Checked,_sun=this.chk_daysOfWeekSun.Checked;
daySelector.Monday =_mon;
daySelector.Tuesday =_tue;
daySelector.Wednesday =_wed;
daySelector.Thursday =_thu;
daySelector.Friday =_fri;
daySelector.Saturday =_sat;
daySelector.Sunday =_sun;
}
#endregion
if(this.rad_ScheduleHour.Checked)//hourly
{
///////////MinuteRecurrence
int _hour,_min;
#region _hour _min
try
{
_hour=Convert.ToUInt16(this.txt_IntervalHour.Text);
}
catch
{
_hour=0;
}
try
{
_min=Convert.ToUInt16(this.txt_IntervalMinute.Text);
}
catch
{
_min=0;
}
#endregion
MinuteRecurrence patternMin=new MinuteRecurrence();
patternMin.MinutesInterval=_hour*60+_min;
return patternMin;
}
if(this.rad_ScheduleDay.Checked && this.rad_IntervalDay.Checked)//daily
{
///////////DailyRecurrence
int _day;
#region _day
try
{
_day=Convert.ToUInt16(this.txt_IntervalDay.Text);
}
catch
{
_day=0;
}
#endregion
DailyRecurrence patternDay = new DailyRecurrence();
patternDay.DaysInterval=_day;
return patternDay;
}
if(this.rad_ScheduleWeek.Checked ||
(this.rad_ScheduleDay.Checked && (this.rad_WeekDay.Checked || this.rad_EveryWeekDay.Checked)) )//weekly
{
///////////WeeklyRecurrence
WeeklyRecurrence patternWeek=new WeeklyRecurrence();
patternWeek.DaysOfWeek=daySelector;
int _weekInterval=1;
if(this.rad_ScheduleWeek.Checked)
{
#region _weekInterval
try
{
_weekInterval = Convert.ToUInt16(this.txt_IntervalWeek.Text);
}
catch
{
_weekInterval=-1;
}
#endregion
}
if(_weekInterval>-1)
{
patternWeek.WeeksIntervalSpecified=true;
patternWeek.WeeksInterval=_weekInterval;
}
return patternWeek;
}
if(this.rad_ScheduleMonth.Checked && this.rad_MCalendarDate.Checked)//monthly
{
///////////MonthlyRecurrence
string _days=this.txt_CalendarDate.Text;
MonthlyRecurrence patternMon=new MonthlyRecurrence();
patternMon.MonthsOfYear=monthSelector;
patternMon.Days=_days;
return patternMon;
}
///////////MonthlyDOWRecurrence
MonthlyDOWRecurrence patternDOW = new MonthlyDOWRecurrence();
patternDOW.MonthsOfYear=monthSelector;
patternDOW.DaysOfWeek=daySelector;
bool _weekSpecified=(this.rad_ScheduleMonth.Checked && this.rad_MWeekOfMonth.Checked);
if(_weekSpecified)
{
int _week=Convert.ToUInt16(this.drp_MWeekOfMonth.SelectedValue);
#region _week
try
{
_week=Convert.ToUInt16(this.drp_MWeekOfMonth.SelectedValue);
}
catch
{
_week=0;
}
#endregion
patternDOW.WhichWeekSpecified=true;
patternDOW.WhichWeek =(WeekNumberEnum)_week; //0-3 week of month, 4 last week
}
return patternDOW;
}
#endregion
#endregion
#region SET
private ScheduleDefinition GetScheduleFromXml (string sMatchData)
{
MemoryStream vStream = new MemoryStream(System.Text.Encoding.Default.GetBytes(sMatchData));
XmlAttributes attrs = new XmlAttributes();
attrs.XmlElements.Add(new XmlElementAttribute("MinuteRecurrence",typeof(MinuteRecurrence)));
attrs.XmlElements.Add(new XmlElementAttribute("DailyRecurrence",typeof(DailyRecurrence)));
attrs.XmlElements.Add(new XmlElementAttribute("WeeklyRecurrence",typeof(WeeklyRecurrence)));
attrs.XmlElements.Add(new XmlElementAttribute("MonthlyRecurrence",typeof(MonthlyRecurrence)));
attrs.XmlElements.Add(new XmlElementAttribute("MonthlyDOWRecurrence",typeof(MonthlyDOWRecurrence)));
XmlAttributeOverrides attrOver=new XmlAttributeOverrides();
attrOver.Add(typeof(ScheduleDefinition),"ScheduleDefinition",attrs);
XmlSerializer newSr=new XmlSerializer(typeof(ScheduleDefinition),attrOver);
return (ScheduleDefinition)newSr.Deserialize(vStream);
}
private void SetPatten(ScheduleDefinition _ScheduleDefinition)
{
this.txt_StartDate.Text=_ScheduleDefinition.StartDateTime.ToString("yyyy-MM-dd HH:mm");
if(_ScheduleDefinition.EndDateSpecified)
this.txt_EndDate.Text=_ScheduleDefinition.EndDate.ToString("yyyy-MM-dd");
if(_ScheduleDefinition.Item==null)
this.rad_ScheduleOnce.Checked=true;
else
{
switch(_ScheduleDefinition.Item.GetType().Name)
{
case "MinuteRecurrence":
this.rad_ScheduleHour.Checked=true;//Hourly Schedule
this.txt_IntervalHour.Text =string.Format("{0:00}",((MinuteRecurrence)_ScheduleDefinition.Item).MinutesInterval/60);
this.txt_IntervalMinute.Text=string.Format("{0:00}",((MinuteRecurrence)_ScheduleDefinition.Item).MinutesInterval%60);
break;
case "DailyRecurrence":
this.rad_ScheduleDay.Checked=true; this.rad_IntervalDay.Checked=true;//Daily Schedule
this.txt_IntervalDay.Text =string.Format("{0}",((DailyRecurrence)_ScheduleDefinition.Item).DaysInterval);
break;
case "WeeklyRecurrence":
SetDaysOfWeekSelector(((WeeklyRecurrence)_ScheduleDefinition.Item).DaysOfWeek);
if(((WeeklyRecurrence)_ScheduleDefinition.Item).WeeksInterval>1)//Weekly Schedule
{
this.txt_IntervalWeek.Text =string.Format("{0}",((WeeklyRecurrence)_ScheduleDefinition.Item).WeeksInterval);
this.rad_ScheduleWeek.Checked=true;
}
else//Weekly Schedule in Day
{
DaysOfWeekSelector daySel = ((WeeklyRecurrence)_ScheduleDefinition.Item).DaysOfWeek;
if(
daySel.Monday ==true&&
daySel.Tuesday ==true&&
daySel.Wednesday ==true&&
daySel.Thursday ==true&&
daySel.Friday ==true&&
daySel.Saturday ==false&&
daySel.Sunday ==false)
{
this.rad_ScheduleDay.Checked=true; this.rad_EveryWeekDay.Checked=true;//Daily Schedule-EveryWeekDay
}
else
this.rad_ScheduleDay.Checked=true; this.rad_WeekDay.Checked=true;//Daily Schedule-Day Of Week
}
break;
case "MonthlyRecurrence":
this.rad_ScheduleMonth.Checked=true; this.rad_MCalendarDate.Checked=true;//Month Calendar
this.txt_CalendarDate.Text = ((MonthlyRecurrence)_ScheduleDefinition.Item).Days;
SetMonthsOfYearSelector(((MonthlyRecurrence)_ScheduleDefinition.Item).MonthsOfYear);
break;
case "MonthlyDOWRecurrence":
this.rad_ScheduleMonth.Checked=true; this.rad_MWeekOfMonth.Checked=true;//Month DOW
SetDaysOfWeekSelector(((MonthlyDOWRecurrence)_ScheduleDefinition.Item).DaysOfWeek);
SetMonthsOfYearSelector(((MonthlyDOWRecurrence)_ScheduleDefinition.Item).MonthsOfYear);
if(((MonthlyDOWRecurrence)_ScheduleDefinition.Item).WhichWeekSpecified)
{
this.drp_MWeekOfMonth.SelectedValue=string.Format("{0}",(uint)((MonthlyDOWRecurrence)_ScheduleDefinition.Item).WhichWeek);
}
break;
}
}
}
#region Selector
private void SetDaysOfWeekSelector(DaysOfWeekSelector daySelector)
{
this.chk_daysOfWeekMon.Checked = daySelector.Monday;
this.chk_daysOfWeekTue.Checked = daySelector.Tuesday;
this.chk_daysOfWeekWed.Checked = daySelector.Wednesday;
this.chk_daysOfWeekThu.Checked = daySelector.Thursday;
this.chk_daysOfWeekFri.Checked = daySelector.Friday;
this.chk_daysOfWeekSat.Checked = daySelector.Saturday;
this.chk_daysOfWeekSun.Checked = daySelector.Sunday;
}
private void SetMonthsOfYearSelector(MonthsOfYearSelector monthSelector)
{
this.chk_MonthOfJan.Checked = monthSelector.January;
this.chk_MonthOfFeb.Checked =monthSelector.February;
this.chk_MonthOfMar.Checked =monthSelector.March;
this.chk_MonthOfApr.Checked =monthSelector.April;
this.chk_MonthOfMay.Checked =monthSelector.May;
this.chk_MonthOfJun.Checked =monthSelector.June;
this.chk_MonthOfJul.Checked =monthSelector.July;
this.chk_MonthOfAug.Checked =monthSelector.August;
this.chk_MonthOfSep.Checked =monthSelector.September;
this.chk_MonthOfOct.Checked =monthSelector.October;
this.chk_MonthOfNov.Checked =monthSelector.November;
this.chk_MonthOfDec.Checked =monthSelector.December;
}
#endregion
#endregion
#endregion