2010-08-11 4 views
0

Я ищу создание редактируемого свойства checkboxlist для элемента, указанного в приведенном ниже коде. Интерфейс редактирования отображает флажок, но не сохраняет выбранные элементы.n2cms редактируемый checkboxlist свойство

[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); } 
    } 

Неужели кто-нибудь еще пытался реализовать вышеуказанное? Если да, то как вы это достигли?

Спасибо за ваше время и поддержка

Шон

ответ

1

Проведя несколько часов проверяя n2cms пользовательских редакторов, ниже мое решение

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; 
    } 
} 

И это, как вы используете его

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

В качестве дополнительного бонуса, здесь есть кнопка радио список редактирования атрибутов

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; 
    } 
} 

И это, как вы используете его

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

Надеется, что это помогает

Шона

Смежные вопросы