Cadena multilínea en un PropertyGrid
-
02-07-2019 - |
Pregunta
¿Existe un editor incorporado para una cadena multilínea en un PropertyGrid
.
Solución
Encontré que System.Design.dll
tiene System.ComponentModel.Design.MultilineStringEditor
que se puede usar de la siguiente manera:
public class Stuff
{
[Editor(typeof(MultilineStringEditor), typeof(UITypeEditor))]
public string MultiLineProperty { get; set; }
}
Otros consejos
No, deberá crear lo que se llama un editor de tipo de interfaz de usuario modal. Tendrá que crear una clase que herede de UITypeEditor. Este es básicamente un formulario que se muestra cuando haces clic en el botón de puntos suspensivos en el lado derecho de la propiedad que estás editando.
El único inconveniente que encontré, fue que necesitaba decorar la propiedad de cadena específica con un atributo específico. Ha pasado un tiempo desde que tuve que hacer eso. Obtuve esta información de un libro de Chris Sells llamado "Programación de Windows Forms en C #" "
Hay un propertygrid comercial llamado Smart PropertyGrid.NET de VisualHint.
Sí. No recuerdo cómo se llama, pero mira el editor de propiedades de Items para algo como ComboBox
Editado: a partir de @fryguybob, ComboBox.Items usa System.Windows.Forms.Design.ListControlStringCollectionEditor
Necesitamos escribir nuestro editor personalizado para obtener el soporte multilínea en la cuadrícula de propiedades.
Aquí está la clase del editor de texto del cliente implementada desde UITypeEditor
public class MultiLineTextEditor : UITypeEditor
{
private IWindowsFormsEditorService _editorService;
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.DropDown;
}
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
_editorService = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
TextBox textEditorBox = new TextBox();
textEditorBox.Multiline = true;
textEditorBox.ScrollBars = ScrollBars.Vertical;
textEditorBox.Width = 250;
textEditorBox.Height = 150;
textEditorBox.BorderStyle = BorderStyle.None;
textEditorBox.AcceptsReturn = true;
textEditorBox.Text = value as string;
_editorService.DropDownControl(textEditorBox);
return textEditorBox.Text;
}
}
Escriba su cuadrícula de propiedades personalizadas y aplique este atributo de Editor a la propiedad
class CustomPropertyGrid
{
private string multiLineStr = string.Empty;
[Editor(typeof(MultiLineTextEditor), typeof(UITypeEditor))]
public string MultiLineStr
{
get { return multiLineStr; }
set { multiLineStr = value; }
}
}
En forma principal asigna este objeto
propertyGrid1.SelectedObject = new CustomPropertyGrid();