[ rossonerri @ 17.04.2009. 16:51 ] @
Dakle, problem koji imam je sljedeci:
Napravio sam user controlu i ona posjeduje nekoliko property-a.Naravno mogu da ih podesim i u design modu putem Properties prozora gdje se uredno pojavljuju. Medjutim, meni treba mogucnost da pokrenem jednu formu klikom na jedan od property-a u Properties prozoru. Konkretno, potrebno mi je da se prikaze pored datog property-a onaj mali button sa tri tackice kako bi mogao da pokrenem tu formu u design modu. Pa ako ima neko rjesenje kako da ovo uradim bio bih mu extra zahvalan
[ DarkMan @ 17.04.2009. 17:25 ] @
Da li si mislio nesto ovako:

Code:

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

namespace WindowsApplication1
{
    public class NekaKontrola: UserControl
    {
        private string m_NekoSvojstvo = string.Empty;

        [Editor(typeof(NekiEditor), typeof(UITypeEditor))]
        public string NekoSvojstvo
        {
            get { return m_NekoSvojstvo; }
            set { m_NekoSvojstvo = value; }
        }

        public NekaKontrola()
        {
        }
    }


    public class NekiEditor: UITypeEditor
    {

        public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
        {
            return UITypeEditorEditStyle.Modal;
        }

        public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
        {
            if(context != null) {
                Form form = new Form();
                form.ShowDialog();
                form.Dispose();
            }
            return base.EditValue(context, provider, value);
        }
    }
}


Dodaj ovu kontrolu na neku formu, selektuj tu kontrolu i onda klikni na "..." od property-a NekoSvojstvo, trebalo bi da ti se pojavi prazna forma.
[ rossonerri @ 17.04.2009. 18:06 ] @
Bravo majstore to je to. Vec sam vidio nesto slicno sa koristenjem UITypeEditor klase al mi se nesto nije dalo cackati sa tim. Uglavnom ovo sam podesio i radi sto je najvaznije. Jos jednom hvala puno
[ rossonerri @ 17.04.2009. 19:17 ] @
Pozdrav, imam jos jedan mali problem sa ovim. Naime, ovo sve radi kada koristim npr. kao sto ti ovdje navede string property na osnovu kojeg cu otvoriti formu i onda nesto sto tamo uradim setovati u ovaj property. Medjutim, u mom programu je potrebno da vratim citav objekat npr.

private ControlConfig control;

public ControlConfig control
{
get {return control;}
set {control = value;}
}

Ako ovako nesto uradim, vise mi se ne prikazuju one tri tackice pored ovog property-a u designer modu nego mi se pokaze strelica da izaberem nesto od ponudjenog. Posto objekat jos uvijek nije stvoren ponudi mi (none). Ako kreiram objekat:

ControlConfig control = new ControlConfig();

desi se fatal error:D, jer ocigledno pri svakom otvaranju projekta kreira se ovaj objekat (koji je data forma) i Visual Studio pada.
Pa ako imas kakav dobar prijedlog kako da ovo rijesim, hvala unaprijed:D
[ DarkMan @ 18.04.2009. 10:07 ] @
Treba ti TypeConverter atribut. Evo i primera:

Code:

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

namespace WindowsApplication1
{
    public class NekaKontrola: UserControl
    {
        private Control m_NekoSvojstvo = new Control();

        [Editor(typeof(NekiEditor), typeof(UITypeEditor))]
        [TypeConverter(typeof(MojTypeConverter))]
        public Control NekoSvojstvo
        {
            get { return m_NekoSvojstvo; }
            set { m_NekoSvojstvo = value; }
        }

        public NekaKontrola()
        {
        }
    }


    public class NekiEditor: UITypeEditor
    {

        public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
        {
            return UITypeEditorEditStyle.Modal;
        }

        public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
        {
            if(context != null) {
                Form form = new Form();
                form.ShowDialog();
                form.Dispose();
            }
            return base.EditValue(context, provider, value);
        }
    }

    public class MojTypeConverter: TypeConverter
    {
        public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
        {
            if(value is Control && destinationType == typeof(string)) {
                return ((Control)value).Name;
            }
            return base.ConvertTo(context, culture, value, destinationType);
        }
    }
}