好的,我终于知道如何做到这一点了。
我试图创建一个自定义的CollectionEditor.CollectionForm,这与我需要做的很接近,但它的方向并不完全正确。
首先,创建一个包含用于编辑集合的 GUI 的常规 Windows 窗体。然后只需在表单中包含返回 DialogResult 的按钮/按钮。
现在完成我正在寻找的关键不是CollectionEditor.CollectionForm,因为我认为这是正确的方法,而是UITypeEditor。
所以,我创建了一个继承自 UITypeEditor 的类。然后你就简单地把它充实起来:
public class CustomCollectionModalEditor: UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
if (context ==null || context.Instance == null)
return base.GetEditStyle(context);
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
IWindowsFormsEditorService editorService;
if (context == null || context.Instance == null || provider == null)
return value;
editorService = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
CForm CollectionEditor = new CForm();
if (editorService.ShowDialog(CollectionEditor) == System.Windows.Forms.DialogResult.OK)
return CollectionEditor.Programmed;
return value;
//return base.EditValue(context, provider, value);
}
}
需要注意的关键部分是函数GetEditStyle 和EditValue。负责触发您为编辑集合而创建的表单的部分位于 EditValue 覆盖函数中。
CForm 是我在本次测试中设计的自定义集合编辑器表单,用于编辑集合。您需要获取与IServiceProvider 关联的IWindowsFormsEditorService 并简单地调用IWindowsFormsEditorService 的.ShowDialog(formVariable) 以显示您设计用于编辑集合的表单。然后,您可以 catch 从您的表单返回的 DialogResult 值并执行您需要的任何自定义处理。
我希望这对某人有所帮助,因为我花了很多时间来确定合并它的正确方法。