Is there a way restrict the user from being able to hide certain control items?
I want to allow our users to be able to customise the layout to large extent but there are a couple of items that should always be on screen. I've browsed the documentation but I couldn't see anything that would help.
2 Answers, 1 is accepted
0
Accepted
Hi Rob,
Thank you for writing.
Currently, the RadLayoutControl misses the API to allow you to cancel hiding certain layout control items. I have logged a feature request on our feedback portal, here: ADD. RadLayoutControl - expose API specifying whether items can be hidden or not. I have also updated your Telerik points. Currently, the desired behavior can be achieved with a custom control and some reflection:
I hope this will help. Let me know if you have other questions.
Regards,
Hristo
Progress Telerik
Thank you for writing.
Currently, the RadLayoutControl misses the API to allow you to cancel hiding certain layout control items. I have logged a feature request on our feedback portal, here: ADD. RadLayoutControl - expose API specifying whether items can be hidden or not. I have also updated your Telerik points. Currently, the desired behavior can be achieved with a custom control and some reflection:
public class CustomRadLayoutControl : RadLayoutControl{ public override string ThemeClassName { get { return typeof(RadLayoutControl).FullName; } } protected override void InitializeDropDownMenu() { FieldInfo hideMenuItemFi = typeof(RadLayoutControl).GetField("hideMenuItem", BindingFlags.Instance | BindingFlags.NonPublic); RadMenuItem hideMenuItem = hideMenuItemFi.GetValue(this) as RadMenuItem; if (hideMenuItem == null) { hideMenuItemFi.SetValue(this, new RadMenuItem(LayoutControlLocalizationProvider.CurrentProvider.GetLocalizedString(LayoutControlStringId.ContextMenuCustomize))); hideMenuItem = hideMenuItemFi.GetValue(this) as RadMenuItem; } hideMenuItem.Click += customizeItem_Click; RadDropDownMenu menu = typeof(RadLayoutControl).GetField("dropDownMenu", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(this) as RadDropDownMenu; menu.Items.Add(hideMenuItem); } private void customizeItem_Click(object sender, EventArgs e) { if (this.AllowCustomize) { this.ShowCustomizeMenuDialog(); } } private void ShowCustomizeMenuDialog() { if (this.CustomizeDialog.Visible) { return; } this.ShowCustomDragOverlay(); this.CustomizeDialog.Owner = this.FindForm(); ThemeResolutionService.ApplyThemeToControlTree(this.CustomizeDialog, this.ThemeName); if (this.CustomizeDialog.Location == Point.Empty) { this.CustomizeDialog.Location = GetInitialCustomizeDialogLocation(); } this.CustomizeDialog.Show(); this.CustomizeDialog.RightToLeft = this.RightToLeft; } private void ShowCustomDragOverlay() { FieldInfo dragOverlayFi = typeof(RadLayoutControl).GetField("dragOverlay", BindingFlags.Instance | BindingFlags.NonPublic); LayoutControlDraggableOverlay dragOverlay = dragOverlayFi.GetValue(this) as LayoutControlDraggableOverlay; if (dragOverlay == null) { dragOverlayFi.SetValue(this, new CustomLayoutControlDraggableOverlay(this)); dragOverlay = dragOverlayFi.GetValue(this) as LayoutControlDraggableOverlay; } dragOverlay.ThemeName = this.ThemeName; dragOverlay.UpdatePreview(); dragOverlay.Dock = DockStyle.Fill; ((RadLayoutControlControlCollection)this.Controls).AddInternal(dragOverlay); dragOverlay.Visible = true; dragOverlay.BringToFront(); this.PerformLayout(); this.Refresh(); }}public class CustomLayoutControlDraggableOverlay : LayoutControlDraggableOverlay{ private RadMenuItem hideMenuItem; public CustomLayoutControlDraggableOverlay(RadLayoutControl owner) : base(owner) { RadDropDownMenu contextMenu = typeof(LayoutControlDraggableOverlay).GetField("contextMenu", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(this) as RadDropDownMenu; contextMenu.Items.Clear(); this.hideMenuItem = new RadMenuItem(LayoutControlLocalizationProvider.CurrentProvider.GetLocalizedString(LayoutControlStringId.ContextMenuHideItem)); this.hideMenuItem.Text = LayoutControlLocalizationProvider.CurrentProvider.GetLocalizedString(LayoutControlStringId.ContextMenuHideItem); this.hideMenuItem.Click += hideMenuItem_Click; contextMenu.Items.Add(hideMenuItem); contextMenu.DropDownOpening += ContextMenu_DropDownOpening; } private void ContextMenu_DropDownOpening(object sender, CancelEventArgs e) { if (this.SelectedItems.Count == 1 && this.SelectedItems[0].Name == "layoutControlItem4") { e.Cancel = true; } } private void hideMenuItem_Click(object sender, EventArgs e) { foreach (DraggableLayoutControlItem item in this.SelectedItems) { if (item.Name == "layoutControlItem4") { continue; } this.Owner.HideItem(item.AssociatedItem); } this.UpdatePreview(); }}I hope this will help. Let me know if you have other questions.
Regards,
Hristo
Progress Telerik
Get quickly onboarded and successful with your Telerik and/or Kendo UI products with the Virtual Classroom free technical training, available to all active customers. Learn More. Rob
0
Rob
Top achievements
Rank 1
answered on 05 Dec 2018, 10:33 PM
Thanks Hristo, this worked great.
