Вы можете легко создать свой собственный редактор коллекции строк, выполнив следующие простые действия. В этом примере используется C #.
1) Вы должны создать элемент управления редактора и извлечь его из System.Drawing.Design.UITypeEditor
. Я назвал мой StringArrayEditor
. Таким образом, мой класс начинается с
public class StringArrayEditor : System.Drawing.Design.UITypeEditor
Элемент управления PropertyGrid
должен знать, что редактор является модальным, и он будет показывать кнопку эллипсов, когда выбрано указанное свойство. Поэтому вы должны переопределить GetEditStyle
следующим образом:
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
Наконец, элемент управления редактора должен переопределить операцию EditValue
, чтобы он знал, как вы хотите действовать, когда пользователь нажимает кнопку эллипса для вашего свойства. Вот полный код для переопределения:
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[] {};
}
Так что же происходит? Когда пользователь нажимает на эллипсы, вызывается это переопределение. editorService
устанавливается как интерфейс для нашей формы редактирования. Он настроен на форму, которую мы еще не создали, которую я называю TextArrayPropertyForm
. TextArrayPropertyForm
создается, передавая значение для редактирования. Для правильной оценки я также передаю 2 строки: одну для заголовка формы, а другую для метки вверху, объясняющей, что должен делать пользователь. Он отображается модально, и если была нажата кнопка ОК, значение обновляется в соответствии с тем, какое значение было установлено в selectionControl.Value
из формы, которую мы создадим. Наконец это значение возвращается в конце переопределения.
Шаг 2) Создайте форму редактора. В моем случае я создал форму с 2 кнопками (buttonOK
и buttonCancel
), надписью (labelInstructions
) и TextBox (textValue
), чтобы имитировать редактор StringCollection по умолчанию. Код довольно прост, но если вам интересно, вот он.
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;
}
}
}
Шаг 3) Скажите PropertyGrid использовать альтернативный редактор. Изменением между этим свойством и любым другим, используемым в элементе управления PropertyGrid, является строка [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;}
Теперь, когда вы создаете PropertyGrid на форме и устанавливаете класс, содержащий это свойство Text, он будет редактировать в вашей пользовательской форме. Есть бесчисленное множество возможностей изменить свою форму по вашему выбору. С изменениями это будет работать для редактирования любого типа, который вам нравится. Важно то, что элемент управления редактора возвращает тот же тип, что и свойство в переопределенном EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
Надеюсь, это поможет!