DoomerDGR8
Top achievements
Rank 2
Iron
Iron
Iron
DoomerDGR8
asked on 01 Feb 2011, 04:58 PM
Hi. I'm reading a set of dates from DB and based on the scenario, I've come-up with this:
Now, I'm getting a null exception on sday.TemplateItem. What am I doing wrong. i need to set a tooltip and a back color on a day-cell.
private void LoadLocumDiary() { foreach (Availability AvailabilityL in DbContext.Availabilities.Where(avail=> avail.LocumID == LocumID).OrderBy(date=>date.AvailableDate)) { RadCalendarDay sday = null; switch (AvailabilityL.AvailabilityStatusID) { case 1: //Available sday = new RadCalendarDay(AvailabilityL.AvailableDate) { Disabled = false, Selectable = true, ToolTip = AvailabilityL.AvailabilityStatus.Name }; sday.TemplateItem.BackColor = Color.Green; break; case 2: //Unavailable sday = new RadCalendarDay(AvailabilityL.AvailableDate) { Disabled = false, Selectable = true, ToolTip = AvailabilityL.AvailabilityStatus.Name }; sday.TemplateItem.BackColor = Color.Red; break; case 3: //On Job sday = new RadCalendarDay(AvailabilityL.AvailableDate) { Disabled = false, Selectable = true, ToolTip = AvailabilityL.AvailabilityStatus.Name }; sday.TemplateItem.BackColor = Color.Goldenrod; break; default: break; } CalendarDiary.SpecialDays.Add(sday); } // CalendarDiary.InvalidateCalendar();}Now, I'm getting a null exception on sday.TemplateItem. What am I doing wrong. i need to set a tooltip and a back color on a day-cell.
14 Answers, 1 is accepted
0
Accepted
Richard Slade
Top achievements
Rank 2
answered on 01 Feb 2011, 06:07 PM
Hi again Hassan,
To change the back colour, you'll need to use the ElementRender event (much like the cell formatting event in the RadGridView) .
The template item is null because it is a RadHostItem, and one is not contained in this instance.
Have a look at this documentation which explains the important events in the radCalendar.
Hope that helps
Richard
To change the back colour, you'll need to use the ElementRender event (much like the cell formatting event in the RadGridView) .
The template item is null because it is a RadHostItem, and one is not contained in this instance.
Have a look at this documentation which explains the important events in the radCalendar.
Hope that helps
Richard
0
DoomerDGR8
Top achievements
Rank 2
Iron
Iron
Iron
answered on 02 Feb 2011, 10:00 AM
Excellent answer. The links in the documentation are broken though. More importantly, if I subscribe the RenderElement event, how will I force the calendar to redraw or refresh so that it'll call the event again AFTER i made changes to the under-lying DB?
0
Richard Slade
Top achievements
Rank 2
answered on 02 Feb 2011, 10:42 AM
Hi Hassan,
I think in your situation you would just call RadCalendar1.Update(); though I'd need to see an exmaple to try this out. Give it a go, and if you find you need further help, then just let me know.
Regards,
Richard
I think in your situation you would just call RadCalendar1.Update(); though I'd need to see an exmaple to try this out. Give it a go, and if you find you need further help, then just let me know.
Regards,
Richard
0
DoomerDGR8
Top achievements
Rank 2
Iron
Iron
Iron
answered on 03 Feb 2011, 04:36 PM
okay, the ElementRender event is fired just too many times. Even on selecting a day the UI hangs as it goes through my checks in the event. Can't i access the RadCalendarDay and the LightVisualElement some other way? My new strategy is to have my days customized whenever i want to manually.
Here is what I'm trying to achieve:
Here is what I'm trying to achieve:
private void CalendarDiary_ElementRender(object sender, RenderElementEventArgs e) { if (e.Day.Date < DateTime.Now.Date) { return; } Cursor.Current = Cursors.WaitCursor; foreach (Availability AvailabilityL in ConcernedAvailabilities.Where(avail => avail.AvailableDate == e.Day.Date)) { switch (AvailabilityL.AvailabilityStatusID) { case 1: //Available e.Day.ToolTip = e.Element.ToolTipText = "Available"; e.Element.BackColor = Color.FromArgb(177, 243, 177); e.Element.BackColor2 = Color.LimeGreen; e.Element.BackColor3 = Color.LimeGreen; e.Element.BackColor4 = Color.LimeGreen; e.Element.BorderColor = Color.Black; e.Element.BorderWidth = 1; break; case 2: //Unavailable e.Day.ToolTip = e.Element.ToolTipText = "Unavailable"; e.Element.BackColor = Color.FromArgb(255, 218, 224); e.Element.BackColor2 = Color.LightPink; e.Element.BackColor3 = Color.LightPink; e.Element.BackColor4 = Color.LightPink; e.Element.BorderColor = Color.Black; e.Element.BorderWidth = 1; break; case 3: //On Job e.Day.ToolTip = e.Element.ToolTipText = "On Job"; e.Element.BackColor = Color.FromArgb(248, 242, 198); e.Element.BackColor2 = Color.Khaki; e.Element.BackColor3 = Color.Khaki; e.Element.BackColor4 = Color.Khaki; e.Element.BorderColor = Color.Black; e.Element.BorderWidth = 1; break; case 4: //Holiday e.Day.ToolTip = e.Element.ToolTipText = "On Holiday"; e.Element.BackColor = Color.FromArgb(222, 239, 245); e.Element.BackColor2 = Color.LightBlue; e.Element.BackColor3 = Color.LightBlue; e.Element.BackColor4 = Color.LightBlue; e.Element.BorderColor = Color.Black; e.Element.BorderWidth = 1; break; default: break; } } Cursor.Current = Cursors.Default;}0
Richard Slade
Top achievements
Rank 2
answered on 03 Feb 2011, 05:31 PM
Hi,
There is another way to loop over the cells in the calendar. You would need to do this each time the calendar changes month to check for special days and colour them .
Let me know if that helps
Richard
There is another way to loop over the cells in the calendar. You would need to do this each time the calendar changes month to check for special days and colour them .
CalendarTableElement table = (CalendarTableElement)this.RadCalendar1.CalendarElement.CalendarVisualElement.Children[0].Children[1]; foreach (CalendarCellElement cell in table.Children) { if (cell.SpecialDay) { switch (true) { case cell.Date == Today: cell.BackColor = Color.Blue; cell.NumberOfColors = 1; break; case cell.Date == Today.AddDays(1): cell.BackColor = Color.Green; cell.NumberOfColors = 1; break; case cell.Date == Today.AddDays(2): cell.BackColor = Color.Pink; cell.NumberOfColors = 1; break; } } } Let me know if that helps
Richard
0
DoomerDGR8
Top achievements
Rank 2
Iron
Iron
Iron
answered on 04 Feb 2011, 12:56 PM
I still stuck with this...
here is what I have so far:
Now, the
here is what I have so far:
private void CustomPainting() { CalendarTableElement table = (CalendarTableElement)CalendarDiary.CalendarElement.CalendarVisualElement.Children[0].Children[1]; var req = table.Children; //.Where(x => x is CalendarCellElement); foreach (CalendarCellElement cell in req) { if (ConcernedAvailabilities.Any(avail => avail.AvailableDate.Date == cell.Date.Date)) { Availability AvailabilityL = ConcernedAvailabilities.FirstOrDefault(avail => avail.AvailableDate.Date == cell.Date.Date); switch (AvailabilityL.AvailabilityStatusID) { case 1: //Available cell.ToolTipText = "Available"; cell.BackColor = Color.FromArgb(177, 243, 177); cell.NumberOfColors = 1; cell.BorderColor = Color.Black; cell.BorderWidth = 1; break; case 2: //Unavailable cell.ToolTipText = "Unavailable"; cell.BackColor = Color.FromArgb(255, 218, 224); cell.NumberOfColors = 1; cell.BorderColor = Color.Black; cell.BorderWidth = 1; break; case 4: //Holiday cell.ToolTipText = "Holiday"; cell.BackColor = Color.FromArgb(222, 239, 245); cell.NumberOfColors = 1; cell.BorderColor = Color.Black; cell.BorderWidth = 1; break; case 3: //On Job cell.ToolTipText = "On Job"; cell.BackColor = Color.FromArgb(248, 242, 198); cell.NumberOfColors = 1; cell.BorderColor = Color.Black; cell.BorderWidth = 1; break; default: break; } } }}Now, the
table.Children returns four items and they are the four multiview calendars I'm using... what can I do now?0
Accepted
Richard Slade
Top achievements
Rank 2
answered on 04 Feb 2011, 01:26 PM
Hello Hassan,
If I understand you correctly, then you'd need to create an outer loop, to loop over the 4 calendars that are contained within the table.Children.
Hope that helps
Richard
If I understand you correctly, then you'd need to create an outer loop, to loop over the 4 calendars that are contained within the table.Children.
Hope that helps
Richard
0
DoomerDGR8
Top achievements
Rank 2
Iron
Iron
Iron
answered on 04 Feb 2011, 01:35 PM
Did that bit.
The outer for-each is like this now:
what will be the inner loop like?
The outer for-each is like this now:
private void CustomPainting() { CalendarTableElement table = (CalendarTableElement)CalendarDiary.CalendarElement.CalendarVisualElement.Children[0].Children[1]; var req = table.Children.Where(x => x is MonthViewElement); foreach (MonthViewElement cell in req) { if (ConcernedAvailabilities.Any(avail => avail.AvailableDate.Date == cell.Date.Date)) { Availability AvailabilityL = ConcernedAvailabilities.FirstOrDefault(avail => avail.AvailableDate.Date == cell.Date.Date); switch (AvailabilityL.AvailabilityStatusID) { case 1: //Available cell.ToolTipText = "Available"; cell.BackColor = Color.FromArgb(177, 243, 177); cell.NumberOfColors = 1; cell.BorderColor = Color.Black; cell.BorderWidth = 1; break; case 2: //Unavailable cell.ToolTipText = "Unavailable"; cell.BackColor = Color.FromArgb(255, 218, 224); cell.NumberOfColors = 1; cell.BorderColor = Color.Black; cell.BorderWidth = 1; break; case 4: //Holiday cell.ToolTipText = "Holiday"; cell.BackColor = Color.FromArgb(222, 239, 245); cell.NumberOfColors = 1; cell.BorderColor = Color.Black; cell.BorderWidth = 1; break; case 3: //On Job cell.ToolTipText = "On Job"; cell.BackColor = Color.FromArgb(248, 242, 198); cell.NumberOfColors = 1; cell.BorderColor = Color.Black; cell.BorderWidth = 1; break; default: break; } } }}what will be the inner loop like?
0
DoomerDGR8
Top achievements
Rank 2
Iron
Iron
Iron
answered on 04 Feb 2011, 03:15 PM
Okay, I figured the outer and the inner loops as follows:
Problem is, all cells are getting painted. The whole calendar is painted. Maybe i need to implement if-else and in the else, I need to re-set a cell's formatiing. How do I re-set to theme's default?
private void CustomPainting() { Cursor.Current = Cursors.WaitCursor; foreach (MonthViewElement currentMonthViewElement in CalendarDiary.RootElement.Children[0].Children[0].Children[2].Children[0].Children[1].Children) { CalendarTableElement table = (CalendarTableElement)currentMonthViewElement.Children[0].Children[1]; foreach (CalendarCellElement cell in table.Children) { if (ConcernedAvailabilities.Any(avail => avail.AvailableDate.Date == cell.Date.Date)) { Availability AvailabilityL = ConcernedAvailabilities.FirstOrDefault(avail => avail.AvailableDate.Date == cell.Date.Date); switch (AvailabilityL.AvailabilityStatusID) { case 1: //Available cell.ToolTipText = "Available"; cell.BackColor = Color.FromArgb(177, 243, 177); cell.NumberOfColors = 1; cell.BorderColor = Color.Black; cell.BorderWidth = 1; break; case 2: //Unavailable cell.ToolTipText = "Unavailable"; cell.BackColor = Color.FromArgb(255, 218, 224); cell.NumberOfColors = 1; cell.BorderColor = Color.Black; cell.BorderWidth = 1; break; case 4: //Holiday cell.ToolTipText = "Holiday"; cell.BackColor = Color.FromArgb(222, 239, 245); cell.NumberOfColors = 1; cell.BorderColor = Color.Black; cell.BorderWidth = 1; break; case 3: //On Job cell.ToolTipText = "On Job"; cell.BackColor = Color.FromArgb(248, 242, 198); cell.NumberOfColors = 1; cell.BorderColor = Color.Black; cell.BorderWidth = 1; break; default: break; } cell.Invalidate(); } } } Cursor.Current = Cursors.Default;}Problem is, all cells are getting painted. The whole calendar is painted. Maybe i need to implement if-else and in the else, I need to re-set a cell's formatiing. How do I re-set to theme's default?
0
Accepted
Richard Slade
Top achievements
Rank 2
answered on 04 Feb 2011, 03:25 PM
Hi Hassan,
To reset a value, an exmaple (for back color) would be as followis
Hope that helps
Richard
To reset a value, an exmaple (for back color) would be as followis
cell.ResetValue(LightVisualElement.BackColorProperty)Hope that helps
Richard
0
DoomerDGR8
Top achievements
Rank 2
Iron
Iron
Iron
answered on 04 Feb 2011, 04:03 PM
One last thing, handling the else part leaves the whole calender in a washed-out state as all rowheaders and column headers are also a CalendarCellElement. How can I find the DayCellElement only (if there is such a thing)?
0
Richard Slade
Top achievements
Rank 2
answered on 04 Feb 2011, 04:10 PM
Hi Hassan,
As you are looping though, you could just inspect the cell text to see if it's an integer (a day) as the headers will be M,T,W,T,F etc...
E.g.
Hope that helps
Richard
As you are looping though, you could just inspect the cell text to see if it's an integer (a day) as the headers will be M,T,W,T,F etc...
E.g.
Dim result As Integer = -1 If Integer.TryParse(cell.Text, result) Then Debug.WriteLine(result) ' It's a day cell End IfHope that helps
Richard
0
DoomerDGR8
Top achievements
Rank 2
Iron
Iron
Iron
answered on 04 Feb 2011, 04:19 PM
Well, I actually started with that but after much brain hammering, I found a very simple and descent solution:
Final Code:
Looking with Row and Column > 0 puts us in the actual day cells.
Final Code:
private void CustomPainting() { Cursor.Current = Cursors.WaitCursor; foreach (MonthViewElement currentMonthViewElement in CalendarDiary.RootElement.Children[0].Children[0].Children[2].Children[0].Children[1].Children) { var CalendarCellElements = ((CalendarTableElement)currentMonthViewElement.Children[0].Children[1]).Children.OfType < CalendarCellElement>(); //var CalendarCellElements1 = CalendarCellElements.Where(x => x.Tag != null && x.Tag.ToString() == "xCell"); foreach (CalendarCellElement cell in CalendarCellElements.Where(x=> x.Column>0 && x.Row>0)) { if (ConcernedAvailabilities.Any(avail => avail.AvailableDate.Date == cell.Date.Date)) { Availability AvailabilityL = ConcernedAvailabilities.FirstOrDefault(avail => avail.AvailableDate.Date == cell.Date.Date); switch (AvailabilityL.AvailabilityStatusID) { case 1: //Available cell.ToolTipText = "Available"; cell.BackColor = Color.FromArgb(177, 243, 177); cell.NumberOfColors = 1; //cell.BorderColor = Color.Black; //cell.BorderWidth = 1; break; case 2: //Unavailable cell.ToolTipText = "Unavailable"; cell.BackColor = Color.FromArgb(255, 218, 224); cell.NumberOfColors = 1; //cell.BorderColor = Color.Black; //cell.BorderWidth = 1; break; case 4: //Holiday cell.ToolTipText = "Holiday"; cell.BackColor = Color.FromArgb(222, 239, 245); cell.NumberOfColors = 1; //cell.BorderColor = Color.Black; //cell.BorderWidth = 1; break; case 3: //On Job cell.ToolTipText = "On Job"; cell.BackColor = Color.FromArgb(248, 242, 198); cell.NumberOfColors = 1; //cell.BorderColor = Color.Black; //cell.BorderWidth = 1; break; default: break; } cell.Invalidate(); } else { cell.ToolTipText = String.Empty; //cell.ResetValue(LightVisualElement.BorderWidthProperty); //cell.ResetValue(LightVisualElement.BorderColorProperty); cell.ResetValue(LightVisualElement.BackColorProperty); cell.ResetValue(LightVisualElement.NumberOfColorsProperty); cell.Invalidate(); } } } CalendarDiary.InvalidateCalendar(); Cursor.Current = Cursors.Default;}Looking with Row and Column > 0 puts us in the actual day cells.
0
Richard Slade
Top achievements
Rank 2
answered on 04 Feb 2011, 04:37 PM
Glad you have it all sorted.
All the best
Richard
All the best
Richard