Hi,
I have a ComboBoxColumn that is bound to a datatable. One of the options in the datatable is "None" with a value of DBNull. I have the DisplayMember and ValueMember set and everything works just fine, except when I choose "None" in the list and move off the row. The column with the ComboBox is empty instead of "None". Any other value displays the lookup text just fine.
Any ideas?
I have a ComboBoxColumn that is bound to a datatable. One of the options in the datatable is "None" with a value of DBNull. I have the DisplayMember and ValueMember set and everything works just fine, except when I choose "None" in the list and move off the row. The column with the ComboBox is empty instead of "None". Any other value displays the lookup text just fine.
Any ideas?
3 Answers, 1 is accepted
0
Accepted
Hello David A.,
Thank you for the detailed issue description. It helped me to reproduce the issue. I confirm that it appears in our latest release and I logged it in our bug tracking system. The issue will be addressed in one of our upcoming releases.
You can work around the issue by using the following work around:
I updated your Telerik points accordingly. Should you have any further questions, do not hesitate to ask.
Kind regards,
Svett
the Telerik team
Thank you for the detailed issue description. It helped me to reproduce the issue. I confirm that it appears in our latest release and I logged it in our bug tracking system. The issue will be addressed in one of our upcoming releases.
You can work around the issue by using the following work around:
public partial class GridForm : Form{ public GridForm() { InitializeComponent(); this.radGridView1.CellEditorInitialized += new GridViewCellEventHandler(radGridView1_CellEditorInitialized); } private void radGridView1_CellEditorInitialized(object sender, GridViewCellEventArgs e) { RadDropDownListEditor editor = e.ActiveEditor as RadDropDownListEditor; if (editor != null && this.radGridView1.CurrentColumn.Name == "Status" && editor.Value == null) { RadDropDownListEditorElement element = editor.EditorElement as RadDropDownListEditorElement; element.SelectedIndex = 0; } } protected override void OnLoad(EventArgs e) { base.OnLoad(e); this.radGridView1.DataSource = GetDummyEmployeesDataSource(); DataTable statusSource = new DataTable("table"); statusSource.Columns.Add("Name", typeof(string)); statusSource.Columns.Add("Value", typeof(int)); statusSource.Rows.Add("None", DBNull.Value); statusSource.Rows.Add("Pending", 1); statusSource.Rows.Add("Approved", 2); MyGridViewComboBoxColumn comboColumn = new MyGridViewComboBoxColumn("Status", "Status"); comboColumn.ValueMember = "Value"; comboColumn.DisplayMember = "Name"; comboColumn.DataSource = statusSource; this.radGridView1.Columns.Add(comboColumn); } public class MyGridViewComboBoxColumn : GridViewComboBoxColumn { private static MethodInfo ensureDescriptorsMethod; private static FieldInfo currencyManagerField; private static FieldInfo valueDescriptorField; private static FieldInfo displayDescriptorField; static MyGridViewComboBoxColumn() { Type cbType = typeof(GridViewComboBoxColumn); ensureDescriptorsMethod = cbType.GetMethod("EnsureDescriptors", BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic); currencyManagerField = cbType.GetField("currencyManager", BindingFlags.NonPublic | BindingFlags.Instance); valueDescriptorField = cbType.GetField("valueDescriptor", BindingFlags.NonPublic | BindingFlags.Instance); displayDescriptorField = cbType.GetField("displayDescriptor", BindingFlags.NonPublic | BindingFlags.Instance); } public MyGridViewComboBoxColumn(string fieldName) : base(fieldName) { } public MyGridViewComboBoxColumn() { } public MyGridViewComboBoxColumn(string uniqueName, string fieldName) : base(uniqueName, fieldName) { } public override object GetLookupValue(object cellValue) { if ((bool)ensureDescriptorsMethod.Invoke(this, null)) { CurrencyManager currencyManager = currencyManagerField.GetValue(this) as CurrencyManager; PropertyDescriptor valueDescriptor = valueDescriptorField.GetValue(this) as PropertyDescriptor; PropertyDescriptor displayDescriptor = displayDescriptorField.GetValue(this) as PropertyDescriptor; bool isNullValue = this.IsNullValue(cellValue); for (int i = 0; i < currencyManager.List.Count; i++) { object val = valueDescriptor.GetValue(currencyManager.List[i]); if ((isNullValue && this.IsNullValue(val)) || Object.Equals(cellValue, val)) { return displayDescriptor.GetValue(currencyManager.List[i]); } } } return null; } private bool IsNullValue(object value) { return value == null || Convert.IsDBNull(value); } }}I updated your Telerik points accordingly. Should you have any further questions, do not hesitate to ask.
Kind regards,
Svett
the Telerik team
Do you want to have your say when we set our development plans?
Do you want to know when a feature you care about is added or when a bug fixed?
Explore the
Telerik Public Issue Tracking
system and vote to affect the priority of the items
0
Exclamation
Top achievements
Rank 1
answered on 08 Jun 2012, 07:24 AM
Hi , Svett.
Can you tell me how the EnsureDescriptors Method work with source.
I customer your GetLookupVale but (bool)ensureDescriptorsMethod.Invoke(this, null) alway false.I dont know why.
I have set Datasouce . DisplayMember, ValueMember for this colum.
Idea can i remove (bool)ensureDescriptorsMethod.Invoke(this, null) in code of method.
Thanks your reply.
Can you tell me how the EnsureDescriptors Method work with source.
I customer your GetLookupVale but (bool)ensureDescriptorsMethod.Invoke(this, null) alway false.I dont know why.
I have set Datasouce . DisplayMember, ValueMember for this colum.
Idea can i remove (bool)ensureDescriptorsMethod.Invoke(this, null) in code of method.
Thanks your reply.
0
Hello Thanh,
You can remove EnsureDescriptors reflection call in your application and add a null reference check of the CurrencyManager, Value and display descriptors. Here is a modified example:
I hope this helps.
Regards,
Julian Benkov
the Telerik team
You can remove EnsureDescriptors reflection call in your application and add a null reference check of the CurrencyManager, Value and display descriptors. Here is a modified example:
public override object GetLookupValue(object cellValue){ CurrencyManager currencyManager = currencyManagerField.GetValue(this) as CurrencyManager; PropertyDescriptor valueDescriptor = valueDescriptorField.GetValue(this) as PropertyDescriptor; PropertyDescriptor displayDescriptor = displayDescriptorField.GetValue(this) as PropertyDescriptor; if(currencyManager != null && valueDescriptor != null && displayDescriptor != null) { bool isNullValue = this.IsNullValue(cellValue); for (int i = 0; i < currencyManager.List.Count; i++) { object val = valueDescriptor.GetValue(currencyManager.List[i]); if ((isNullValue && this.IsNullValue(val)) || Object.Equals(cellValue, val)) { return displayDescriptor.GetValue(currencyManager.List[i]); } } } return null;}I hope this helps.
Regards,
Julian Benkov
the Telerik team
RadControls for WinForms Q1'12 release is now live! Check out what's new or download a free trial >>