i’ll explain the code below on another day .
when we remove the highlights on calender with clicks, it will remove the data on ax
and do the same when we add highlights on calendar.
on design
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="HRSUploadTimeSheet.ascx.cs" Inherits="HRSUploadTimeSheet" %> <dynamics:AxDataSource ID="hrsScheduleRequestWorkerTmpDS" runat="server" DataSetName="HRSScheduleRequestWorkerTmpDS" ProviderView="HRSScheduleRequestWorkerTmp"> </dynamics:AxDataSource> <dynamics:AxDataSource ID="HRSJmgProfileDayDS" runat="server" DataSetName="HRSJmgProfileDayDS" ProviderView="JmgProfileDay"> </dynamics:AxDataSource> <dynamics:AxForm ID="AxForm1" runat="server"> <dynamics:AxMultiColumn ID="AxMultiColumn1" runat="server"> <dynamics:AxColumn ID="AxColumn1" runat="server"> <dynamics:AxGridView ID="AxGridView1" runat="server" BodyHeight="" DataKeyNames="ProfileId" DataMember="HRSScheduleRequestWorkerTmp" DataSetCachingKey="09d6aa10-4163-4e45-9074-8449211996ae" DataSourceID="hrsScheduleRequestWorkerTmpDS" EnableModelValidation="True" AllowPaging="False" onselectedindexchanged="AxGridView1_SelectedIndexChanged" ShowFilter="False"> <Columns> <asp:TemplateField ConvertEmptyStringToNull="False" HeaderText="<%$ AxLabel:@SYS303656 %>" SortExpression="PersonnelNumber"> <ItemTemplate> <asp:Label ID="PersonnelNumber" runat="server" Text='<%# Bind("PersonnelNumber") %>'></asp:Label> </ItemTemplate> </asp:TemplateField> <dynamics:AxBoundField DataField="Name" DataSet="HRSScheduleRequestWorkerTmpDS" DataSetView="HRSScheduleRequestWorkerTmp" SortExpression="Name"> </dynamics:AxBoundField> <asp:TemplateField ConvertEmptyStringToNull="False" HeaderText="<%$ AxLabel:@SYS7607 %>" SortExpression="ProfileId"> <ItemTemplate> <asp:Label ID="ProfileId" runat="server" Text='<%# Bind("ProfileId") %>'></asp:Label> </ItemTemplate> </asp:TemplateField> </Columns> </dynamics:AxGridView> </dynamics:AxColumn> <dynamics:AxColumn ID="AxColumn2" runat="server"> <asp:Calendar ID="Calendar1" runat="server" OnPreRender="Calendar1_PreRender" OnSelectionChanged="Calendar1_SelectionChanged" ondayrender="Calendar1_DayRender" Height="226px" Width="427px"> </asp:Calendar> <dynamics:AxGridView ID="AxGridView2" runat="server" BodyHeight="" DataKeyNames="RecId" DataMember="JmgProfileDay" DataSetCachingKey="a1fd011a-2d33-4680-a45d-c70b2dcaf863" DataSourceID="HRSJmgProfileDayDS" EnableModelValidation="True" ondatabound="AxGridView2_databound" ShowFilter="False" AllowPaging="False" > <Columns> <asp:TemplateField ConvertEmptyStringToNull="False" HeaderText="<%$ AxLabel:@SYS67221 %>" SortExpression="Color"> <ItemTemplate> <asp:Label ID="Color" runat="server" Text='<%# Bind("Color") %>' Visible="false"></asp:Label> </ItemTemplate> </asp:TemplateField> <asp:TemplateField ConvertEmptyStringToNull="False" HeaderText="<%$ AxLabel:@SYS7607 %>" SortExpression="Profile"> <ItemTemplate> <asp:Label ID="Profile" runat="server" Text='<%# Bind("Profile") %>'></asp:Label> </ItemTemplate> </asp:TemplateField> <asp:TemplateField ConvertEmptyStringToNull="False" HeaderText="Profile Key" SortExpression="HRSProfleKey"> <ItemTemplate> <asp:Label ID="ProfileKey" runat="server" Text='<%# Bind("HRSProfleKey") %>'></asp:Label> </ItemTemplate> </asp:TemplateField> <dynamics:AxBoundField DataField="StartWorkTime" DataSet="HRSJmgProfileDayDS" DataSetView="JmgProfileDay" SortExpression="StartWorkTime"> </dynamics:AxBoundField> <dynamics:AxBoundField DataField="EndWorkTime" DataSet="HRSJmgProfileDayDS" DataSetView="JmgProfileDay" SortExpression="EndWorkTime"> </dynamics:AxBoundField> </Columns> </dynamics:AxGridView> </dynamics:AxColumn> </dynamics:AxMultiColumn> </dynamics:AxForm>
.cs file
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.DataVisualization.Charting; using System.Web.UI.WebControls; using Microsoft.Dynamics.Framework.Portal.UI.WebControls; using Microsoft.Dynamics.Framework.Portal.UI.WebControls.WebParts; using System.IO; using System.Data.OleDb; using System.Data; using Proxy = Microsoft.Dynamics.Framework.BusinessConnector.Proxy; using Microsoft.Dynamics.Framework.BusinessConnector.Session; using System.Drawing; using Microsoft.Dynamics.AX.Framework.Portal.Data; using Microsoft.Dynamics.Framework.BusinessConnector.Adapter; public partial class HRSUploadTimeSheet : System.Web.UI.UserControl { private string profileId { get; set; } private string scheduleRequestId { get; set; } private string personnelNumber { get; set; } private Boolean canEdit { get; set; } Dictionary<DateTime, int> dict = new Dictionary<DateTime, int>(); public Dictionary<DateTime, int> SelectedDates { get { if (ViewState["Dates"] == null) { dict.Add(DateTime.MaxValue.AddDays(-2), 0); ViewState["Dates"] = dict; } return (Dictionary<DateTime, int>)ViewState["Dates"]; } set { ViewState["Dates"] = value; } } private ISession AxSession { get { AxBaseWebPart webPart = AxBaseWebPart.GetWebpart(this); return webPart == null ? null : webPart.Session; } } protected void Page_Load(object sender, EventArgs e) { IAxaptaRecordAdapter currentRecord = AxBaseWebPart.GetWebpart(this).ExternalRecord; if (currentRecord != null) { string status = currentRecord.GetField("HRSRequestStatus").ToString(); if (status != "0") { canEdit = false; } else { canEdit = true; } scheduleRequestId = currentRecord.GetField("ScheduleReqestId").ToString(); } if (!IsPostBack) { getProfileIdAndPersonnelNumber(true); getCalendarDataFromAX(); } } #region grid protected void AxGridView2_databound(object sender, EventArgs e) { for (int i = 0; i <= AxGridView2.Rows.Count - 1; i++) { Label colorTxt = (Label)AxGridView2.Rows[i].FindControl("Color"); Color myColor = Color.FromArgb(Convert.ToInt32(colorTxt.Text)); AxGridView2.Rows[i].Cells[0].BackColor = myColor; } getProfileIdAndPersonnelNumber(true); getCalendarDataFromAX(); FilterRows(); } protected void AxGridView1_SelectedIndexChanged(object sender, EventArgs e) { getProfileIdAndPersonnelNumber(); getCalendarDataFromAX(); FilterRows(); } protected void getProfileIdAndPersonnelNumber(Boolean isInit = false) { Label profileIdLbl; Label PersonnelNumberLbl; if (isInit) { profileIdLbl = (Label)AxGridView1.Rows[0].FindControl("ProfileId"); PersonnelNumberLbl = (Label)AxGridView1.Rows[0].FindControl("PersonnelNumber"); } else { profileIdLbl = (Label)AxGridView1.Rows[AxGridView1.SelectedIndex].FindControl("ProfileId"); PersonnelNumberLbl = (Label)AxGridView1.Rows[AxGridView1.SelectedIndex].FindControl("PersonnelNumber"); } profileId = profileIdLbl.Text; personnelNumber = PersonnelNumberLbl.Text; } protected void getCalendarDataFromAX() { SelectedDates.Clear(); SelectedDates.Add(DateTime.MaxValue.AddDays(-2), 0); DateTime keyDate = System.DateTime.Now; int valueInt = 0; Microsoft.Dynamics.AX.ManagedInterop.Container axContainer; axContainer = (Microsoft.Dynamics.AX.ManagedInterop.Container)this.AxSession.AxaptaAdapter.CallStaticRecordMethod("HRSScheduleRequestWorkerTmp", "getDataScheduleByWorker", personnelNumber, scheduleRequestId); for (int i = 1; i <= axContainer.Count; i++) { if (i % 2 != 0) { keyDate = Convert.ToDateTime(axContainer.get_Item(i)); } else { valueInt = Convert.ToInt32(axContainer.get_Item(i)); if (SelectedDates.ContainsKey(keyDate)) { SelectedDates.Remove(keyDate); } SelectedDates.Add(keyDate, valueInt); } } ViewState["Dates"] = SelectedDates; } protected void ShowRows() { // Display all the rows foreach (GridViewRow row in AxGridView2.Rows) { row.Visible = true; } } protected void FilterRows() { ShowRows(); string colProfileId; // Loop through the rows and apply the filter int i = 0; foreach (GridViewRow row1 in AxGridView2.Rows) { Label lblProfile = (Label)AxGridView2.Rows[i].FindControl("Profile"); // Get the filter column values colProfileId = lblProfile.Text; // If the name, visit and discharge fields are not equal to "All" and not equal to the filter value then the row is hidden. if (colProfileId != profileId) { row1.Visible = false; } i++; } } #endregion #region calendar protected void Calendar1_PreRender(object sender, EventArgs e) { // Reset Selected Dates Calendar1.SelectedDates.Clear(); // Select previously Selected Dates foreach (var dt in SelectedDates) { Calendar1.SelectedDates.Add(dt.Key); Color myColor = Color.FromArgb(Convert.ToInt32(dt.Value)); Calendar1.SelectedDayStyle.BackColor = myColor; } } protected void Calendar1_SelectionChanged(object sender, EventArgs e) { if (canEdit) { getProfileIdAndPersonnelNumber(); //Check if selected Date is in the saved list // Remove the Selected Date from the saved list if (SelectedDates.ContainsKey(Calendar1.SelectedDate)) { SelectedDates.Remove(Calendar1.SelectedDate); //delete record in ax , call custom table static method this.AxSession.AxaptaAdapter.CallStaticRecordMethod("HRSScheduleRequestWorkerTmp", "deleteScheduleRequestWorker", personnelNumber, scheduleRequestId, Calendar1.SelectedDate.Date); } else { Label colorTxt = (Label)AxGridView2.Rows[AxGridView2.SelectedIndex].FindControl("Color"); Label profileKey = (Label)AxGridView2.Rows[AxGridView2.SelectedIndex].FindControl("ProfileKey"); SelectedDates.Add(Calendar1.SelectedDate, Convert.ToInt32(colorTxt.Text)); //insert to ax , call custom table static method this.AxSession.AxaptaAdapter.CallStaticRecordMethod("HRSScheduleRequestWorkerTmp", "insertScheduleRequestWorker", personnelNumber, scheduleRequestId, Calendar1.SelectedDate.Date, profileId, profileKey.Text); } ViewState["Dates"] = SelectedDates; } } protected void Calendar1_DayRender(object sender, DayRenderEventArgs e) { if (e.Day.IsSelected == true) { int color = SelectedDates[e.Day.Date]; Color myColor = Color.FromArgb(color); e.Cell.BackColor = myColor; } } #endregion }