2008-12-11 7 views
11

Mam klasę z właściwością string, posiadającą zarówno pobierający, jak i ustawiający, który jest często tak długi, że PropertyGrid obciąża wartość ciągu. Jak mogę wymusić właściwość PropertyGrid, aby wyświetlić elipsę, a następnie uruchomić okno dialogowe zawierające pole tekstowe wieloliniowe do łatwej edycji właściwości? Wiem, że prawdopodobnie muszę ustawić jakiś atrybut na nieruchomości, ale jaki atrybut i jak? Czy moje okno dialogowe musi implementować specjalny interfejs projektanta?Jak wymusić na właściwość PropertyGrid wyświetlanie niestandardowego okna dialogowego dla określonej właściwości?

Aktualizacja: This to prawdopodobnie odpowiedź na moje pytanie, ale nie mogłem go znaleźć, wyszukując. Moje pytanie jest bardziej ogólne, a jego odpowiedź może zostać wykorzystana do zbudowania dowolnego typu edytora niestandardowego.

Odpowiedz

17

Musisz ustawić wartość [Editor(...)] dla właściwości, nadając jej wartość UITypeEditor, która dokonuje edycji; jak tak (z własnego edytora ...)

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


static class Program 
{ 
    static void Main() 
    { 
     Application.Run(new Form { Controls = { new PropertyGrid { SelectedObject = new Foo() } } }); 
    } 
} 



class Foo 
{ 
    [Editor(typeof(StringEditor), typeof(UITypeEditor))] 
    public string Bar { get; set; } 
} 

class StringEditor : UITypeEditor 
{ 
    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) 
    { 
     return UITypeEditorEditStyle.Modal; 
    } 
    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) 
    { 
     IWindowsFormsEditorService svc = (IWindowsFormsEditorService) 
      provider.GetService(typeof(IWindowsFormsEditorService)); 
     if (svc != null) 
     { 
      svc.ShowDialog(new Form()); 
      // update etc 
     } 
     return value; 
    } 
} 

Możecie być ablt wyśledzić istniejący Edytor patrząc na istniejących właściwości, które zachowują się jak chcesz.

+1

Dzięki za szybką odpowiedź. Daję ci +1 na teraz i oznaczę to jako poprawną odpowiedź, gdy tylko dostanę szansę, by wypróbować to na moim końcu. – flipdoubt

+0

Czy jest możliwe utworzenie pola tekstowego "Bar" w propertygrid tylko do odczytu, aby użytkownik nie mógł wkleić tekstu bezpośrednio do pola tekstowego właściwości, ale tylko poprzez modalne okno dialogowe? Setter nie jest wywoływany, jeśli dodaję atrybut ReadOnly (true). – lerner1225

+0

@ lerner1225 Potrzebujesz konwertera typu "nie robić niczego" - patrz http://stackoverflow.com/a/30194849/127670 –

Powiązane problemy