Как создать пользовательского редактора PropertyGrid объект, который открывает форму?

Давайте попробуем:

$x =& true?$y:$x;
Parse error: syntax error, unexpected '?', expecting T_PAAMAYIM_NEKUDOTAYIM in...
$x = true?&$y:&$x;
Parse error: syntax error, unexpected '&' in...

Итак, вы видите, он даже не анализирует. Wikken, вероятно, прав в том, почему это не разрешено.

Вы можете обойти это с помощью функции:

function &ternaryRef($cond, &$iftrue, &$iffalse=NULL) {
    if ($cond)
        return $iftrue;
    else
        return $iffalse;
}

$x = 4;
$a = &ternaryRef(true, $x);
xdebug_debug_zval('a');
$b = &ternaryRef(false, $x);
xdebug_debug_zval('b');

дает:

a:

(refcount=2, is_ref=1),int 4
b:
(refcount=1, is_ref=0),null
33
задан esac 19 June 2009 в 03:33
поделиться

1 ответ

Вам необходимо реализовать модальный UITypeEditor , используя IWindowsFormsEditorService , чтобы отобразить его:

using System.ComponentModel;
using System.Drawing.Design;
using System.Windows.Forms;
using System.Windows.Forms.Design;
using System;

class MyType
{
    private Foo foo = new Foo();
    public Foo Foo { get { return foo; } }
}

[Editor(typeof(FooEditor), typeof(UITypeEditor))]
[TypeConverter(typeof(ExpandableObjectConverter))]
class Foo
{
    private string bar;
    public string Bar
    {
        get { return bar; }
        set { bar = value; }
    }
}
class FooEditor : UITypeEditor
{
    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
    {
        return UITypeEditorEditStyle.Modal;
    }
    public override object EditValue(ITypeDescriptorContext context, System.IServiceProvider provider, object value)
    {
        IWindowsFormsEditorService svc = provider.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService;
        Foo foo = value as Foo;
        if (svc != null && foo != null)
        {            
            using (FooForm form = new FooForm())
            {
                form.Value = foo.Bar;
                if (svc.ShowDialog(form) == DialogResult.OK)
                {
                    foo.Bar = form.Value; // update object
                }
            }
        }
        return value; // can also replace the wrapper object here
    }
}
class FooForm : Form
{
    private TextBox textbox;
    private Button okButton;
    public FooForm() {
        textbox = new TextBox();
        Controls.Add(textbox);
        okButton = new Button();
        okButton.Text = "OK";
        okButton.Dock = DockStyle.Bottom;
        okButton.DialogResult = DialogResult.OK;
        Controls.Add(okButton);
    }
    public string Value
    {
        get { return textbox.Text; }
        set { textbox.Text = value; }
    }
}
static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Form form = new Form();
        PropertyGrid grid = new PropertyGrid();
        grid.Dock = DockStyle.Fill;
        form.Controls.Add(grid);
        grid.SelectedObject = new MyType();
        Application.Run(form);
    }
}

Примечание: если вам нужно получить доступ к чему-либо о контексте свойства (родительский объект и т. д.), это то, что ITypeDescriptorContext EditValue ) обеспечивает; он сообщает вам PropertyDescriptor и экземпляр ( MyType ), который задействован.

если вам нужно получить доступ к чему-то о контексте свойства (родительский объект и т. д.), это то, что предоставляет ITypeDescriptorContext EditValue ); он сообщает вам PropertyDescriptor и экземпляр ( MyType ), который задействован.

если вам нужно получить доступ к чему-то о контексте свойства (родительский объект и т. д.), это то, что предоставляет ITypeDescriptorContext EditValue ); он сообщает вам PropertyDescriptor и экземпляр ( MyType ), который задействован.

80
ответ дан 27 November 2019 в 17:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: