次の簡単な手順に従って、独自の文字列コレクション エディターを簡単に作成できます。この例では 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 つの文字列も渡しています。1 つはフォームのタイトル用で、もう 1 つはユーザーが何をすべきかを説明する上部のラベル用です。これはモーダルに表示され、[OK] ボタンをクリックするselectionControl.Value
と、作成するフォームから設定された値で値が更新されます。最後に、この値はオーバーライドの最後に返されます。
ステップ 2) エディター フォームを作成します。私の場合、デフォルトの StringCollection エディターを模倣するために、2 つのボタン (buttonOK
およびbuttonCancel
)、ラベル ( labelInstructions
)、および TextBox ( ) を持つフォームを作成しました。textValue
コードは非常に単純ですが、興味がある場合はこちらをご覧ください。
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)
お役に立てれば!