Hi,
I'm currently populating the property grid using a RadPropertyStore. One of my object's properties is a nullable Int32 field (Int32?) and I need to allow the user to empty out the PropertyGridSpinEditor cell. Unfortunately, when the data cell is cleared out, it automatically gets set to a value of 0 instead of empty/null.
How can I allow the user to clear out the data and have null be considered a valid value?
Thanks,
Joe
PS. See attached screenshot for current behavior.
4 Answers, 1 is accepted
Thank you for writing.
PropertyGridSpinEditor expects a valid numeric value. When its value is cleared, 0 is set. In order to deal with this undesired behavior, you can use the ItemFormatting event and hide the text according to your criteria by setting the PropertyGridItemElement.ValueElement.DrawText property to false. Thus, 0 value will not be displayed:
private void radPropertyGrid1_ItemFormatting(object sender, PropertyGridItemFormattingEventArgs e){ PropertyGridItemElement el = e.VisualElement as PropertyGridItemElement; if (el != null) { if (e.Item.Label == "Integer" && el.ValueElement.Text=="0") { el.ValueElement.DrawText = false; } else { el.ValueElement.DrawText = true; } }}An alternative solution is to implement a custom editor which will cover your requirement. Please refer to Using custom editor help article.
I hope this information helps. Should you have further questions I would be glad to help.
Dess
Telerik
Thanks for the reply, Dess.
Unfortunately, just hiding the text won't be enough as I need to distinguish between the user typing in 0 and the user clearing the value (i.e. null).
I guess I'll have to look into a custom editor.
Regards,
Joe
Thank you for writing back.
I have prepared a sample code snippet demonstrating how you can detect whether the value is cleared or the it is set to 0:
public Form1(){ InitializeComponent(); PropertyStoreItem intItem = new PropertyStoreItem(typeof(Int32?), "Integer", 2); 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"); RadPropertyStore store = new RadPropertyStore(); store.Add(intItem); store.Add(floatItem); store.Add(stringItem); this.radPropertyGrid1.SelectedObject = store; this.radPropertyGrid1.EditorInitialized += radPropertyGrid1_EditorInitialized;}private void radPropertyGrid1_EditorInitialized(object sender, PropertyGridItemEditorInitializedEventArgs e){ PropertyGridSpinEditor spinEditor = e.Editor as PropertyGridSpinEditor; if (spinEditor != null) { BaseSpinEditorElement el = spinEditor.EditorElement as BaseSpinEditorElement; el.ValueChanged -= el_ValueChanged; el.ValueChanged += el_ValueChanged; el.KeyUp += el_KeyUp; }}private void el_KeyUp(object sender, KeyEventArgs e){ BaseSpinEditorElement el = sender as BaseSpinEditorElement; isCleared = false; if (el != null && el.Text == string.Empty) { isCleared = true; } else { isCleared = false; }}bool isCleared = false;private void el_ValueChanged(object sender, EventArgs e){ BaseSpinEditorElement el = sender as BaseSpinEditorElement; isCleared = false; if (el != null && el.Text == string.Empty) { isCleared = true; }}private void radPropertyGrid1_ItemFormatting(object sender, PropertyGridItemFormattingEventArgs e){ PropertyGridItemElement el = e.VisualElement as PropertyGridItemElement; if (el != null) { if (e.Item.Label == "Integer" && el.ValueElement.Text == "0" && isCleared) { el.ValueElement.DrawText = false; } else { el.ValueElement.DrawText = true; } }}Note that this is just a sample approach and it may not cover all possible cases. Feel free to modify it in a way which suits your requirement best.
I hope this information helps. If you have any additional questions, please let me know.
Regards,
Dess
Telerik
Thank you very much for the example, Dess - it's really appreciated.
I'm actually doing something very similar to suit it to my needs.
Regards,
Joe
