Vous pouvez créer facilement votre propre éditeur de collection de chaînes en procédant comme suit. Cet exemple utilise C#.
1) Vous devez créer un contrôle d'éditeur et le dériver de System.Drawing.Design.UITypeEditor
. J'ai appelé le mien StringArrayEditor
. Ainsi ma classe commence par
public class StringArrayEditor : System.Drawing.Design.UITypeEditor
Les besoins de contrôle PropertyGrid
savoir que l'éditeur est modal et il affichera le bouton lorsque la propriété des ellipses en question est sélectionnée. Vous devez donc passer outre GetEditStyle
comme suit:
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
Enfin, le contrôle de l'éditeur doit passer outre l'opération EditValue
pour qu'il sache comment vous voulez procéder lorsque l'utilisateur clique sur le bouton de sélection de votre propriété. Voici le code complet pour le remplacement:
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[] {};
}
Alors que se passe-t-il? Lorsque l'utilisateur clique sur les ellipses, cette substitution est appelée. editorService
est défini comme interface pour notre formulaire d'édition. Il est défini sur le formulaire que nous n'avons pas encore créé que j'appelle TextArrayPropertyForm
. TextArrayPropertyForm
est instancié, en passant la valeur à modifier.Pour faire bonne mesure, je passe également 2 chaînes, une pour le titre du formulaire et l'autre pour une étiquette en haut expliquant ce que l'utilisateur devrait faire. Il est affiché de manière modale et si le bouton OK a été cliqué, la valeur est mise à jour avec la valeur définie dans selectionControl.Value
à partir du formulaire que nous allons créer. Enfin, cette valeur est renvoyée à la fin du remplacement.
Étape 2) Créez le formulaire de l'éditeur. Dans mon cas, j'ai créé un formulaire avec 2 boutons (buttonOK
et buttonCancel
) un Label (labelInstructions
) et un TextBox (textValue
) pour imiter l'éditeur StringCollection par défaut. Le code est assez simple, mais au cas où vous êtes intéressé, le voici.
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;
}
}
}
Étape 3) Dites au PropertyGrid d'utiliser l'éditeur alternatif. La modification entre cette propriété et toute autre qui est utilisée dans le contrôle PropertyGrid est la ligne [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;}
Maintenant, lorsque vous créez un PropertyGrid sur un formulaire et mis à la classe contenant cette propriété de texte, il éditera dans votre forme sur mesure. Il existe d'innombrables possibilités de modifier votre formulaire personnalisé de la manière que vous choisissez. Avec des modifications, cela fonctionnera pour l'édition de tout type que vous aimez. L'important est que le contrôle de l'éditeur retourne le même type que la propriété dans le EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
Espérons que cela aide!
Scott pouvez-vous ajouter des liens vers des ressources utiles qui expliquent votre approche? Cela améliorerait beaucoup votre réponse et pourrait mener à des remises en question, je pense. –