4 Stimmen

Gibt es einen besseren StringCollection-Editor für die Verwendung in PropertyGrids?

Ich mache viel Gebrauch von PropertySheets im Konfigurationseditor meines Anwendungsframeworks. Ich mag sie sehr, weil es ziemlich einfach ist, mit ihnen zu arbeiten (wenn man einmal gelernt hat, wie) und die Bearbeitung kugelsicher zu machen.

Zu den Dingen, die ich in meiner Konfiguration speichere, gehören Python-Skripte. Es ist zwar möglich, ein Python-Skript in einem StringCollection-Editor zu bearbeiten, was ich bisher auch getan habe, aber zwischen "möglich" und "brauchbar" liegt ein weiter Weg. Ich hätte gerne einen Editor, der tatsächlich größenveränderbare und Monospace-Schriften unterstützt, Leerzeilen beibehält und - hey, lassen Sie uns mit der Wunschliste verrückt werden - Syntaxfärbung bietet.

Ich kann das natürlich schreiben, wenn ich wirklich muss, aber ich würde es lieber nicht tun.

Ich habe bei Google gestöbert und kann nichts finden, was meiner Beschreibung entspricht, also dachte ich, ich frage hier nach. Ist dieses Problem gelöst? Hat jemand da draußen bereits einen besseren Editor entwickelt?

4voto

Rob Farquharson Punkte 111

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!

2voto

Scott Dorman Punkte 41206

Sie müssten einen eigenen Editor schreiben. Sie können sich das wie ein Benutzerelement vorstellen, denn wenn Sie Ihren eigenen Typ-Editor schreiben, stellen Sie die Benutzeroberflächen-Steuerelemente bereit, die erscheinen, wenn das Eigenschaftsraster die Eigenschaft bearbeitet. Als solches können Sie einen Typ-Editor erstellen, der alles tut, was bedeutet, wenn Sie ein Drittanbieter-Editor-Steuerelement haben, können Sie es als Teil des Typ-Editors einschließen.

Einige Ressourcen für den Anfang:

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X