To reproduce: use the following code snippet and refer to the attached gif file. public Form1() { InitializeComponent(); this.radPropertyGrid1.SelectedObject = this; this.radPropertyGrid1.RightToLeft = System.Windows.Forms.RightToLeft.Yes; } Workaround: public Form1() { InitializeComponent(); this.radPropertyGrid1.CreateItemElement += radPropertyGrid1_CreateItemElement; this.radPropertyGrid1.SelectedObject = this; this.radPropertyGrid1.RightToLeft = System.Windows.Forms.RightToLeft.Yes; } private void radPropertyGrid1_CreateItemElement(object sender, CreatePropertyGridItemElementEventArgs e) { if (e.ItemElementType == typeof(PropertyGridItemElement)) { e.ItemElementType = typeof(CustomPropertyGridItemElement); } } public class CustomPropertyGridItemElement : PropertyGridItemElement { private bool isResizing; private Point downLocation; private int downWidth; protected override Type ThemeEffectiveType { get { return typeof(PropertyGridItemElement); } } private const int resizePointerOffset = 3; public override bool IsInResizeLocation(Point location) { return (location.X >= this.ControlBoundingRectangle.X + this.PropertyTableElement.ValueColumnWidth - resizePointerOffset && location.X <= this.ControlBoundingRectangle.X + this.PropertyTableElement.ValueColumnWidth + resizePointerOffset); } protected override void OnMouseDown(MouseEventArgs e) { if (IsInResizeLocation(e.Location)) { if (this.PropertyTableElement.IsEditing) { this.PropertyTableElement.EndEdit(); } this.Capture = true; this.isResizing = true; this.downLocation = e.Location; this.downWidth = this.PropertyTableElement.ValueColumnWidth; } base.OnMouseDown(e); } protected override void OnMouseMove(MouseEventArgs e) { if (this.isResizing) { int delta = e.Location.X - downLocation.X; if (this.RightToLeft) { delta *= -1; } this.PropertyTableElement.ValueColumnWidth = downWidth - delta; return; } if (this.IsInResizeLocation(e.Location)) { this.ElementTree.Control.Cursor = Cursors.VSplit; } else { this.ElementTree.Control.Cursor = Cursors.Default; } base.OnMouseMove(e); } protected override void OnMouseUp(MouseEventArgs e) { if (this.isResizing) { this.isResizing = false; this.Capture = false; } base.OnMouseUp(e); } }
To reproduce: use the following code: Items _items = new Items(); public Form1() { InitializeComponent(); radPropertyGrid1.SelectedObject = _items; } class Items { [Description("A Bool Property")] public bool IsEnabled { get { return _isEnabled; } set { _isEnabled = value; RadMessageBox.Show("IsEnabled"); } } private bool _isEnabled; [Description("A String Property")] public string Name { get { return _name; } set { _name = value; RadMessageBox.Show("Name"); } } private string _name ; } Steps to perform: 1. Change the "Name" property and leave the editor active. 2. Click on the check box to change the "IsEnabled" property. As a result you will notice that the "IsEnabled" setter is called before the "Name" setter. Workaround: Items _items = new Items(); public Form1() { InitializeComponent(); this.radPropertyGrid1.CreateItemElement += radPropertyGrid1_CreateItemElement; radPropertyGrid1.SelectedObject = _items; } private void radPropertyGrid1_CreateItemElement(object sender, CreatePropertyGridItemElementEventArgs e) { if (e.ItemElementType == typeof(PropertyGridCheckBoxItemElement)) { e.ItemElementType = typeof(CustomPropertyGridCheckBoxItemElement); } } public class CustomPropertyGridCheckBoxItemElement : PropertyGridCheckBoxItemElement { public CustomPropertyGridCheckBoxItemElement() { this.CheckBoxElement.ToggleStateChanging += CheckBoxElement_ToggleStateChanging; } private void CheckBoxElement_ToggleStateChanging(object sender, StateChangingEventArgs args) { if (this.PropertyTableElement.ActiveEditor != null && this.PropertyTableElement.SelectedGridItem != this.Data) { this.PropertyTableElement.EndEdit(); } } protected override void DisposeManagedResources() { this.CheckBoxElement.ToggleStateChanging -= CheckBoxElement_ToggleStateChanging; base.DisposeManagedResources(); } }
Until the new feature is officially released please use the implementation in the attached project.
To reproduce: - Add a property grid to a blank form set the selected object the the same form. - Group the items and click several times to expand collapse the groups or items. - you will notice that some of expanded/collapsed groups icon is in wrong state (same applies for the +/- sign of the properties).
To reproduce: public Form1() { InitializeComponent(); this.radPropertyGrid1.Size = new System.Drawing.Size(272, 135); PropertyStoreItem intItem = new PropertyStoreItem(typeof(int), "Integer", 1); PropertyStoreItem showTrend = new PropertyStoreItem(typeof(bool), "ShowTrend", 0); PropertyStoreItem trendItem1 = new PropertyStoreItem(typeof(int), "TrendTypes", 0); // Case of Re-loading the previously Saved Trend Type PropertyStoreItem floatItem = new PropertyStoreItem(typeof(float), "Float", 1f, "Property storing a floating point value."); PropertyStoreItem stringItem = new PropertyStoreItem(typeof(string), "String", "Telerik", "Property storing a string value", "Telerik"); PropertyStoreItem dockItem = new PropertyStoreItem(typeof(DockStyle), "Dock", DockStyle.Top, "Property containing DockStyle value", "Layout", false); RadPropertyStore store = new RadPropertyStore(); store.Add(intItem); store.Add(showTrend); store.Add(trendItem1); store.Add(floatItem); store.Add(stringItem); store.Add(dockItem); this.radPropertyGrid1.SelectedObject = store; radPropertyGrid1.Items["TrendTypes"].Visible = false; this.radPropertyGrid1.PropertyValueChanged += radPropertyGrid1_ValueChanged; } private void radPropertyGrid1_ValueChanged(object sender, PropertyGridItemValueChangedEventArgs e) { PropertyGridItem current = (PropertyGridItem)e.Item; if (current.Name == "ShowTrend") { bool val = Convert.ToBoolean(current.Value); radPropertyGrid1.Items["TrendTypes"].Visible = val; } } - There is no scrollbar when the item is shown. Workaround: radPropertyGrid1.PropertyGridElement.PropertyTableElement.Update(PropertyGridTableElement.UpdateActions.ExpandedChanged);
Please refer to the attached gif file demonstrating how to reproduce the error with the Demo application. Workaround: change the DropDownStyle property to DropDownList: private void radPropertyGrid1_EditorInitialized(object sender, PropertyGridItemEditorInitializedEventArgs e) { PropertyGridDropDownListEditor editor = e.Editor as PropertyGridDropDownListEditor; if (editor!=null) { BaseDropDownListEditorElement editorElement = editor.EditorElement as BaseDropDownListEditorElement; editorElement.DropDownStyle = Telerik.WinControls.RadDropDownStyle.DropDownList; } }
To reproduce: use a class with more than 100 properties for the RadPropertyGrid.SelectedObject. On RadButton.Click event set the RradPropertyGrid.PropertySort to PropertySort.CategorizedAlphabetical.
Please refer to the attached sample project.
When a property has a TypeConverter and a UITypeEditor attributes the PropertyGridUITypeEditor calls the TypeConverter methods with the context parameter equal to null.
When the SelectedObject contains sub-properties and a user expands a property the CreateItem event is not fired for sub items.
If one sets an empty RadPropertyStore to the SelectedObject property of a RadPropertyGrid and then adds items with a RadSortOrder attribute the items will still be sorted by their name. WORKAROUNDS: 1. Populate the store before you set it to the property grid. 2. Add a dummy item to the store before you set it to the property grid and then remove it: RadPropertyStore store = new RadPropertyStore(); store.Add(typeof(bool), "dummy", false); this.radPropertyGrid1.SelectedObject = store; store.RemoveAt(0); 3. After you add the first item to the store call the following method: this.radPropertyGrid1.PropertyGridElement.PropertyTableElement.ListSource.CollectionView.EnsureDescriptors();
To reproduce: please refer to the attached sample project. Try to select a new value from the drop-down editor and press Yes from the message box. Workaround: use the RadPropertyGrid.PropertyValueChanging event to confirm the property changing: private void radPropertyGrid1_PropertyValueChanging(object sender, Telerik.WinControls.UI.PropertyGridItemValueChangingEventArgs e) { e.Cancel = (MessageBox.Show("Are you sure you want to change this?", "Question", MessageBoxButtons.YesNo) != DialogResult.Yes); }
RadSpinEditor now supports null values. This functionality is relevant for the PropertyGridSpinEditor as well http://docs.telerik.com/devtools/winforms/editors/spineditor/null-value-support
Steps to reproduce. 1. Drag a RadPropertyGrid to a form. 2. Set the selected object to a button for example. 3. Set the System.Threading.Thread.CurrentThread.CurrentUICulture to bg-BG for example 4. Run the project and try to edit the Size property. You will see that it is displayed in the format X;Y, but you have to enter string in the X,Y format otherwise you get an exception.
To reproduce: - Add RadPropertyGrid to a form and set the theme to MaterialTeal. The issue is observed in the ThemeViewer as well. Workaround: radPropertyGrid1.PropertyGridElement.ToolbarElement.AlphabeticalToggleButton.TextWrap = true; radPropertyGrid1.PropertyGridElement.ToolbarElement.CategorizedToggleButton.TextWrap = true; //or radPropertyGrid1.PropertyGridElement.ToolbarElementHeight = 68;
FIX. RadPropertyGrid - setting the SelectedObject to something and then set it to a property store, does not remove the initial items Workaround: clear the items prior setting the property store: this.radPropertyGrid1.PropertyGridElement.PropertyTableElement.ListSource.Clear();
To reproduce: -add a RadPropertyGrid and use the following code: radPropertyGrid.SelectedObject = new MyPropertyGridAdapter(node); PropertyValueChanging += new PropertyGridItemValueChangingEventHandler(OnPropertyValueChanging); private void OnPropertyValueChanging(object sender, PropertyGridItemValueChangingEventArgs e) { var form = new CommentActionForm(); if (form.ShowDialog() == System.Windows.Forms.DialogResult.OK) { var item = e.Item as PropertyGridItem; var pd = item.PropertyDescriptor as MyPropertyDescriptor; if (pd != null) { // Perform value change (affects database). } } else { e.Cancel = true; } } Workaround:when ending edit mode with Enter key you may use the following approach: public Form1() { InitializeComponent(); this.radPropertyGrid1.SelectedObject = new MyObject(10204, "Sample name", "Some descripion"); this.radPropertyGrid1.EditorRequired += radPropertyGrid1_EditorRequired; } private void radPropertyGrid1_EditorRequired(object sender, PropertyGridEditorRequiredEventArgs e) { PropertyGridItem propertyItem = e.Item as PropertyGridItem; e.Editor = new MyEditor(propertyItem); } public class MyObject { public int ID { get; set; } public string Name { get; set; } public string Description { get; set; } public MyObject(int iD, string name, string description) { this.ID = iD; this.Name = name; this.Description = description; } } public class MyEditor : PropertyGridTextBoxEditor { public string InitialValue { get; set; } public PropertyGridItem PropertyItem { get; set; } public MyEditor(PropertyGridItem item) : base() { this.PropertyItem = item; } public override void BeginEdit() { InitialValue = this.TextBoxEditorElement.Text; base.BeginEdit(); } } public class MyPropertyGrid : RadPropertyGrid { protected override bool ProcessDialogKey(Keys keyData) { if (this.ActiveEditor != null && this.ActiveEditor is MyEditor && keyData == Keys.Enter) { MyEditor editor = ((MyEditor)this.ActiveEditor); PropertyGridItem property = editor.PropertyItem; string initialValue = editor.InitialValue; DialogResult ds = RadMessageBox.Show("Are you sure?", "Title", MessageBoxButtons.OKCancel, RadMessageIcon.Question); if (ds == System.Windows.Forms.DialogResult.Cancel) { property.Value = initialValue; return false; } } return base.ProcessDialogKey(keyData); } }
When using a the following property store item: this.PropertyStore.Add(typeof(Image) , "Test Image" , null ); the user cannot select an image via the BrowseEditor.