c# - Cadena de varias líneas en un PropertyGrid
.net winforms (4)
Descubrí 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; }
}
¿Hay un editor incorporado para una cadena de múltiples líneas en un PropertyGrid
?
No, deberá crear lo que se denomina editor modal de tipo UI. Deberá crear una clase que herede de UITypeEditor. Esto es básicamente un formulario que se muestra al hacer clic en el botón de puntos suspensivos en el lado derecho de la propiedad que está 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 una red de propiedad comercial llamada Smart PropertyGrid.NET por VisualHint.
Sí. No recuerdo exactamente cómo se llama, pero mira el editor de propiedades de Elementos para algo como ComboBox
Editado: a partir de @fryguybob, ComboBox.Items usa System.Windows.Forms.Design.ListControlStringCollectionEditor
Necesitamos escribir nuestro editor personalizado para obtener soporte multilínea en la grilla de propiedad.
Aquí está la clase de 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;
}
}
Write your custom property grid and apply this Editor attribute to the property
class CustomPropertyGrid
{
private string multiLineStr = string.Empty;
[Editor(typeof(MultiLineTextEditor), typeof(UITypeEditor))]
public string MultiLineStr
{
get { return multiLineStr; }
set { multiLineStr = value; }
}
}
En forma principal asigne este objeto
propertyGrid1.SelectedObject = new CustomPropertyGrid();