You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

197 lines
4.6 KiB
C#

namespace PropertyGridEx
{
using System;
using System.ComponentModel;
using System.Drawing.Design;
using System.Runtime.CompilerServices;
using System.Windows.Forms;
using System.Windows.Forms.Design;
public class UIListboxEditor : UITypeEditor
{
private bool bIsDropDownResizable = false;
private ListBox oList = new ListBox();
private object oSelectedValue = null;
private IWindowsFormsEditorService oEditorService;
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
if (context != null&& context.Instance != null)
{
UIListboxIsDropDownResizable attribute = (UIListboxIsDropDownResizable) context.PropertyDescriptor.Attributes[typeof(UIListboxIsDropDownResizable)];
if (attribute != null)
{
bIsDropDownResizable = true;
}
return UITypeEditorEditStyle.DropDown;
}
return UITypeEditorEditStyle.None;
}
public override bool IsDropDownResizable
{
get
{
return bIsDropDownResizable;
}
}
[RefreshProperties(RefreshProperties.All)]public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
if (context == null || provider == null || context.Instance == null)
{
return base.EditValue(provider, value);
}
oEditorService = (System.Windows.Forms.Design.IWindowsFormsEditorService) provider.GetService(typeof(IWindowsFormsEditorService));
if (oEditorService != null)
{
// Get the Back reference to the Custom Property
CustomProperty.CustomPropertyDescriptor oDescriptor = (CustomProperty.CustomPropertyDescriptor) context.PropertyDescriptor;
CustomProperty cp = (CustomProperty) oDescriptor.CustomProperty;
// Declare attributes
UIListboxDatasource datasource;
UIListboxValueMember valuemember;
UIListboxDisplayMember displaymember;
// Get attributes
datasource = (UIListboxDatasource) context.PropertyDescriptor.Attributes[typeof(UIListboxDatasource)];
valuemember = (UIListboxValueMember) context.PropertyDescriptor.Attributes[typeof(UIListboxValueMember)];
displaymember = (UIListboxDisplayMember) context.PropertyDescriptor.Attributes[typeof(UIListboxDisplayMember)];
oList.BorderStyle = BorderStyle.None;
oList.IntegralHeight = true;
if (datasource != null)
{
oList.DataSource = datasource.Value;
}
if (displaymember != null)
{
oList.DisplayMember = displaymember.Value;
}
if (valuemember != null)
{
oList.ValueMember = valuemember.Value;
}
if (value != null)
{
if (value.GetType().Name == "String")
{
oList.Text = (string) value;
}
else
{
oList.SelectedItem = value;
}
}
oList.SelectedIndexChanged += new System.EventHandler(this.SelectedItem);
oEditorService.DropDownControl(oList);
if (oList.SelectedIndices.Count == 1)
{
cp.SelectedItem = oList.SelectedItem;
cp.SelectedValue = oSelectedValue;
value = oList.Text;
}
oEditorService.CloseDropDown();
}
else
{
return base.EditValue(provider, value);
}
return value;
}
private void SelectedItem(object sender, EventArgs e)
{
if (oEditorService != null)
{
if (oList.SelectedValue != null)
{
oSelectedValue = oList.SelectedValue;
}
oEditorService.CloseDropDown();
}
}
[AttributeUsage(AttributeTargets.Property)]
public class UIListboxDatasource : Attribute
{
private object oDataSource;
public UIListboxDatasource(ref object Datasource)
{
oDataSource = Datasource;
}
public object Value
{
get
{
return oDataSource;
}
}
}
[AttributeUsage(AttributeTargets.Property)]
public class UIListboxValueMember : Attribute
{
private string sValueMember;
public UIListboxValueMember(string ValueMember)
{
sValueMember = ValueMember;
}
public string Value
{
get
{
return sValueMember;
}
set
{
sValueMember = value;
}
}
}
[AttributeUsage(AttributeTargets.Property)]
public class UIListboxDisplayMember : Attribute
{
private string sDisplayMember;
public UIListboxDisplayMember(string DisplayMember)
{
sDisplayMember = DisplayMember;
}
public string Value
{
get
{
return sDisplayMember;
}
set
{
sDisplayMember = value;
}
}
}
[AttributeUsage(AttributeTargets.Property)]
public class UIListboxIsDropDownResizable : Attribute
{
}
}
}