Take the community feedback survey now.
Take the community feedback survey now.
Can you give little a bit more details about the actual property which attribute applied to!?
It is actually not a property or well, maybe it is!? :)
I have a plugin for Episerver and in Admin / Config / Plug-in Manager in the Edit plug-in dialog I want to be able to use this property.
It is actually a tab selector property so to speak. The user should connect one or more tabs to my plugin.
Maybe there is a better may to do this? Select one or more tabs use in a plug-in?
Thanks Aria!
I think it is better to have property! If it still doesn't work after that if you can share some of the code and I'm more than happy to take a look :)
Something like:
[PlugInProperty(Description = "Tabs to select properties from", AdminControl = typeof(TabSelectorSettingsUi))]
public CheckBoxList SelectedTabs { get; set; }
I'm not sure about backing type (CheckBoxList) ... it could be string and you can store as comma-separated items! Need to try
using System;
using System.Web.UI.WebControls;
using EPiServer.PlugIn;
namespace Episerver75.Settings
{
[GuiPlugIn(Area = PlugInArea.None, DisplayName = "Settings")]
public class MySettings : IMySettings
{
private static MySettings _instance;
[PlugInProperty(Description = "Tabs to select properties from", AdminControl = typeof(TabSelectorSettingsUi))]
public string SelectedTabs { get; set; }
public MySettings()
{
PlugInSettings.SettingsChanged += MySettingsSettingsChanged;
}
private static void MySettingsSettingsChanged(object sender, EventArgs e)
{
_instance = null;
}
public static MySettings Instance
{
get
{
if (_instance == null)
{
_instance = new AmestoTranslationSettings();
}
PlugInSettings.AutoPopulate(_instance);
return _instance;
}
}
}
}
using System;
using EPiServer.Core.PropertySettings;
using EPiServer.Data.Dynamic;
namespace Settings.Controls
{
public class TabSelectorSettings : IPropertySettings
{
public TabSelectorSettings()
{
SelectedCategories = string.Empty;
}
[EPiServerDataMember]
public string SelectedCategories { get; set; }
public IPropertySettings GetDefaultValues()
{
return new TabSelectorSettings();
}
public IPropertySettings Copy()
{
var settings = new TabSelectorSettings();
settings.SelectedCategories = this.SelectedCategories;
return settings;
}
public Guid Id { get; set; }
}
}
using System.Collections.Generic;
using System.Linq;
using System.Web.UI.WebControls;
using EPiServer.Core.PropertySettings;
namespace Settings.Controls
{
public class TabSelectorSettingsUi : PropertySettingsControlBase
{
private CheckBoxList tabs;
protected override void CreateChildControls()
{
base.CreateChildControls();
tabs = new CheckBoxList();
tabs.Items.Add(new ListItem("Test 0", "0"));
tabs.Items.Add(new ListItem("Test 1", "1"));
tabs.Items.Add(new ListItem("Test 2", "2"));
Controls.Add(tabs);
}
public override void LoadSettingsUI(IPropertySettings propertySettings)
{
EnsureChildControls();
var tabSelectorSettings = propertySettings as TabSelectorSettings;
if (tabSelectorSettings == null)
{
return;
}
var selectedTabs = tabSelectorSettings.SelectedCategories.Split(',');
foreach (ListItem tab in tabs.Items)
{
if(selectedTabs.Contains(tab.Value))
{
tab.Selected = true;
}
}
}
public override void UpdateSettings(IPropertySettings propertySettings)
{
EnsureChildControls();
var tabSelectorSettings = propertySettings as TabSelectorSettings;
if (tabSelectorSettings == null)
{
return;
}
var selectedTabs = new List<string>();
foreach (ListItem tab in tabs.Items)
{
if (tab.Selected)
{
selectedTabs.Add(tab.Value);
}
}
tabSelectorSettings.SelectedCategories = string.Join(",", selectedTabs);
}
}
}
So this is the code example for my test with using settings.
And here is the property example
using System;
using System.Web.UI.WebControls;
using EPiServer.PlugIn;
namespace Episerver75.Settings
{
[GuiPlugIn(Area = PlugInArea.None, DisplayName = "Settings")]
public class MySettings : IMySettings
{
private static MySettings _instance;
[PlugInProperty(Description = "Tabs to select properties from", AdminControl = typeof(TabSelectorPropertyControl))]
public string SelectedTabs { get; set; }
public MySettings()
{
PlugInSettings.SettingsChanged += MySettingsChanged;
}
private static void MySettingsSettingsChanged(object sender, EventArgs e)
{
_instance = null;
}
public static MySettings Instance
{
get
{
if (_instance == null)
{
_instance = new MySettings();
}
PlugInSettings.AutoPopulate(_instance);
return _instance;
}
}
}
}
using System;
using EPiServer.Core;
using EPiServer.PlugIn;
namespace Settings.Controls
{
[PropertyDefinitionTypePlugIn]
[Serializable]
public class TabSelectorProperty : PropertyMultipleValue
{
public override IPropertyControl CreatePropertyControl()
{
return new TabSelectorPropertyControl();
}
}
}
using System.Web.UI.WebControls;
using EPiServer.Core;
using EPiServer.Web.PropertyControls;
namespace Settings.Controls
{
public class TabSelectorPropertyControl : PropertySelectMultipleControlBase
{
protected override bool ShouldCreateDefaultControls()
{
return false;
}
public PropertyMultipleValue CheckboxListValue
{
get { return PropertyData as PropertyMultipleValue; }
}
protected override void SetupEditControls()
{
SetupDropDownList();
}
protected override void CreateChildControls()
{
this.SetupDropDownList();
}
protected virtual void SetupDropDownList()
{
this.AddItems();
if (CheckboxListValue != null && CheckboxListValue.Value != null)
{
foreach (var value in CheckboxListValue.ToString().Split(','))
{
ListItem li = EditControl.Items.FindByValue(value);
if (li != null)
li.Selected = true;
}
}
}
private void AddItems()
{
this.EditControl = new CheckBoxList();
this.EditControl.EnableViewState = false;
this.ApplyControlAttributes((WebControl)this.EditControl);
this.EditControl.RepeatColumns = 3;
this.EditControl.Style["display"] = "inline";
EditControl.Items.Add(new ListItem("Test 0", "0"));
EditControl.Items.Add(new ListItem("Test 1", "1"));
this.Controls.Add(this.EditControl);
}
}
}
Both of my above example gives me:
[NullReferenceException: Object reference not set to an instance of an object.] EPiServer.UI.Admin.PlugInAdminSettings.Save() +1239 EPiServer.UI.Admin.PlugInEdit.Save(Object sender, EventArgs e) +21 EPiServer.UI.WebControls.ToolButton.OnClick(EventArgs e) +125 EPiServer.UI.WebControls.ToolButton.RaisePostBackEvent(String eventArgument) +222 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1734
So I solved it.
The key was to use the AdminControlValue on the PluginProperty definition
[PlugInProperty(LanguagePath = "/Translations/Settings/SelectedTabs", AdminControl = typeof(TabSelectorPropertyControl), AdminControlValue = "CheckboxListValue")]
Make a property CheckboxListValue that gets and sets the value of your property then it works just fine.
/Kristoffer
@Kristoffer: Good one you I just wanted to write down that :D :) but anyway sorry for late response
Hi!
I am trying to have my plugin have a proprty of a checkbox list to save multiple setting values for my plugin.
I have tried a couple of different ways.
Where TabSelectorSettingsUi is inheriting PropertySettingsControlBase.
I have also tried
I can get both of these to generate a checkbox list but when I try to save I get the same error for both versions:
What did I miss?
Thanks!
/Kristoffer