There is a standard collection editor with an overloaded base class. I would like to change the appearance of the drop-down list, for example, highlight some lines with bold or other colors. Is it possible to do this and how, if possible.
1 answer
WinForms does not give a lot of fields for customization (or gives, but with a fight). Something you can do.
For any type / property, you can override the editor using the Editor attribute:
public class Foo { [Editor(typeof(CustomEditor), typeof(UITypeEditor))] public string Bar { get; set; } } To do this, you need to implement UITypeEditor :
public class CustomEditor : UITypeEditor { public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) { // Π³ΠΎΠ²ΠΎΡΠΈΠΌ, ΡΡΠΎ ΡΡΠΎ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠ°Π΄Π°ΡΡΠΈΠΉ ΡΠΏΠΈΡΠΎΠΊ // Π΅ΡΡΡ Π²Π°ΡΠΈΠ°Π½Ρ Modal, ΠΏΡΠΈ ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠΊΠ°Π·Π°ΡΡ ΡΠΎΡΠΌΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ° return UITypeEditorEditStyle.DropDown; } public override object EditValue(ITypeDescriptorContext context, System.IServiceProvider provider, object value) { // context -- ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΡΠ²ΠΎΠΉΡΡΠ²Π΅ ΠΈ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ΅ // provider -- Π΄Π°Π΅Ρ ΡΠ΅ΡΠ²ΠΈΡ, Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡ ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΠ΅ ΡΠ΅Π΄Π°ΠΊΡΠΎΡΡ // value -- ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΡΠ΅ΠΌΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ IWindowsFormsEditorService service = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService)); var list = new ListBox() { SelectionMode = SelectionMode.One, DrawMode = DrawMode.OwnerDrawFixed }; // Π½Π΅ Π·Π°Π±ΡΠ²Π°Π΅ΠΌ Π·Π°ΠΊΡΡΡΡ Π²ΡΠΏΠ°Π΄Π°ΡΡΠΈΠΉ ΡΠΏΠΈΡΠΎΠΊ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±ΡΠ»ΠΎ Π²ΡΠ±ΡΠ°Π½ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ list.SelectedValueChanged += (s, e) => service.CloseDropDown(); list.DrawItem += (s, e) => { // ΠΊΠ°ΡΡΠΎΠΌΠΈΠ·Π°ΡΠΈΡ ΡΡΠΈΡΡΠ° (ΠΆΠΈΡΠ½ΡΠΉ/Π½Π΅ΠΆΠΈΡΠ½ΡΠΉ) e.DrawBackground(); var font = e.Index % 2 == 0 ? new Font("Arial", 9, FontStyle.Bold) : new Font("Arial", 9); e.Graphics.DrawString( list.Items[e.Index].ToString(), font, Brushes.Black, e.Bounds); e.DrawFocusRectangle(); }; // Π·Π°ΠΏΠΎΠ»Π½ΡΠ΅ΠΌ ΡΠΏΠΈΡΠΎΠΊ Π΅ΡΡΠ½Π΄ΠΎΠΉ for (int i = 1; i <= 5; i++ ) { list.Items.Add(i.ToString()); } // ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΡΠ΅ΠΊΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠ³ΠΎ list.SelectedItem = value; // ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ Π²ΡΠΏΠ°Π΄Π°ΡΡΠΈΠΉ ΡΠΏΠΈΡΠΎΠΊ, ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π»ΡΠ±ΠΎΠΉ ΠΊΠΎΠ½ΡΡΠΎΠ» service.DropDownControl(list); // Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠ΅ Π² ΡΠΏΠΈΡΠΊΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ return list.SelectedItem; } } Application itself:
static class Program { [STAThread] static void Main() { Application.EnableVisualStyles(); Form form = new Form() { Controls = { new PropertyGrid() { Dock = DockStyle.Fill, SelectedObject = new Foo() } } }; Application.Run(form); } } A few more brief examples can be found in the CodeProject article .
- Thank. As soon as I manage to rewrite it on VB and get positive results, I will mark your answer as correct. - Dmitry Gvozd
|
