2016-04-12 17 views
2

ユーザが選択した文字列のリストを表示するためのフォーム(StringSelector)を起動するカスタムUITypeEditorを作成しました。問題は、このフォームがどのStringManagerを使用するのかを知る必要があることです(stringmanageは、単にListに許されるすべての文字列を含むクラスです)。C#UITypeEditor with Parameter

このフォームを作成したとき、StringManagerをコンストラクタのパラメータとして渡していましたが、UITypeEditorでこれをどのように行うことができません。

以下は、フォームを表示するためのパラメータを持たないコンストラクタを使用する私の現在のコードですが、コンストラクタのパラメータバージョンを呼び出さなかったため、明らかに文字列はありません。

EditValue関数内で使用できるUITypeEditorにパラメータを渡すにはどうすればよいですか?どうもありがとう。追加の詳細で更新

class StringSelectorEditor : 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; 

     StringItem item = value as StringItem; 

     if (svc != null) 
     { 
      // ###### How do I pass a reference to this EditValue function so that I can.... 
      using (StringSelector form = new StringSelector(/* ... INSERT IT HERE */)) 
      { 
       form.Value = item; 
       if (svc.ShowDialog(form) == DialogResult.OK) 
       { 
        item = form.Value; // update object 
       } 
      } 
     } 
     return value; // can also replace the wrapper object here 
    } 
} 

:要求されたよう 、私は自身が人口StringManagerが含まれていControlInstanceというクラスを持っています。このControlInstanceクラスは、上記のStringSelectorEditor UITypeEditorリファレンスを含むPropertyGridコントロールとそのア​​クセサ関数に渡されます。ここでは、コードの抜粋です:

public class ControlInstance_Label : ControlInstance 
{ 
    StringManager stringManager; 
    string thisName = ""; 
    StringItem linkedStringItem; 

    public ControlInstance_Label(String TextFilePath) 
    { 
     // Code here which populates the StringManager with text from the above file 
    } 

    [Category("Design"), Description("Control Name")] 
     public String Name 
     { 
      get { return thisName; } 
      set { thisName = value; } 
     } 

    // THIS IS WERE I SOMEHOW NEED TO PASS IN THE StringManager Ref to the EditValue function of the custom UITypeEditor 
    [Category("Design"), Description("Static String Linked to this Control")] 
     [Editor(typeof(StringSelectorEditor), typeof(UITypeEditor))] 
     public StringItem LinkedString 
     { 
      get { return linkedStringItem; } 
      set { linkedStringItem = value; } 
     } 
} 
+0

StringManagerインスタンスはどこに格納/宣言されていますか? –

+0

このStringSelectorEditorクラスの外側ですが、このUITypeEditorを使用するクラスからアクセスできます。 – TheGrovesy

+0

もっと正確にしてください。たとえば、いくつかのサンプルコードを表示します。 –

答えて

0

EditValueメソッドは、型ITypeDescriptorContextのものであり、あなたが編集している財産の所有者オブジェクトであるInstanceプロパティを持つcontextパラメータがあります。

したがって、クラスのパブリックプロパティにアクセスするには、context.Instanceを所有者クラスタイプにキャストするだけです。また、リフレクションを使用してプライベートメンバーにアクセスすることもできます。

例ここで

は、コンストラクタでList<string>を受け入れクラスであり、SomeValueプロパティを編集するとき、私はそれらの値を使用するつもりです。これを行うには、渡されたリストを非表示のプロパティSomeListに保存し、カスタムUIタイプエディタのEditValueで使用します。あなたが好きな場合はプライベートプロパティにリストを保持し、リフレクションを使用して値を抽出することができます。ここでは、単純なMyClass実装です:

public class MyClass 
{ 
    [Browsable(false)] 
    public List<String> SomeList { get; set; } 
    public MyClass(List<String> list) 
    { 
     SomeList = list; 
    } 

    [Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))] 
    public string SomeValue { get; set; } 
} 

ここMyUITypeEditorEditValue方法では、私たちはそのプロパティを編集しているオブジェクトのインスタンスであるcontext.Instanceからリストの値を抽出します。それからちょうど例えば私がメッセージボックスに抽出した値を示しています。

var myObject = new MyClass(new List<string>() { "A", "B", "C" }); 
this.propertyGrid1.SelectedObject = myObject; 

public class MyUITypeEditor : UITypeEditor 
{ 
    public override object EditValue(ITypeDescriptorContext context, 
     IServiceProvider provider, object value) 
    { 
     //Just as an example, show a message box containing values from owner object 
     var list = ((MyClass)context.Instance).SomeList; 
     MessageBox.Show(string.Format("You can choose from {0}.", 
      string.Join(",", list))); 

     return base.EditValue(context, provider, value); 
    } 
    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) 
    { 
     return UITypeEditorEditStyle.Modal; 
    } 
} 

はそれをテストするには、それがプロパティグリッドにMyClassのインスタンスを表示し、プロパティグリッドでSomeValueプロパティを編集しようとするのに十分です