Sie können Ihren eigenen Editor für Stringsammlungen erstellen, indem Sie diese einfachen Schritte befolgen. Dieses Beispiel verwendet C#.
1) Sie müssen ein Editor-Control erstellen und es von System.Drawing.Design.UITypeEditor
. Ich nannte meine StringArrayEditor
. Meine Klasse beginnt also mit
public class StringArrayEditor : System.Drawing.Design.UITypeEditor
El PropertyGrid
Control muss wissen, dass der Editor modal ist und die Ellipsen-Schaltfläche anzeigen, wenn die betreffende Eigenschaft ausgewählt ist. Sie müssen also überschreiben GetEditStyle
wie folgt:
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
Schließlich muss das Editor-Control die EditValue
so dass es weiß, wie Sie vorgehen wollen, wenn der Benutzer auf die Ellipsen-Schaltfläche für Ihre Eigenschaft klickt. Hier ist der vollständige Code für die Überschreibung:
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
var editorService = provider.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService;
if (editorService != null)
{
var selectionControl = new TextArrayPropertyForm((string[])value, "Edit the lines of text", "Label Editor");
editorService.ShowDialog(selectionControl);
if (selectionControl.DialogResult == DialogResult.OK)
value = selectionControl.Value;
}
return value ?? new string[] {};
}
Was ist also los? Wenn der Benutzer auf die Ellipsen klickt, wird dieser Override aufgerufen. editorService
wird als Schnittstelle für unser Bearbeitungsformular festgelegt. Es wird auf das Formular gesetzt, das wir noch nicht erstellt haben und das ich als TextArrayPropertyForm
. TextArrayPropertyForm
wird instanziiert, wobei der zu bearbeitende Wert übergeben wird. Außerdem übergebe ich 2 Strings, einen für den Titel des Formulars und den anderen für ein Etikett am oberen Rand, das erklärt, was der Benutzer tun soll. Es wird modal angezeigt, und wenn die Schaltfläche OK angeklickt wurde, wird der Wert mit dem Wert aktualisiert, der in selectionControl.Value
aus dem Formular, das wir erstellen werden. Schließlich wird dieser Wert am Ende der Überschreibung zurückgegeben.
Schritt 2) Erstellen Sie das Editorformular. In meinem Fall habe ich ein Formular mit 2 Buttons ( buttonOK
y buttonCancel
) ein Etikett ( labelInstructions
) und eine TextBox ( textValue
), um den standardmäßigen StringCollection-Editor zu imitieren. Der Code ist ziemlich einfach, aber für den Fall, dass Sie daran interessiert sind, hier ist er.
using System;
using System.Windows.Forms;
namespace MyNamespace
{
/// <summary>
/// Alternate form for editing string arrays in PropertyGrid control
/// </summary>
public partial class TextArrayPropertyForm : Form
{
public TextArrayPropertyForm(string[] value,
string instructions = "Enter the strings in the collection (one per line):", string title = "String Collection Editor")
{
InitializeComponent();
Value = value;
textValue.Text = string.Join("\r\n", value);
labelInstructions.Text = instructions;
Text = title;
}
public string[] Value;
private void buttonCancel_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.Cancel;
}
private void buttonOK_Click(object sender, EventArgs e)
{
Value = textValue.Text.Split(new[] { "\r\n" }, StringSplitOptions.None);
DialogResult = DialogResult.OK;
}
}
}
Schritt 3)Sagen Sie dem PropertyGrid, dass es den alternativen Editor verwenden soll. Der Unterschied zwischen dieser Eigenschaft und jeder anderen, die im PropertyGrid-Steuerelement verwendet wird, ist die Zeile [Editor].
[Description("The name or text to appear on the layout.")]
[DisplayName("Text"), Browsable(true), Category("Design")]
[Editor(typeof(StringArrayEditor), typeof(System.Drawing.Design.UITypeEditor))]
public string[] Text {get; set;}
Wenn Sie nun ein PropertyGrid in einem Formular erstellen und auf die Klasse setzen, die diese Texteigenschaft enthält, wird es in Ihrem benutzerdefinierten Formular bearbeitet. Es gibt zahllose Möglichkeiten, Ihr benutzerdefiniertes Formular auf die von Ihnen gewünschte Weise zu ändern. Mit einigen Modifikationen können Sie damit jeden beliebigen Typ bearbeiten. Wichtig ist, dass das Editor-Steuerelement denselben Typ zurückgibt wie die Eigenschaft in der überschriebenen EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
Ich hoffe, das hilft!