Hello,
I have a grid on my page with a GridEditCommandColumn. In the OnItemDataBound of the grid is disable this column for certain gridrows. This works fine. Now when I enter edit mode for one of the items I show in one column a RadCombobox which does an Ajax callback when the selection changes, to fill another depending RadCombobox. This works fine aswell. But the problem is that all rows (including the earlier rows with no edit command) get an Edit command before them. The item being edited stays in edit mode, but just all other rows now also show an edit column/button. I hope the attached screenshots can make more clear what I mean.
The aspx code:
Code behind:
For screenshots see attachments. They will make more clear what I mean.
I have a grid on my page with a GridEditCommandColumn. In the OnItemDataBound of the grid is disable this column for certain gridrows. This works fine. Now when I enter edit mode for one of the items I show in one column a RadCombobox which does an Ajax callback when the selection changes, to fill another depending RadCombobox. This works fine aswell. But the problem is that all rows (including the earlier rows with no edit command) get an Edit command before them. The item being edited stays in edit mode, but just all other rows now also show an edit column/button. I hope the attached screenshots can make more clear what I mean.
The aspx code:
<telerik:RadAjaxManager ID="RadAjaxManager1" runat="server"> <AjaxSettings> <telerik:AjaxSetting AjaxControlID="gridResult"> <UpdatedControls> <telerik:AjaxUpdatedControl ControlID="gridResult" /> <telerik:AjaxUpdatedControl ControlID="lblGewerkt" /> <telerik:AjaxUpdatedControl ControlID="lblZiek" /> <telerik:AjaxUpdatedControl ControlID="lblMutatie" /> <telerik:AjaxUpdatedControl ControlID="txtVakantie" /> <telerik:AjaxUpdatedControl ControlID="txtZiek" /> <telerik:AjaxUpdatedControl ControlID="txtOveruren" /> <telerik:AjaxUpdatedControl ControlID="txtHoursheetsLocal" /> <telerik:AjaxUpdatedControl ControlID="rdpDate" /> </UpdatedControls> </telerik:AjaxSetting> <telerik:AjaxSetting AjaxControlID="rdpDate"> <UpdatedControls> <telerik:AjaxUpdatedControl ControlID="gridResult" /> <telerik:AjaxUpdatedControl ControlID="lblGewerkt" /> <telerik:AjaxUpdatedControl ControlID="lblZiek" /> <telerik:AjaxUpdatedControl ControlID="lblMutatie" /> <telerik:AjaxUpdatedControl ControlID="txtVakantie" /> <telerik:AjaxUpdatedControl ControlID="txtZiek" /> <telerik:AjaxUpdatedControl ControlID="txtOveruren" /> <telerik:AjaxUpdatedControl ControlID="lblWeek" /> <telerik:AjaxUpdatedControl ControlID="lblDag" /> <telerik:AjaxUpdatedControl ControlID="lblBlocked" /> </UpdatedControls> </telerik:AjaxSetting> <telerik:AjaxSetting AjaxControlID="cmbProjects"> <UpdatedControls> <telerik:AjaxUpdatedControl ControlID="gridResult" /> </UpdatedControls> </telerik:AjaxSetting> </AjaxSettings> </telerik:RadAjaxManager> <!-- /RadAjaxManager --> <!-- daysheet !--> <table width="100%" class="ShowValueTable"> <tr> <td class="contents"> <telerik:RadDatePicker runat="server" ID="rdpDate" DateInput-DateFormat="dd-MM-yyyy" Culture="nl-NL" OnSelectedDateChanged="rdpDate_SelectedDateChanged" Enabled="true"> <DatePopupButton runat="server" /> <Calendar ID="Calendar1" runat="server" /> <DateInput ID="DateInput1" runat="server" AutoPostBack="true" DateFormat="dd-MM-yyyy" DisplayDateFormat="dd-MM-yyyy"> <IncrementSettings InterceptMouseWheel="false" /> </DateInput> </telerik:RadDatePicker> <asp:Label runat="server" ID="lblWeek" /> </td> <td class="label"> Vakantie: </td> <td class="contents"> <asp:LinkButton runat="server" CausesValidation="false" ID="txtVakantie" OnClientClick="openWindowMutation"></asp:LinkButton> </td> <td class="label"> Contract: </td> <td class="contents"> <asp:Label runat="server" ID="lblContract" /> </td> </tr> <tr> <td class="contents" rowspan="2" style="text-align: center; font-size: 14pt;"> <asp:Label runat="server" ID="lblDag" /> <asp:Label runat="server" ID="lblBlocked" Font-Size="10pt" Style="color: Red;" /> </td> <td class="label"> Ziek: </td> <td class="contents"> <asp:LinkButton runat="server" CausesValidation="false" ID="txtZiek" OnClientClick="openWindowMutation"></asp:LinkButton> </td> <td class="label"> Gewerkt: </td> <td class="contents"> <asp:Label runat="server" ID="lblGewerkt" /> </td> </tr> <tr> <td class="label"> Overuren: </td> <td class="label"> <asp:LinkButton runat="server" CausesValidation="false" ID="txtOveruren" OnClientClick="openWindowMutation"></asp:LinkButton> </td> <td class="label"> Mutatie: </td> <td class="contents"> <asp:Label runat="server" ID="lblMutatie" /> <asp:Label runat="server" ID="lblMaxZiek" Style="display: none;" /> </td> </tr> </table> <!-- /daysheet !--> <br /> <br /> <!-- hoursheet !--> <telerik:RadGrid runat="server" ID="gridResult" AutoGenerateColumns="False" OnItemDataBound="gridResult_ItemDataBound" OnUpdateCommand="gridResult_UpdateCommand" OnDeleteCommand="gridResult_DeleteCommand" OnInsertCommand="gridResult_InsertCommand" OnNeedDataSource="gridResult_NeedDataSource" OnItemCommand="gridResult_ItemCommand" EnableViewState="true"> <MasterTableView TableLayout="Fixed" DataKeyNames="OID" EditMode="InPlace" CommandItemDisplay="Top" InsertItemDisplay="Bottom" NoMasterRecordsText="Geen taken om weer te geven"> <CommandItemSettings AddNewRecordText="Nieuwe taak toevoegen" ShowRefreshButton="false" /> <SortExpressions> <telerik:GridSortExpression FieldName="Starttijd" SortOrder="Ascending" /> </SortExpressions> <Columns> <telerik:GridEditCommandColumn ButtonType="ImageButton" UniqueName="EditCommandColumn"> <ItemStyle CssClass="MyImageButton" VerticalAlign="Top" /> <HeaderStyle Width="5%"></HeaderStyle> </telerik:GridEditCommandColumn> <telerik:GridBoundColumn UniqueName="OID" DataField="OID" HeaderText="OID" Visible="false" /> <telerik:GridTemplateColumn HeaderText="Starttijd" UniqueName="Starttijd" AllowFiltering="false" HeaderStyle-Width="10%" ItemStyle-VerticalAlign="Top"> <ItemTemplate> <asp:Label ID="lblStartTijd" Text='<%# bind("Starttijd") %>' runat="server" /> </ItemTemplate> <EditItemTemplate> <telerik:RadMaskedTextBox runat="server" SelectionOnFocus="SelectAll" ID="txtStarttijd" Text='<%# bind("Starttijd") %>' Mask="<0..23>:<0..59>" Width="85%"> <ClientEvents OnBlur="BlurStarttijd" OnLoad="InitStarttijd" /> </telerik:RadMaskedTextBox> </EditItemTemplate> <InsertItemTemplate> <telerik:RadMaskedTextBox runat="server" SelectionOnFocus="SelectAll" ID="txtStarttijd" Text='<%# bind("TempStartTime") %>' Mask="<0..23>:<0..59>" Width="85%"> <ClientEvents OnBlur="BlurStarttijd" OnLoad="InitStarttijd" /> </telerik:RadMaskedTextBox> </InsertItemTemplate> </telerik:GridTemplateColumn> <telerik:GridTemplateColumn HeaderText="Eindtijd" UniqueName="Eindtijd" AllowFiltering="false" HeaderStyle-Width="10%" ItemStyle-VerticalAlign="Top"> <ItemTemplate> <asp:Label ID="lblEindTijd" Text='<%# bind("Eindtijd") %>' runat="server" /> </ItemTemplate> <EditItemTemplate> <telerik:RadMaskedTextBox runat="server" ID="txtEindtijd" Text='<%# bind("Eindtijd") %>' Mask="<0..23>:<0..59>" Width="85%"> <ClientEvents OnBlur="BlurEindtijd" OnLoad="InitEindtijd" /> </telerik:RadMaskedTextBox> <asp:CustomValidator ID="CustomValidator1" runat="server" ErrorMessage="Starttijd mag niet plaatsvinden na eindtijd" Text="*" ClientValidationFunction="compareTime" ControlToValidate="txtEindtijd" SetFocusOnError="true"></asp:CustomValidator> <asp:CustomValidator ID="CustomValidator2" runat="server" ErrorMessage="Er mag geen overlap plaatsvinden tussen een of meerdere ingevoerde taken" Text="*" ClientValidationFunction="checkForOverlap" ControlToValidate="txtEindtijd" SetFocusOnError="true"></asp:CustomValidator> </EditItemTemplate> <InsertItemTemplate> <telerik:RadMaskedTextBox runat="server" ID="txtEindtijd" Text='<%# bind("TempEndTime") %>' Mask="<0..23>:<0..59>" Width="85%"> <ClientEvents OnBlur="BlurEindtijd" OnLoad="InitEindtijd" /> </telerik:RadMaskedTextBox> <asp:CustomValidator ID="CustomValidator1" runat="server" ErrorMessage="Starttijd mag niet plaatsvinden na eindtijd" Text="*" ClientValidationFunction="compareTime" ControlToValidate="txtEindtijd" SetFocusOnError="true"></asp:CustomValidator> <asp:CustomValidator ID="CustomValidator2" runat="server" ErrorMessage="Er mag geen overlap plaatsvinden tussen een of meerdere ingevoerde taken" Text="*" ClientValidationFunction="checkForOverlap" ControlToValidate="txtEindtijd" SetFocusOnError="true"></asp:CustomValidator> </InsertItemTemplate> </telerik:GridTemplateColumn> <telerik:GridDropDownColumn DropDownControlType="RadComboBox"></telerik:GridDropDownColumn> <telerik:GridTemplateColumn HeaderText="Project" UniqueName="Project" AllowFiltering="false" HeaderStyle-Width="25%" ItemStyle-VerticalAlign="Top"> <ItemTemplate> <asp:Label ID="lblProject" Text='<%# bind("ProjectNaam") %>' runat="server" /> </ItemTemplate> <EditItemTemplate> <telerik:RadComboBox ID="cmbProjects" MarkFirstMatch="true" AllowCustomText="true" DataSource="<%# getProjects() %>" DataTextField="Naam" DataValueField="ProjectNumber" runat="server" SelectedValue='<%# Eval("ProjectID") %>' OnDataBound="cmbProject_Edit_DataBound" OnSelectedIndexChanged="cmbProject_SelectedIndexChanged" OnTextChanged="cmbProject_TextChanged" AutoPostBack="true" CausesValidation="false" Width="75%" /> <asp:RequiredFieldValidator ID="ProjectValidator2" runat="server" ControlToValidate="cmbProjects" Text="*" ErrorMessage="Project moet ingevuld worden" SetFocusOnError="true" /> </EditItemTemplate> <InsertItemTemplate> <telerik:RadComboBox ID="cmbProjects" MarkFirstMatch="true" AllowCustomText="true" DataSource="<%# getProjects() %>" DataTextField="Naam" DataValueField="ProjectNumber" runat="server" SelectedValue='<%# Eval("ProjectID") %>' OnDataBound="cmbProject_Insert_DataBound" OnSelectedIndexChanged="cmbProject_SelectedIndexChanged" OnTextChanged="cmbProject_TextChanged" AutoPostBack="true" CausesValidation="false" Width="75%" /> <asp:RequiredFieldValidator ID="ProjectValidator2" runat="server" ControlToValidate="cmbProjects" Text="*" ErrorMessage="Project moet ingevuld worden" SetFocusOnError="true" /> </InsertItemTemplate> </telerik:GridTemplateColumn> <telerik:GridTemplateColumn HeaderText="Deelproject" UniqueName="Project" AllowFiltering="false" HeaderStyle-Width="25%" ItemStyle-VerticalAlign="Top"> <ItemTemplate> <asp:Label ID="lblSubProject" Text='<%# bind("SubProjectNaam") %>' runat="server" /> </ItemTemplate> <EditItemTemplate> <telerik:RadComboBox ID="cmbSubProjects" MarkFirstMatch="true" AllowCustomText="true" OnTextChanged="cmbSubProject_TextChanged" AutoPostBack="true" CausesValidation="false" runat="server" Width="75%" /> <asp:RequiredFieldValidator ID="SubProjectValidator2" runat="server" ControlToValidate="cmbSubProjects" Text="*" ErrorMessage="Subproject moet ingevuld worden" /> </EditItemTemplate> <InsertItemTemplate> <telerik:RadComboBox ID="cmbSubProjects" MarkFirstMatch="true" AllowCustomText="true" OnTextChanged="cmbSubProject_TextChanged" AutoPostBack="true" CausesValidation="false" runat="server" Width="75%" /> <asp:RequiredFieldValidator ID="SubProjectValidator2" runat="server" ControlToValidate="cmbSubProjects" Text="*" ErrorMessage="Subproject moet ingevuld worden" /> </InsertItemTemplate> </telerik:GridTemplateColumn> <telerik:GridTemplateColumn HeaderText="Omschrijving" UniqueName="Omschrijving" AllowFiltering="false" HeaderStyle-Width="20%" ItemStyle-VerticalAlign="Top"> <ItemTemplate> <asp:Label ID="lblOmschrijving" Text='<%# bind("Omschrijving") %>' runat="server" /> </ItemTemplate> <EditItemTemplate> <telerik:RadTextBox runat="server" ID="txtOmschrijving" Text='<%# bind("Omschrijving") %>' TextMode="MultiLine" Width="80%" SelectionOnFocus="SelectAll" /> <asp:RequiredFieldValidator ID="omschrijvingValidator" runat="server" ControlToValidate="txtOmschrijving" Text="*" ErrorMessage="Omschrijving moet ingevuld worden" /> </EditItemTemplate> </telerik:GridTemplateColumn> <telerik:GridButtonColumn ButtonType="ImageButton" CommandName="Delete" UniqueName="DeleteCommandColumn" ConfirmDialogType="RadWindow" ConfirmText="Weet u zeker dat u deze taak wilt verwijderen?"> <HeaderStyle Width="5%"></HeaderStyle> <ItemStyle CssClass="MyImageButton" VerticalAlign="Top" /> </telerik:GridButtonColumn> </Columns> </MasterTableView> </telerik:RadGrid> <telerik:GridMaskedColumnEditor ID="GridMaskedColumnEditor1" runat="server" /> <telerik:GridTextBoxColumnEditor ID="GridTextBoxColumnEditor1" runat="server" TextBoxMode="MultiLine" /> <telerik:GridDropDownListColumnEditor ID="GridDropDownListColumnEditor1" runat="server" /> <!-- /hoursheet --> <!-- RadWindow --> <telerik:RadWindow runat="server" ID="windowMutation" Width="375" Height="375" OnClientClose="windowClose" NavigateUrl="AlgemeneUrenInvoer.aspx" Title="Algemene uren bewerken" VisibleStatusbar="false"> </telerik:RadWindow> <!-- /RadWindow --> <!-- hidden buttons (used to force save/add) --> <asp:Button ID="btnAdd" runat="server" Style="display: none" CausesValidation="false" OnClick="AddButton_Click" /> <asp:Button ID="btnSave" runat="server" Style="display: none" OnClick="SaveButton_Click" /> <asp:Button ID="btnSubmit" Style="display: none" CausesValidation="true" runat="server" /> <!-- / hidden buttons --> <!-- hidden fields (used for validation) --> <asp:TextBox runat="server" ID="txtGewerktMin" Style="display: none"></asp:TextBox> <asp:TextBox runat="server" ID="txtZiekteMin" Style="display: none"></asp:TextBox> <asp:TextBox runat="server" ID="txtHoursheetsLocal" Style="display: none"></asp:TextBox> <input type="hidden" id="txtStart" /> <input type="hidden" id="txtEind" /> <!-- / hidden fields --> <!-- ValidationSummary --> <asp:ValidationSummary runat="server" ID="vsum" ShowSummary="false" ShowMessageBox="true" HeaderText="Opslaan is mislukt door de volgende fouten:"></asp:ValidationSummary> <!-- / ValidationSummary -->Code behind:
using System;using System.Linq;using System.Collections.Generic;using UrenCockpit.Business;using UrenCockpit.Process;using System.Web.UI;using System.Web.UI.WebControls;using System.Web;using System.Drawing;using Telerik.Web.UI;using UrenCockpit.Model;using System.Collections.Specialized;using System.Web.Script.Serialization;namespace UrenCockpit.View.Hours{ public partial class UrenInvoer2 : PageExtender { private DateTime _date; private User _user; private const string controlOID = "OID"; private const string controlProject = "cmbProjects"; private const string controlSubProjects = "cmbSubProjects"; private const string controlOmschrijving = "txtOmschrijving"; private const string controlStarttijd = "txtStarttijd"; private const string controlEindtijd = "txtEindtijd"; private const string fieldStarttijd = "Starttijd"; private const string fieldEindtijd = "Eindtijd"; private const string fieldTempStarttijd = "TempStartTime"; private const string fieldTempEindtijd = "TempEndTime"; private const string fieldOmschrijving = "Omschrijving"; private const string fieldSubproject = "Subproject"; private const string fieldProject = "ProjectID"; private const string commandEdit = "EditCommandColumn"; private const string commandDelete = "DeleteCommandColumn"; private const string commandInsert = "InitInsertButton"; protected void Page_Load(object sender, EventArgs e) { if (rdpDate.SelectedDate == null) { if (Session["selectedDate"] != null) { rdpDate.SelectedDate = (DateTime)Session["selectedDate"]; } else { rdpDate.SelectedDate = DateTime.Now; } } _date = rdpDate.SelectedDate.Value; _user = UserInfo.instance.User; if (!IsPostBack) { initForm(); InitialiseDaysheet(); } txtZiek.Attributes.Add("onclick", "openWindowMutation()"); txtVakantie.Attributes.Add("onclick", "openWindowMutation()"); txtOveruren.Attributes.Add("onclick", "openWindowMutation()"); } // Initialise the min and maxvalues for the datepicker control private void initForm() { rdpDate.MaxDate = DateTime.Now; if (_user.pdx_employ_obj.InDienstSinds.HasValue) { rdpDate.MinDate = _user.pdx_employ_obj.InDienstSinds.Value; } else { rdpDate.MinDate = rdpDate.MaxDate; } Session["selectedDate"] = rdpDate.SelectedDate.Value; Daysheet daysheet = Daysheet.getDaysheet(_user.pdx_employ_obj, _date); txtGewerktMin.Text = Utility.minutesToHours(daysheet.NormaleMinuten - daysheet.GewerkteMinuten); } // (Re-)Initialise Daysheet section with values from database private void InitialiseDaysheet() { Daysheet daysheet = Daysheet.getDaysheet(_user.pdx_employ_obj, _date); if (daysheet != null) { short contract = daysheet.NormaleMinuten; short gewerkt = daysheet.GewerkteMinuten; short vakantie = daysheet.VakantieMinuten; short ziek = daysheet.ZiekteMinuten; short overwerk = daysheet.OverMinuten; int mutatie = (gewerkt + vakantie + ziek + overwerk) - contract; SetDaySheetFields(contract, gewerkt, vakantie, ziek, overwerk, mutatie); } } // Set the fields in the Daysheet section private void SetDaySheetFields(short contract, short gewerkt, short vakantie, short ziek, short overwerk, int mutatie) { lblWeek.Text = "Week: " + Utility.getWeekNumber(_date).ToString(); lblDag.Text = Utility.getWeekday(_date.DayOfWeek, false); lblBlocked.Text = hoursConfirmed() ? "<br>bevestigd" : ""; lblContract.Text = Utility.minutesToHours(contract); txtVakantie.Text = Utility.minutesToHours(vakantie); txtZiek.Text = Utility.minutesToHours(ziek); txtOveruren.Text = Utility.minutesToHours(overwerk); lblGewerkt.Text = Utility.minutesToHours(gewerkt); lblMutatie.ForeColor = (mutatie < 0) ? Color.Red : Color.Green; lblMutatie.Text = Utility.minutesToHours(mutatie); lblMaxZiek.Text = Utility.minutesToHours(contract - gewerkt); } // Update current Daysheet values with entered data private void UpdateDaysheet() { Daysheet daysheet = Daysheet.getDaysheet(_user.pdx_employ_obj, _date); short totaalMinuten = CalculateTotalMinutesHoursheet(); daysheet.GewerkteMinuten = totaalMinuten; daysheet.VakantieMinuten = (short)Utility.hourstringToMinutes(txtVakantie.Text); daysheet.ZiekteMinuten = (short)Utility.hourstringToMinutes(txtZiek.Text); daysheet.OverMinuten = (short)Utility.hourstringToMinutes(txtOveruren.Text); txtGewerktMin.Text = Utility.minutesToHours(daysheet.NormaleMinuten - daysheet.GewerkteMinuten); daysheet.Save(); InitialiseDaysheet(); } // Calculate the total minutes value of all the hoursheet rows for this day private short CalculateTotalMinutesHoursheet() { short totaalMinuten = 0; foreach (Hoursheet hs in getHourDetails()) { totaalMinuten += hs.Minuten; } return totaalMinuten; } // Fill projects combobox and set selection if selected is provided private void fillProjects(pdx_Subproject selected, RadComboBox rcbProjects) { rcbProjects.Items.Clear(); foreach (pdx_Project project in getProjects()) { RadComboBoxItem item = new RadComboBoxItem(); item.Value = project.ProjectNumber.ToString(); item.Text = project.Naam; rcbProjects.Items.Add(item); } if (selected != null) { rcbProjects.SelectedValue = selected.pdx_Project.ProjectNumber.ToString(); } } // Fill projects combobox without setting a selection private void fillProjects(RadComboBox rcbProjects) { fillProjects(null, rcbProjects); } // Fill subprojects combobox and set selection if selected is provided private void fillSubProjects(pdx_Project proj, pdx_Subproject selected, RadComboBox comboBox) { IEnumerable<pdx_Subproject> subprojects = proj.pdx_Subprojects.Where(s => s.SubAfgesloten == false); comboBox.Items.Clear(); foreach (pdx_Subproject subproject in subprojects) { RadComboBoxItem item = new RadComboBoxItem(); item.Value = subproject.SubNumber.ToString(); item.Text = subproject.SubNaam; comboBox.Items.Add(item); } if (selected != null) { comboBox.SelectedValue = selected.SubNumber.ToString(); } } // Fill subprojects combobox based on the first project item for a user private void fillSubProjects(RadComboBox comboBox) { IQueryable<pdx_Project> projects = getProjects(); fillSubProjects(projects.FirstOrDefault(), null, comboBox); } // Return the value of any item based by their fieldname private string getGridItemValue(string fieldName, GridEditableItem dataItem) { if (dataItem[fieldName].Controls.Count > 0) { Control control = dataItem[fieldName].Controls[0]; if (control is TextBox) return ((TextBox)control).Text; else if (control is RadMaskedTextBox) return ((RadMaskedTextBox)control).Text; else if (control is RadComboBox) return ((RadComboBox)control).SelectedValue; else return ""; } else { return dataItem[fieldName].Text; } } // Call function to check for breaks and if there are any, add them to a collection private List<BreakSheet> checkForBreaks(IEnumerable<CustomHourSheet> hoursheets) { int diff = 0; List<BreakSheet> breaks = new List<BreakSheet>(); for (int i = 1; i < hoursheets.Count(); i++) { string starttijd = hoursheets.ElementAt(i).Starttijd; string eindtijdvorige = hoursheets.ElementAt(i - 1).Eindtijd; DateTime dt1 = new DateTime(2011, 12, 31, Convert.ToInt32(eindtijdvorige.Substring(0, 2)), Convert.ToInt32(eindtijdvorige.Substring(3, 2)), 0); DateTime dt2 = new DateTime(2011, 12, 31, Convert.ToInt32(starttijd.Substring(0, 2)), Convert.ToInt32(starttijd.Substring(3, 2)), 0); diff = dt2.Subtract(dt1).Minutes; if (diff > 0) { BreakSheet breakSheet = new BreakSheet() { StartTijd = starttijd, EindTijd = eindtijdvorige, Duur = diff }; breaks.Add(breakSheet); } } if (breaks.Count > 0) { return breaks; } return null; } private void DisableEditDisplayForAllRows() { GridDataItemCollection items = gridResult.Items; foreach (GridEditableItem gi in items) { gi[commandDelete].Text = ""; gi[commandEdit].Text = ""; } } private void DisableEditDisplay(GridItemEventArgs e) { GridDataItem gridItem = (GridDataItem)e.Item; gridItem[commandEdit].Text = ""; gridItem[commandDelete].Text = ""; } #region Custom CRUD actions private void DoDelete(GridEditableItem gridEditableItem) { Hoursheet hs = Hoursheet.Retrieve(getGridItemValue(controlOID, gridEditableItem)); hs.Delete(); UpdateDaysheet(); } private void DoInsert(GridEditableItem gridEditableItem) { Hoursheet hs = new Hoursheet(); if (AddOrUpdate(gridEditableItem, hs)) { Hoursheet.Insert(hs, null); UpdateDaysheet(); } } private void DoUpdate(GridEditableItem gridEditableItem) { Hoursheet hs = Hoursheet.Retrieve(getGridItemValue(controlOID, gridEditableItem)); if (AddOrUpdate(gridEditableItem, hs)) { hs.Save(); UpdateDaysheet(); } } private bool AddOrUpdate(GridEditableItem gridEditableItem, Hoursheet hs) { //Add correct date to ensure no default date is taken bool canSave; string date = rdpDate.SelectedDate.Value.ToString("yyyy-MM-dd"); RadMaskedTextBox starttijd = gridEditableItem.FindControl(controlStarttijd) as RadMaskedTextBox; string start = starttijd.TextWithPromptAndLiterals; RadMaskedTextBox eindtijd = gridEditableItem.FindControl(controlEindtijd) as RadMaskedTextBox; string eind = eindtijd.TextWithPromptAndLiterals; hs.Datum = rdpDate.SelectedDate.Value; hs.Starttijd = DateTime.Parse(date + " " + start); hs.Eindtijd = DateTime.Parse(date + " " + eind); hs.PerNumber = _user.pdx_employ_obj.PerNumber; TimeSpan diff = hs.Eindtijd - hs.Starttijd; hs.Minuten = (short)diff.TotalMinutes; RadComboBox cmbProjects = gridEditableItem.FindControl(controlProject) as RadComboBox; RadComboBox cmbSubProjects = gridEditableItem.FindControl(controlSubProjects) as RadComboBox; string project = cmbProjects.SelectedValue; string subProject = cmbSubProjects.SelectedValue; if (subProject.IsNullOrEmpty()) { hs.SubProject = null; canSave = false; } else { hs.SubProject = long.Parse(subProject); canSave = true; } RadTextBox omschrijving = gridEditableItem.FindControl(controlOmschrijving) as RadTextBox; hs.Omschrijving = omschrijving.Text; rdpDate.Enabled = true; return canSave; } #endregion #region Custom Events // Force "add new record" to show, this simulates pressing the "+" button protected void AddButton_Click(object sender, EventArgs e) { ListDictionary newValues = generateEmptyRow(); gridResult.MasterTableView.InsertItem(newValues); gridResult.MasterTableView.IsItemInserted = true; gridResult.Rebind(); GridEditableItem gridItem = (GridEditableItem)gridResult.MasterTableView.GetInsertItem(); gridItem.FindControl(controlStarttijd).Focus(); rdpDate.Enabled = false; } // Generates an empty row that's used to fill with data for a new row later on private System.Collections.Specialized.ListDictionary generateEmptyRow() { System.Collections.Specialized.ListDictionary newValues = new System.Collections.Specialized.ListDictionary(); newValues[fieldStarttijd] = string.Empty; newValues[fieldEindtijd] = string.Empty; newValues[fieldTempStarttijd] = GetTimeForNewrow().ToString("HH:mm"); newValues[fieldTempEindtijd] = GetTimeForNewrow().AddMinutes(15).ToString("HH:mm"); newValues[fieldOmschrijving] = string.Empty; newValues[fieldSubproject] = string.Empty; newValues[fieldProject] = string.Empty; return newValues; } private List<LocalHoursheet> generateLocalHoursheets(List<CustomHourSheet> hoursheets) { List<LocalHoursheet> returnValue = new List<LocalHoursheet>(); DateTime selected = rdpDate.SelectedDate.Value; DateTime compare = new DateTime(selected.Year, selected.Month, selected.Day, 0, 0, 0); foreach (CustomHourSheet chs in hoursheets) { returnValue.Add(new LocalHoursheet() { DiffStartMinuten = (int)(chs.StartDatum - compare).TotalMinutes, DiffEindMinuten = (int)(chs.EindDatum - compare).TotalMinutes, }); } return returnValue; } // Add or update a new record, this simulates pressing the "✔" button protected void SaveButton_Click(object sender, EventArgs e) { bool saved = false; GridEditableItem gridItem = null; if (gridResult.MasterTableView.IsItemInserted || gridResult.EditItems.Count > 0) { if (gridResult.MasterTableView.IsItemInserted) { gridItem = (GridEditableItem)gridResult.MasterTableView.GetInsertItem(); DoInsert(gridItem); saved = true; } else { gridItem = (GridEditableItem)gridResult.EditItems[0]; DoUpdate(gridItem); saved = true; } } if (gridItem != null && saved) { gridItem.Edit = false; gridResult.Rebind(); } } // Fill subprojects with no project selected (from insert mode) protected void cmbProject_Insert_DataBound(object sender, EventArgs e) { GridEditableItem item = ((Control)sender).NamingContainer as GridEditableItem; RadComboBox rcbProject = (RadComboBox)sender; RadComboBox rcbSubProjects = (RadComboBox)item.FindControl(controlSubProjects); if (rcbProject.SelectedIndex > -1 && rcbProject.SelectedValue != "") { pdx_Project project = pdx_Project.Retrieve(rcbProject.SelectedValue); if (project != null) { fillSubProjects(project, null, rcbSubProjects); rcbSubProjects.Focus(); } } } // Fill subprojects with a project selected (from edit mode) protected void cmbProject_Edit_DataBound(object sender, EventArgs e) { GridEditableItem item = ((Control)sender).NamingContainer as GridEditableItem; RadComboBox rcbProject = (RadComboBox)sender; RadComboBox rcbSubProjects = (RadComboBox)item.FindControl(controlSubProjects); if (rcbProject.SelectedIndex > -1 && rcbProject.SelectedValue != "") { pdx_Project project = pdx_Project.Retrieve(rcbProject.SelectedValue); CustomHourSheet hs = (CustomHourSheet)item.DataItem; if (project != null && hs.pdx_Subproject != null) { fillSubProjects(project, hs.pdx_Subproject, rcbSubProjects); rcbSubProjects.Focus(); } } } protected void cmbProject_TextChanged(object sender, EventArgs e) { GridEditableItem item = ((Control)sender).NamingContainer as GridEditableItem; RadComboBox rcbProject = (RadComboBox)sender; RadComboBox rcbSubProjects = (RadComboBox)item.FindControl(controlSubProjects); pdx_Project project = null; // tegengaan van invoer van een niet bestaand project if (rcbProject.SelectedValue == "") { rcbProject.SelectedIndex = 0; } project = pdx_Project.Retrieve(rcbProject.SelectedValue); if (project != null) { fillSubProjects(project, null, rcbSubProjects); rcbSubProjects.SelectedIndex = -1; } rcbSubProjects.Text = ""; rcbSubProjects.Focus(); } protected void cmbProject_SelectedIndexChanged(object sender, RadComboBoxSelectedIndexChangedEventArgs e) { GridEditableItem item = ((Control)sender).NamingContainer as GridEditableItem; RadComboBox rcbProject = (RadComboBox)sender; RadComboBox rcbSubProjects = (RadComboBox)item.FindControl(controlSubProjects); if (rcbProject.SelectedValue != "") { pdx_Project project = pdx_Project.Retrieve(rcbProject.SelectedValue); if (project != null) { fillSubProjects(project, null, rcbSubProjects); rcbSubProjects.SelectedIndex = -1; rcbSubProjects.Text = ""; rcbSubProjects.Focus(); } } } protected void cmbSubProject_TextChanged(object sender, EventArgs e) { GridEditableItem item = ((Control)sender).NamingContainer as GridEditableItem; RadComboBox rcbSubProject = (RadComboBox)sender; RadTextBox txtOmschrijving = (RadTextBox)item.FindControl(controlOmschrijving); // tegengaan van invoer van een niet bestaand project if (rcbSubProject.SelectedValue == "") { rcbSubProject.SelectedIndex = 0; } txtOmschrijving.Focus(); } protected void rdpDate_SelectedDateChanged(object sender, Telerik.Web.UI.Calendar.SelectedDateChangedEventArgs e) { InitialiseDaysheet(); gridResult.Rebind(); rdpDate.Focus(); Session["selectedDate"] = rdpDate.SelectedDate.Value; } #endregion # region Data Access code private DateTime GetTimeForNewrow() { DateTime returnValue = new DateTime(); if (getHourDetails().Count() > 0) { //If there already are hoursheets in the grid, determine new starttime based on max eindtijd DateTime maxDateHS = getHourDetails().Where(h => h.Datum == rdpDate.SelectedDate.Value).Max(h => h.Eindtijd); if (maxDateHS != null) { returnValue = maxDateHS; } // Else determine new starttime by workschedule else { Werkrooster rooster = Werkrooster.getRoster(_user.pdx_employ_obj, _date); int dayOfWeek = (int)rdpDate.SelectedDate.Value.DayOfWeek; DateTime maxDateWB = rooster.Werkbloks.Where(wb => wb.Weekdag == dayOfWeek).Max(wb => wb.Starttijd.GetValueOrDefault(rdpDate.SelectedDate.Value)); // If user has a werkblok, use this if (maxDateWB != null) { returnValue = maxDateWB; } } } else { returnValue = new DateTime(2011, 12, 31, 9, 0, 0); } return returnValue; } private IEnumerable<Hoursheet> getHourDetails() { //Get all hoursheets for this user and date return Hoursheet.RetrieveAll() .Where(h => h.PerNumber == _user.pdx_employ && h.Datum == _date) .OrderBy(h => h.Starttijd); } protected IQueryable<pdx_Project> getProjects() { IQueryable<pdx_Project> projects = pdx_Project.RetrieveAll() .Where(p => p.Afgesloten != true).OrderBy(p => p.Naam); projects = projects.Where(p => p.ProjectEmployeeRoles.Any(r => r.Employ == _user.pdx_employ)); return projects; } private bool hoursConfirmed() { return (_user.UrenBevestigings_Obj != null && _user.UrenBevestigings_Obj.First().Datum.Value >= _date); } # endregion #region RadGrid Events protected void gridResult_NeedDataSource(object source, Telerik.Web.UI.GridNeedDataSourceEventArgs e) { IEnumerable<CustomHourSheet> hoursheets = new List<CustomHourSheet>(); hoursheets = from hs in getHourDetails() select new CustomHourSheet { Datum = hs.Datum, Eindtijd = hs.Eindtijd.ToString("HH:mm"), Minuten = hs.Minuten, OID = hs.OID, Omschrijving = hs.Omschrijving, Starttijd = hs.Starttijd.ToString("HH:mm"), Subproject = hs.SubProject, pdx_Subproject = hs.pdx_Subproject, ProjectID = hs.pdx_Subproject.pdx_Project.ProjectNumber, ProjectNaam = hs.pdx_Subproject != null ? hs.pdx_Subproject.pdx_Project.Naam : "", SubProjectNaam = hs.pdx_Subproject != null ? hs.pdx_Subproject.SubNaam : "", SubProjectID = hs.pdx_Subproject.SubNumber, TempStartTime = GetTimeForNewrow().ToString("HH:mm"), TempEndTime = GetTimeForNewrow().AddMinutes(15).ToString("HH:mm"), StartDatum = hs.Starttijd, EindDatum = hs.Eindtijd }; List<CustomHourSheet> hsList = hoursheets.ToList(); if (hoursheets.Count() > 1) { if (checkForBreaks(hoursheets) != null) { List<BreakSheet> breaksheets = checkForBreaks(hoursheets); foreach (BreakSheet bs in breaksheets) { hsList.Add(new CustomHourSheet() { Eindtijd = bs.StartTijd, Starttijd = bs.EindTijd, Minuten = bs.Duur, }); } } } gridResult.DataSource = hsList; List<LocalHoursheet> hsLocal = generateLocalHoursheets(hsList); string json = GenerateJSONString(hsLocal); txtHoursheetsLocal.Text = json; } private static string GenerateJSONString(List<LocalHoursheet> hsLocal) { JavaScriptSerializer serializer = new JavaScriptSerializer(); string json = serializer.Serialize(hsLocal); return json; } protected void gridResult_ItemDataBound(object sender, GridItemEventArgs e) { // Viewmode, data confirmed bool confirmed = hoursConfirmed(); if (e.Item is GridDataItem && !e.Item.IsInEditMode && confirmed) { DisableEditDisplay(e); } // Editmode else if (e.Item is GridEditableItem && e.Item.IsInEditMode) { RadMaskedTextBox start = e.Item.FindControl(controlStarttijd) as RadMaskedTextBox; start.Focus(); //DisableEditDisplayForAllRows(); } // Disable insert button on confirmed if (e.Item is GridCommandItem && confirmed) { e.Item.FindControl(commandInsert).Parent.Visible = false; } // Disable editdisplay for breaksheets if ((e.Item is GridEditableItem && !e.Item.IsInEditMode)) { // Disable editdisplay for breaksheets CustomHourSheet hs = (CustomHourSheet)e.Item.DataItem; if (hs.Omschrijving == "" || hs.Omschrijving == null) { DisableEditDisplay(e); } // Disable editdisplay for when editmode is set if (Convert.ToInt32(Session["editMode"]) == 1) { DisableEditDisplay(e); } } } protected void gridResult_ItemCommand(object source, Telerik.Web.UI.GridCommandEventArgs e) { if (e.CommandName == RadGrid.InitInsertCommandName) { e.Canceled = true; ListDictionary newValues = generateEmptyRow(); e.Item.OwnerTableView.InsertItem(newValues); Session["editMode"] = 1; } if (e.CommandName == RadGrid.CancelCommandName || e.CommandName == RadGrid.PerformInsertCommandName || e.CommandName == RadGrid.UpdateCommandName || e.CommandName == RadGrid.UpdateEditedCommandName) { rdpDate.Enabled = true; Session["editMode"] = 0; } else if (e.CommandName == RadGrid.InitInsertCommandName || e.CommandName == RadGrid.EditCommandName) { rdpDate.Enabled = false; Session["editMode"] = 1; } } // Event handler that handles UpdateCommand protected void gridResult_UpdateCommand(object source, Telerik.Web.UI.GridCommandEventArgs e) { GridEditableItem gridEditableItem = (GridEditableItem)e.Item; DoUpdate(gridEditableItem); } // Event handler that handles DeleteCommand protected void gridResult_DeleteCommand(object source, Telerik.Web.UI.GridCommandEventArgs e) { GridEditableItem gridEditableItem = (GridEditableItem)e.Item; DoDelete(gridEditableItem); } // Event handler that handles InsertCommand protected void gridResult_InsertCommand(object source, Telerik.Web.UI.GridCommandEventArgs e) { GridEditableItem gridEditableItem = (GridEditableItem)e.Item; DoInsert(gridEditableItem); } #endregion }}For screenshots see attachments. They will make more clear what I mean.