2010-08-11 13 views
0

Je cherche à créer une propriété editable checkboxlist pour un élément comme indiqué dans le code ci-dessous. L'interface d'édition affiche la checkboxlist mais ne conserve pas les éléments de case à cocher sélectionnés.n2cms editable checkboxlist propriété

[Editable("Divisions", typeof(CheckBoxList), "SelectedValue", 85, DataBind = true, ContainerName = Tabs.Content)] 
    [EditorModifier("DataSource", new string[] { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5", "Item 6" })] 
    public virtual string[] Divisions 
    { 
     get { return (string[])(GetDetail("Divisions")); } 
     set { SetDetail("Divisions", value); } 
    } 

Est-ce que quelqu'un d'autre a essayé de mettre en œuvre ce qui précède? Si oui, comment l'avez-vous atteint?

Merci pour votre temps et le soutien

Sean

Répondre

1

Après avoir passé quelques heures de vérification des n2cms éditeurs personnalisés, ci-dessous est ma solution

public class EditableCheckBoxListAttribute : AbstractEditableAttribute 
{ 
    public override void UpdateEditor(N2.ContentItem item, Control editor) 
    { 
     CheckBoxList lst = editor as CheckBoxList; 
     if (lst != null) 
     { 
      foreach(ListItem li in lst.Items) 
      { 
       if (item[this.Name].ToString().Contains(li.Value)) 
       { 
        li.Selected = true; 
       } 
      } 
     } 
    } 

    public override bool UpdateItem(N2.ContentItem item, Control editor) 
    { 
     CheckBoxList lst = editor as CheckBoxList; 
     ArrayList items = new ArrayList(); 
     foreach (ListItem li in lst.Items) 
     { 
      if (li.Selected) 
      { 
       items.Add(li.Value); 
      } 
     } 
     string[] itemID = (string[])items.ToArray(typeof(string)); 
     item[this.Name] = String.Join(",",itemID); 
     return true; 
    } 

    protected override Control AddEditor(Control container) 
    { 
     CheckBoxList lst = new CheckBoxList(); 
     var items = N2.Find.Items 
      .Where.Type.Eq(typeof(TestItem)) 
      .Filters(new NavigationFilter()) 
      .Select<TestItem>(); 
     foreach (TestItem i in items) 
     { 
      lst.Items.Add(new ListItem(i.Title, i.ID.ToString())); 
     } 
     container.Controls.Add(lst); 
     return lst; 
    } 
} 

Et voici comment vous l'utilisez

[EditableCheckBoxList(Title = "Items")] 
public virtual string Items 
{ 
    get { return (string)(GetDetail("Items", "")); } 
    set { SetDetail("Items", value, ""); } 
} 

En prime, voici un bouton radio liste attribut modifiable

public class EditableRadioListAttribute : AbstractEditableAttribute 
{ 
    public override void UpdateEditor(N2.ContentItem item, Control editor) 
    { 
     RadioButtonList rbl = editor as RadioButtonList; 
     if (rbl != null) 
     { 
      rbl.SelectedValue = item[this.Name].ToString(); 
      if (rbl.Items.FindByValue(item[this.Name].ToString()) != null) 
      { 
       rbl.Items.FindByValue(item[this.Name].ToString()).Selected = true; 
      } 
     } 
    } 

    public override bool UpdateItem(N2.ContentItem item, Control editor) 
    { 
     RadioButtonList rbl = editor as RadioButtonList; 
     string itemID = rbl.SelectedValue; 
     item[this.Name] = itemID; 
     return true; 
    } 

    protected override Control AddEditor(Control container) 
    { 
     RadioButtonList rbl = new RadioButtonList(); 
     var items = N2.Find.Items 
      .Where.Type.Eq(typeof(TestItem)) 
      .Filters(new NavigationFilter()) 
      .Select<TestItem>(); 
     foreach (TestItem i in items) 
     { 
      rbl.Items.Add(new ListItem(i.Title, i.ID.ToString())); 
     } 
     container.Controls.Add(rbl); 
     return rbl; 
    } 
} 

Et voici comment vous l'utilisez

[EditableRadioListAttribute(Title = "Item")] 
public virtual string Item 
{ 
    get { return (string)(GetDetail("Item", "")); } 
    set { SetDetail("Item", value, ""); } 
} 

Hope this helps

Sean