Sunday, 25 November 2012

Runtime add item to PropertyGrid Drop-down List

This sample demonstrates the technique for setting two items of a property grid from the drop-down list. These items have the type of string, but it must be simple to remake them for any other type.
Firstly, inherit the class from UITypeEditor:

public class SelEditor : System.Drawing.Design.UITypeEditor
 {       
//this is a container for strings, which can be picked-out
  ListBox Box1 = new ListBox();
  IWindowsFormsEditorService edSvc;
//this is a string array for drop-down list
  public static string[] strList;

  public SelEditor()
  {
   Box1.BorderStyle=BorderStyle.None;
//add event handler for drop-down box when item will be selected
   Box1.Click+=new EventHandler(Box1_Click);
  }

  public override System.Drawing.Design.UITypeEditorEditStyle GetEditStyle
(System.ComponentModel.ITypeDescriptorContext context)
  {
   return UITypeEditorEditStyle.DropDown;
  }

  // Displays the UI for value selection.
  public override object EditValue
(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object
value)
  {
   Box1.Items.Clear();
   Box1.Items.AddRange(strList);
   Box1.Height=Box1.PreferredHeight;
   // Uses the IWindowsFormsEditorService to display a
   // drop-down UI in the Properties window.
   edSvc = (IWindowsFormsEditorService)provider.GetService(typeof
(IWindowsFormsEditorService));
   if( edSvc != null )
   {
    edSvc.DropDownControl( Box1 );
    return Box1.SelectedItem;

   }
   return value;
  }

  private void Box1_Click(object sender, EventArgs e)
  {
   edSvc.CloseDropDown();
  }
 }


Secondly, describe a property in the class, displayed in the property grid:

 public class Class1
 {
//These are string arrays for different drop-down list.
  string[] Str1= {"AAA","BBB","CCC","DDDD"};
  string[] Str2= {"WW","EEE"};

  string s1,s2;
  public Class1()
  {
   //
   // TODO: Add constructor logic here
   //
  }


  [EditorAttribute(typeof(SelEditor), typeof(System.Drawing.Design.UITypeEditor))]
  public string STR_1
  {
   get{SelEditor.strList=Str1; return s1;}
   set{s1=value;}
  }
 
  [EditorAttribute(typeof(SelEditor), typeof(System.Drawing.Design.UITypeEditor))]
  public string STR_2
  {
   get{SelEditor.strList=Str2; return s2;}
   set{s2=value;}
  }

 }

No comments:

Post a Comment