From edd620e349868e27ee9a73902165060b1b66a8aa Mon Sep 17 00:00:00 2001 From: Hugh Bellamy Date: Tue, 2 Apr 2019 21:07:19 +0800 Subject: [PATCH 1/2] Cleanup ListControl --- .../System/Windows/Forms/BindingMemberInfo.cs | 4 +- .../src/System/Windows/Forms/ComboBox.cs | 8 +- .../src/System/Windows/Forms/ListBox.cs | 5 +- .../src/System/Windows/Forms/ListControl.cs | 937 +++++++++--------- 4 files changed, 495 insertions(+), 459 deletions(-) diff --git a/src/System.Windows.Forms/src/System/Windows/Forms/BindingMemberInfo.cs b/src/System.Windows.Forms/src/System/Windows/Forms/BindingMemberInfo.cs index 50601463405..7724b953cbf 100644 --- a/src/System.Windows.Forms/src/System/Windows/Forms/BindingMemberInfo.cs +++ b/src/System.Windows.Forms/src/System/Windows/Forms/BindingMemberInfo.cs @@ -29,9 +29,9 @@ public BindingMemberInfo(string dataMember) } } - public string BindingPath => _dataList != null ? _dataList : string.Empty; + public string BindingPath => _dataList ?? string.Empty; - public string BindingField => _dataField != null ? _dataField : string.Empty; + public string BindingField => _dataField ?? string.Empty; public string BindingMember { diff --git a/src/System.Windows.Forms/src/System/Windows/Forms/ComboBox.cs b/src/System.Windows.Forms/src/System/Windows/Forms/ComboBox.cs index f42c2ef74a0..da246841a09 100644 --- a/src/System.Windows.Forms/src/System/Windows/Forms/ComboBox.cs +++ b/src/System.Windows.Forms/src/System/Windows/Forms/ComboBox.cs @@ -2031,8 +2031,7 @@ public int FindString(string s, int startIndex) { // Always use the managed FindStringInternal instead of CB_FINDSTRING. // The managed version correctly handles Turkish I. - // - return FindStringInternal(s, Items, startIndex, false); + return FindStringInternal(s, Items, startIndex, exact: false, ignoreCase: true); } /// @@ -2060,7 +2059,7 @@ public int FindStringExact(string s, int startIndex) { /// string. The strings must match exactly, except for differences in /// casing. /// - internal int FindStringExact(string s, int startIndex, bool ignorecase) { + internal int FindStringExact(string s, int startIndex, bool ignoreCase) { if (s == null) return -1; if (itemsCollection == null || itemsCollection.Count == 0) { @@ -2074,8 +2073,7 @@ internal int FindStringExact(string s, int startIndex, bool ignorecase) { // Always use the managed FindStringInternal instead of CB_FINDSTRINGEXACT. // The managed version correctly handles Turkish I. - // - return FindStringInternal(s, Items, startIndex, true, ignorecase); + return FindStringInternal(s, Items, startIndex, exact: true, ignoreCase); } // GetPreferredSize and SetBoundsCore call this method to allow controls to self impose diff --git a/src/System.Windows.Forms/src/System/Windows/Forms/ListBox.cs b/src/System.Windows.Forms/src/System/Windows/Forms/ListBox.cs index 473af5eee8f..af5953280a7 100644 --- a/src/System.Windows.Forms/src/System/Windows/Forms/ListBox.cs +++ b/src/System.Windows.Forms/src/System/Windows/Forms/ListBox.cs @@ -1394,7 +1394,7 @@ public int FindString(string s, int startIndex) { // Always use the managed FindStringInternal instead of LB_FINDSTRING. // The managed version correctly handles Turkish I. - return FindStringInternal(s, Items, startIndex, false); + return FindStringInternal(s, Items, startIndex, exact: false, ignoreCase: true); } /// @@ -1428,8 +1428,7 @@ public int FindStringExact(string s, int startIndex) { // Always use the managed FindStringInternal instead of LB_FINDSTRING. // The managed version correctly handles Turkish I. - // - return FindStringInternal(s, Items, startIndex, true); + return FindStringInternal(s, Items, startIndex, exact: true, ignoreCase: true); } /// diff --git a/src/System.Windows.Forms/src/System/Windows/Forms/ListControl.cs b/src/System.Windows.Forms/src/System/Windows/Forms/ListControl.cs index 9ef1c87ab29..050d5cc450e 100644 --- a/src/System.Windows.Forms/src/System/Windows/Forms/ListControl.cs +++ b/src/System.Windows.Forms/src/System/Windows/Forms/ListControl.cs @@ -2,199 +2,200 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -namespace System.Windows.Forms { - using System.Runtime.Serialization.Formatters; - using System.Runtime.Remoting; - using System.Runtime.InteropServices; - - using System.Diagnostics; - - using System; - using System.Security.Permissions; - using System.Globalization; - using System.Windows.Forms; - - using System.Drawing.Design; - using System.ComponentModel; - using System.Windows.Forms.ComponentModel; - - using System.Collections; - using System.Drawing; - using Microsoft.Win32; - using System.Text; - - /// - [ - ComVisible(true), - ClassInterface(ClassInterfaceType.AutoDispatch), - LookupBindingProperties("DataSource", "DisplayMember", "ValueMember", "SelectedValue") - ] - public abstract class ListControl : Control { - - private static readonly object EVENT_DATASOURCECHANGED = new object(); - private static readonly object EVENT_DISPLAYMEMBERCHANGED = new object(); - private static readonly object EVENT_VALUEMEMBERCHANGED = new object(); - private static readonly object EVENT_SELECTEDVALUECHANGED = new object(); - private static readonly object EVENT_FORMATINFOCHANGED = new object(); - private static readonly object EVENT_FORMATSTRINGCHANGED = new object(); - private static readonly object EVENT_FORMATTINGENABLEDCHANGED = new object(); +using System.Diagnostics; +using System.Drawing.Design; +using System.Collections; +using System.ComponentModel; +using System.Globalization; +using System.Runtime.InteropServices; + +namespace System.Windows.Forms +{ + [ComVisible(true)] + [ClassInterface(ClassInterfaceType.AutoDispatch)] + [LookupBindingProperties(nameof(ListControl.DataSource), nameof(ListControl.DisplayMember), nameof(ListControl.ValueMember), nameof(ListControl.SelectedValue))] + public abstract class ListControl : Control + { + private static readonly object EVENT_DATASOURCECHANGED = new object(); + private static readonly object EVENT_DISPLAYMEMBERCHANGED = new object(); + private static readonly object EVENT_VALUEMEMBERCHANGED = new object(); + private static readonly object EVENT_SELECTEDVALUECHANGED = new object(); + private static readonly object EVENT_FORMATINFOCHANGED = new object(); + private static readonly object EVENT_FORMATSTRINGCHANGED = new object(); + private static readonly object EVENT_FORMATTINGENABLEDCHANGED = new object(); private object dataSource; private CurrencyManager dataManager; - private BindingMemberInfo displayMember; + private BindingMemberInfo displayMember; private BindingMemberInfo valueMember; // Formatting stuff private string formatString = string.Empty; private IFormatProvider formatInfo = null; private bool formattingEnabled = false; - private static readonly object EVENT_FORMAT = new object(); + private static readonly object EVENT_FORMAT = new object(); private TypeConverter displayMemberConverter = null; private static TypeConverter stringTypeConverter = null; - + private bool isDataSourceInitialized; private bool isDataSourceInitEventHooked; private bool inSetDataConnection = false; - /// /// - /// The ListSource to consume as this ListBox's source of data. - /// When set, a user can not modify the Items collection. + /// The ListSource to consume as this ListBox's source of data. + /// When set, a user can not modify the Items collection. /// - [ - SRCategory(nameof(SR.CatData)), - DefaultValue(null), - RefreshProperties(RefreshProperties.Repaint), - AttributeProvider(typeof(IListSource)), - SRDescription(nameof(SR.ListControlDataSourceDescr)) - ] - public object DataSource { - get { - return dataSource; - } - set { + [SRCategory(nameof(SR.CatData))] + [DefaultValue(null)] + [RefreshProperties(RefreshProperties.Repaint)] + [AttributeProvider(typeof(IListSource))] + [SRDescription(nameof(SR.ListControlDataSourceDescr))] + public object DataSource + { + get => dataSource; + set + { if (value != null && !(value is IList || value is IListSource)) + { throw new ArgumentException(SR.BadDataSourceForComplexBinding); + } + if (dataSource == value) + { return; + } + // When we change the dataSource to null, we should reset // the displayMember to "". - try { - SetDataConnection(value, displayMember, false); - } catch { + try + { + SetDataConnection(value, displayMember, force: false); + } + catch + { // There are several possibilities why setting the data source throws an exception: // 1. the app throws an exception in the events that fire when we change the data source: DataSourceChanged, // 2. we get an exception when we set the data source and populate the list controls (say,something went wrong while formatting the data) // 3. the DisplayMember does not fit w/ the new data source (this could happen if the user resets the data source but did not reset the DisplayMember) // in all cases ListControl should reset the DisplayMember to String.Empty // the ListControl should also eat the exception - this is the RTM behavior and doing anything else is a breaking change - DisplayMember = ""; + DisplayMember = string.Empty; } if (value == null) - DisplayMember = ""; + { + DisplayMember = string.Empty; + } } } - /// - [SRCategory(nameof(SR.CatPropertyChanged)), SRDescription(nameof(SR.ListControlOnDataSourceChangedDescr))] - public event EventHandler DataSourceChanged { - add { + [SRCategory(nameof(SR.CatPropertyChanged))] + [SRDescription(nameof(SR.ListControlOnDataSourceChangedDescr))] + public event EventHandler DataSourceChanged + { + add + { Events.AddHandler(EVENT_DATASOURCECHANGED, value); } - remove { + remove + { Events.RemoveHandler(EVENT_DATASOURCECHANGED, value); } } - /// - protected CurrencyManager DataManager { - get { - return this.dataManager; - } - } + protected CurrencyManager DataManager => dataManager; - /// /// - /// If the ListBox contains objects that support properties, this indicates - /// which property of the object to show. If "", the object shows it's ToString(). + /// If the ListBox contains objects that support properties, this indicates + /// which property of the object to show. If "", the object shows it's ToString(). /// - [ - SRCategory(nameof(SR.CatData)), - DefaultValue(""), - TypeConverterAttribute("System.Windows.Forms.Design.DataMemberFieldConverter, " + AssemblyRef.SystemDesign), - Editor("System.Windows.Forms.Design.DataMemberFieldEditor, " + AssemblyRef.SystemDesign, typeof(System.Drawing.Design.UITypeEditor)), - SRDescription(nameof(SR.ListControlDisplayMemberDescr)) - ] - public string DisplayMember { - get { - return displayMember.BindingMember; - } - set { + [SRCategory(nameof(SR.CatData))] + [DefaultValue("")] + [TypeConverterAttribute("System.Windows.Forms.Design.DataMemberFieldConverter, " + AssemblyRef.SystemDesign)] + [Editor("System.Windows.Forms.Design.DataMemberFieldEditor, " + AssemblyRef.SystemDesign, typeof(UITypeEditor))] + [SRDescription(nameof(SR.ListControlDisplayMemberDescr))] + public string DisplayMember + { + get => displayMember.BindingMember; + set + { BindingMemberInfo oldDisplayMember = displayMember; - try { - SetDataConnection(dataSource, new BindingMemberInfo(value), false); - } catch { + try + { + SetDataConnection(dataSource, new BindingMemberInfo(value), force: false); + } + catch + { displayMember = oldDisplayMember; } } } - /// - [SRCategory(nameof(SR.CatPropertyChanged)), SRDescription(nameof(SR.ListControlOnDisplayMemberChangedDescr))] - public event EventHandler DisplayMemberChanged { - add { + [SRCategory(nameof(SR.CatPropertyChanged))] + [SRDescription(nameof(SR.ListControlOnDisplayMemberChangedDescr))] + public event EventHandler DisplayMemberChanged + { + add + { Events.AddHandler(EVENT_DISPLAYMEMBERCHANGED, value); } - remove { + remove + { Events.RemoveHandler(EVENT_DISPLAYMEMBERCHANGED, value); } } - // Cached type converter of the property associated with the display member - private TypeConverter DisplayMemberConverter { - get { - if (this.displayMemberConverter == null && - this.DataManager != null && - this.displayMember != null) { - PropertyDescriptorCollection props = this.DataManager.GetItemProperties(); - if (props != null) { - PropertyDescriptor displayMemberProperty = props.Find(this.displayMember.BindingField, true); + /// + /// Cached type converter of the property associated with the display member + /// + private TypeConverter DisplayMemberConverter + { + get + { + if (displayMemberConverter == null && + DataManager != null && + displayMember != null) + { + PropertyDescriptorCollection props = DataManager.GetItemProperties(); + if (props != null) + { + PropertyDescriptor displayMemberProperty = props.Find(displayMember.BindingField, true); if (displayMemberProperty != null) { - this.displayMemberConverter = displayMemberProperty.Converter; + displayMemberConverter = displayMemberProperty.Converter; } } } - return this.displayMemberConverter; + + return displayMemberConverter; } } - /// - [SRCategory(nameof(SR.CatPropertyChanged)), SRDescription(nameof(SR.ListControlFormatDescr))] + [SRCategory(nameof(SR.CatPropertyChanged))] + [SRDescription(nameof(SR.ListControlFormatDescr))] public event ListControlConvertEventHandler Format { - add { + add + { Events.AddHandler(EVENT_FORMAT, value); RefreshItems(); } - remove { + remove + { Events.RemoveHandler(EVENT_FORMAT, value); RefreshItems(); } } - /// - [ - Browsable(false), - EditorBrowsable(EditorBrowsableState.Advanced), - DefaultValue(null) - ] - public IFormatProvider FormatInfo { - get { - return this.formatInfo; - } - set { - if (value != formatInfo) { + [Browsable(false)] + [EditorBrowsable(EditorBrowsableState.Advanced)] + [DefaultValue(null)] + public IFormatProvider FormatInfo + { + get => formatInfo; + set + { + if (value != formatInfo) + { formatInfo = value; RefreshItems(); OnFormatInfoChanged(EventArgs.Empty); @@ -202,69 +203,68 @@ public IFormatProvider FormatInfo { } } - /// - [ - Browsable(false), - EditorBrowsable(EditorBrowsableState.Advanced), - SRCategory(nameof(SR.CatPropertyChanged)), - SRDescription(nameof(SR.ListControlFormatInfoChangedDescr)) - ] - public event EventHandler FormatInfoChanged { - add { + [Browsable(false)] + [EditorBrowsable(EditorBrowsableState.Advanced)] + [SRCategory(nameof(SR.CatPropertyChanged))] + [SRDescription(nameof(SR.ListControlFormatInfoChangedDescr))] + public event EventHandler FormatInfoChanged + { + add + { Events.AddHandler(EVENT_FORMATINFOCHANGED, value); } - remove { + remove + { Events.RemoveHandler(EVENT_FORMATINFOCHANGED, value); } } - [ - DefaultValue(""), - SRDescription(nameof(SR.ListControlFormatStringDescr)), - EditorAttribute("System.Windows.Forms.Design.FormatStringEditor, " + AssemblyRef.SystemDesign, typeof(System.Drawing.Design.UITypeEditor)), - MergableProperty(false) - ] - /// - public string FormatString { - get { - return formatString; - } - set { + [DefaultValue("")] + [SRDescription(nameof(SR.ListControlFormatStringDescr))] + [EditorAttribute("System.Windows.Forms.Design.FormatStringEditor, " + AssemblyRef.SystemDesign, typeof(UITypeEditor))] + [MergableProperty(false)] + public string FormatString + { + get => formatString; + set + { if (value == null) + { value = string.Empty; - if (!value.Equals(formatString)) { + } + + if (!value.Equals(formatString)) + { formatString = value; RefreshItems(); OnFormatStringChanged(EventArgs.Empty); } } } - - /// - [ - SRCategory(nameof(SR.CatPropertyChanged)), - SRDescription(nameof(SR.ListControlFormatStringChangedDescr)) - ] - public event EventHandler FormatStringChanged { - add { + + [SRCategory(nameof(SR.CatPropertyChanged))] + [SRDescription(nameof(SR.ListControlFormatStringChangedDescr))] + public event EventHandler FormatStringChanged + { + add + { Events.AddHandler(EVENT_FORMATSTRINGCHANGED, value); } - remove { + remove + { Events.RemoveHandler(EVENT_FORMATSTRINGCHANGED, value); } } - /// - [ - DefaultValue(false), - SRDescription(nameof(SR.ListControlFormattingEnabledDescr)) - ] - public bool FormattingEnabled { - get { - return formattingEnabled; - } - set { - if (value != formattingEnabled) { + [DefaultValue(false)] + [SRDescription(nameof(SR.ListControlFormattingEnabledDescr))] + public bool FormattingEnabled + { + get => formattingEnabled; + set + { + if (value != formattingEnabled) + { formattingEnabled = value; RefreshItems(); OnFormattingEnabledChanged(EventArgs.Empty); @@ -272,38 +272,50 @@ public bool FormattingEnabled { } } - /// - [ - SRCategory(nameof(SR.CatPropertyChanged)), - SRDescription(nameof(SR.ListControlFormattingEnabledChangedDescr)) - ] - public event EventHandler FormattingEnabledChanged { - add { + [SRCategory(nameof(SR.CatPropertyChanged))] + [SRDescription(nameof(SR.ListControlFormattingEnabledChangedDescr))] + public event EventHandler FormattingEnabledChanged + { + add + { Events.AddHandler(EVENT_FORMATTINGENABLEDCHANGED, value); } - remove { + remove + { Events.RemoveHandler(EVENT_FORMATTINGENABLEDCHANGED, value); } } - private bool BindingMemberInfoInDataManager(BindingMemberInfo bindingMemberInfo) { + private bool BindingMemberInfoInDataManager(BindingMemberInfo bindingMemberInfo) + { if (dataManager == null) + { return false; + } + PropertyDescriptorCollection props = dataManager.GetItemProperties(); int propsCount = props.Count; - for (int i = 0; i < propsCount; i++) { + for (int i = 0; i < propsCount; i++) + { if (typeof(IList).IsAssignableFrom(props[i].PropertyType)) + { continue; - if (props[i].Name.Equals(bindingMemberInfo.BindingField)) { + } + if (props[i].Name.Equals(bindingMemberInfo.BindingField)) + { return true; } } - for (int i = 0; i < propsCount; i++) { + for (int i = 0; i < propsCount; i++) + { if (typeof(IList).IsAssignableFrom(props[i].PropertyType)) + { continue; - if (string.Compare(props[i].Name, bindingMemberInfo.BindingField, true, CultureInfo.CurrentCulture) == 0) { + } + if (string.Equals(props[i].Name, bindingMemberInfo.BindingField, StringComparison.CurrentCultureIgnoreCase)) + { return true; } } @@ -311,393 +323,406 @@ private bool BindingMemberInfoInDataManager(BindingMemberInfo bindingMemberInfo) return false; } - /// - [ - SRCategory(nameof(SR.CatData)), - DefaultValue(""), - Editor("System.Windows.Forms.Design.DataMemberFieldEditor, " + AssemblyRef.SystemDesign, typeof(System.Drawing.Design.UITypeEditor)), - SRDescription(nameof(SR.ListControlValueMemberDescr)) - ] - public string ValueMember { - get { - return valueMember.BindingMember; - } - set { + [SRCategory(nameof(SR.CatData))] + [DefaultValue("")] + [Editor("System.Windows.Forms.Design.DataMemberFieldEditor, " + AssemblyRef.SystemDesign, typeof(UITypeEditor))] + [SRDescription(nameof(SR.ListControlValueMemberDescr))] + public string ValueMember + { + get => valueMember.BindingMember; + set + { if (value == null) - value = ""; + { + value = string.Empty; + } + BindingMemberInfo newValueMember = new BindingMemberInfo(value); BindingMemberInfo oldValueMember = valueMember; - if (!newValueMember.Equals(valueMember)) { + if (!newValueMember.Equals(valueMember)) + { // If the displayMember is set to the EmptyString, then recreate the dataConnection - // if (DisplayMember.Length == 0) - SetDataConnection(DataSource, newValueMember, false); + { + SetDataConnection(DataSource, newValueMember, force: false); + } + // See if the valueMember is a member of // the properties in the dataManager - if (this.dataManager != null && value != null && value.Length != 0) - if (!BindingMemberInfoInDataManager(newValueMember)) { - throw new ArgumentException(SR.ListControlWrongValueMember, "value"); + if (DataManager != null && !string.IsNullOrEmpty(value)) + { + if (!BindingMemberInfoInDataManager(newValueMember)) + { + throw new ArgumentException(SR.ListControlWrongValueMember, nameof(value)); } + } valueMember = newValueMember; OnValueMemberChanged(EventArgs.Empty); OnSelectedValueChanged(EventArgs.Empty); } } - } + } - /// - [SRCategory(nameof(SR.CatPropertyChanged)), SRDescription(nameof(SR.ListControlOnValueMemberChangedDescr))] - public event EventHandler ValueMemberChanged { - add { + [SRCategory(nameof(SR.CatPropertyChanged))] + [SRDescription(nameof(SR.ListControlOnValueMemberChangedDescr))] + public event EventHandler ValueMemberChanged + { + add + { Events.AddHandler(EVENT_VALUEMEMBERCHANGED, value); } - remove { + remove + { Events.RemoveHandler(EVENT_VALUEMEMBERCHANGED, value); } } - /// /// - /// Indicates whether list currently allows selection of list items. + /// Indicates whether list currently allows selection of list items. /// - protected virtual bool AllowSelection { - get { - return true; - } - } - - /// - public abstract int SelectedIndex { - get; - set; - } - - /// - [ - SRCategory(nameof(SR.CatData)), - DefaultValue(null), - Browsable(false), - DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), - SRDescription(nameof(SR.ListControlSelectedValueDescr)), - Bindable(true) - ] - public object SelectedValue { - get { - if (SelectedIndex != -1 && dataManager != null ) { + protected virtual bool AllowSelection => true; + + public abstract int SelectedIndex { get; set; } + + [SRCategory(nameof(SR.CatData))] + [DefaultValue(null)] + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + [SRDescription(nameof(SR.ListControlSelectedValueDescr))] + [Bindable(true)] + public object SelectedValue + { + get + { + if (SelectedIndex != -1 && dataManager != null) + { object currentItem = dataManager[SelectedIndex]; - object filteredItem = FilterItemOnProperty(currentItem, valueMember.BindingField); - return filteredItem; + return FilterItemOnProperty(currentItem, valueMember.BindingField); } + return null; } - set { - if (dataManager != null) { + set + { + if (dataManager != null) + { string propertyName = valueMember.BindingField; - // we can't set the SelectedValue property when the listManager does not + // We can't set the SelectedValue property when the listManager does not // have a ValueMember set. if (string.IsNullOrEmpty(propertyName)) + { throw new InvalidOperationException(SR.ListControlEmptyValueMemberInSettingSelectedValue); + } + PropertyDescriptorCollection props = dataManager.GetItemProperties(); PropertyDescriptor property = props.Find(propertyName, true); int index = dataManager.Find(property, value, true); - this.SelectedIndex = index; + SelectedIndex = index; } } } - - /// - [SRCategory(nameof(SR.CatPropertyChanged)), SRDescription(nameof(SR.ListControlOnSelectedValueChangedDescr))] - public event EventHandler SelectedValueChanged { - add { + + [SRCategory(nameof(SR.CatPropertyChanged))] + [SRDescription(nameof(SR.ListControlOnSelectedValueChangedDescr))] + public event EventHandler SelectedValueChanged + { + add + { Events.AddHandler(EVENT_SELECTEDVALUECHANGED, value); } - remove { + remove + { Events.RemoveHandler(EVENT_SELECTEDVALUECHANGED, value); } } - private void DataManager_PositionChanged(object sender, EventArgs e) { - if (this.dataManager != null) { - if (AllowSelection) { - this.SelectedIndex = dataManager.Position; + private void DataManager_PositionChanged(object sender, EventArgs e) + { + if (DataManager != null) + { + if (AllowSelection) + { + SelectedIndex = dataManager.Position; } } } - private void DataManager_ItemChanged(object sender, ItemChangedEventArgs e) { + private void DataManager_ItemChanged(object sender, ItemChangedEventArgs e) + { // Note this is being called internally with a null event. - if (dataManager != null) { - if (e.Index == -1) { + if (dataManager != null) + { + if (e.Index == -1) + { SetItemsCore(dataManager.List); - if (AllowSelection) { - this.SelectedIndex = this.dataManager.Position; + if (AllowSelection) + { + SelectedIndex = DataManager.Position; } } - else { + else + { SetItemCore(e.Index, dataManager[e.Index]); } } } - /// - /// - protected object FilterItemOnProperty(object item) { + protected object FilterItemOnProperty(object item) + { return FilterItemOnProperty(item, displayMember.BindingField); } - - /// - /// - protected object FilterItemOnProperty(object item, string field) { - if (item != null && field.Length > 0) { - try { + + protected object FilterItemOnProperty(object item, string field) + { + if (item != null && field.Length > 0) + { + try + { // if we have a dataSource, then use that to display the string PropertyDescriptor descriptor; - if (this.dataManager != null) - descriptor = this.dataManager.GetItemProperties().Find(field, true); + if (DataManager != null) + { + descriptor = DataManager.GetItemProperties().Find(field, true); + } else + { descriptor = TypeDescriptor.GetProperties(item).Find(field, true); - if (descriptor != null) { + } + if (descriptor != null) + { item = descriptor.GetValue(item); } } - catch { + catch + { } } - return item; - } - - //We use this to prevent getting the selected item when mouse is hovering over the dropdown. - // - internal bool BindingFieldEmpty { - get { - return (displayMember.BindingField.Length > 0 ? false : true); - } + return item; } - internal int FindStringInternal(string str, IList items, int startIndex, bool exact) { - return FindStringInternal(str, items, startIndex, exact, true); - } + /// + /// We use this to prevent getting the selected item when mouse is hovering + /// over the dropdown. + /// + private protected bool BindingFieldEmpty => displayMember.BindingField.Length == 0; - internal int FindStringInternal(string str, IList items, int startIndex, bool exact, bool ignorecase) { - - // Sanity check parameters - // - if (str == null || items == null) { + private protected int FindStringInternal(string str, IList items, int startIndex, bool exact, bool ignoreCase) + { + if (str == null || items == null) + { return -1; } - // The last item in the list is still a valid place to start looking! - if (startIndex < -1 || startIndex >= items.Count) { + + // The last item in the list is still a valid place to start looking. + if (startIndex < -1 || startIndex >= items.Count) + { return -1; } - + bool found = false; int length = str.Length; // Start from the start index and wrap around until we find the string - // in question. Use a separate counter to ensure that we arent cycling through the list infinitely. + // in question. Use a separate counter to ensure that we arent cycling through the list infinitely. int numberOfTimesThroughLoop = 0; // this API is really Find NEXT String... - for (int index = (startIndex+1) % items.Count; numberOfTimesThroughLoop < items.Count; index = (index+1) % items.Count) { + for (int index = (startIndex + 1) % items.Count; numberOfTimesThroughLoop < items.Count; index = (index + 1) % items.Count) + { numberOfTimesThroughLoop++; - if (exact) { - found = string.Compare(str, GetItemText(items[index]), ignorecase, CultureInfo.CurrentCulture) == 0; + if (exact) + { + found = string.Compare(str, GetItemText(items[index]), ignoreCase, CultureInfo.CurrentCulture) == 0; } - else { - found = string.Compare(str, 0, GetItemText(items[index]), 0, length, ignorecase, CultureInfo.CurrentCulture) == 0; + else + { + found = string.Compare(str, 0, GetItemText(items[index]), 0, length, ignoreCase, CultureInfo.CurrentCulture) == 0; } - - if (found) { + + if (found) + { return index; } - } - + return -1; } - /// public string GetItemText(object item) { - - // !formattingEnabled == RTM behaviour - if (!formattingEnabled) { - - if (item == null) { + if (!formattingEnabled) + { + if (item == null) + { return string.Empty; } item = FilterItemOnProperty(item, displayMember.BindingField); - return (item != null) ? Convert.ToString(item, CultureInfo.CurrentCulture) : ""; - } + if (item == null) + { + return string.Empty; + } - // - // Whidbey formatting features - // + return Convert.ToString(item, CultureInfo.CurrentCulture); + } object filteredItem = FilterItemOnProperty(item, displayMember.BindingField); - // first try: the OnFormat event - ListControlConvertEventArgs e = new ListControlConvertEventArgs(filteredItem, typeof(string), item); + // First try the OnFormat event + var e = new ListControlConvertEventArgs(filteredItem, typeof(string), item); OnFormat(e); - - // Microsoft: we need a better check. Should add the Handled property on the ListControlConvertEventArgs? - if (e.Value != item && e.Value is string) { - return (string) e.Value; + if (e.Value != item && e.Value is string stringValue) + { + return stringValue; } - // try Formatter::FormatObject + // Try Formatter.FormatObject if (stringTypeConverter == null) - { + { stringTypeConverter = TypeDescriptor.GetConverter(typeof(string)); - } + } try { - return (string) Formatter.FormatObject(filteredItem, typeof(string), this.DisplayMemberConverter, stringTypeConverter, formatString, formatInfo, null, System.DBNull.Value); + return (string)Formatter.FormatObject(filteredItem, typeof(string), DisplayMemberConverter, stringTypeConverter, formatString, formatInfo, null, DBNull.Value); } - catch (Exception exception) + catch (Exception exception) when (!ClientUtils.IsSecurityOrCriticalException(exception)) { - if (ClientUtils.IsSecurityOrCriticalException(exception)) + if (filteredItem == null) { - throw; + return string.Empty; } + // if we did not do any work then return the old ItemText - return (filteredItem != null) ? Convert.ToString(item, CultureInfo.CurrentCulture) : ""; + return Convert.ToString(item, CultureInfo.CurrentCulture); } } - /// /// - /// Handling special input keys, such as pgup, pgdown, home, end, etc... + /// Handling special input keys, such as PageUp, PageDown, Home, End, etc... /// - protected override bool IsInputKey(Keys keyData) { - if ((keyData & Keys.Alt) == Keys.Alt) return false; - switch (keyData & Keys.KeyCode) { + protected override bool IsInputKey(Keys keyData) + { + if ((keyData & Keys.Alt) == Keys.Alt) + { + return false; + } + + switch (keyData & Keys.KeyCode) + { case Keys.PageUp: case Keys.PageDown: case Keys.Home: case Keys.End: return true; } + return base.IsInputKey(keyData); } - - /// - protected override void OnBindingContextChanged(EventArgs e) { - SetDataConnection(dataSource, displayMember, true); - + + protected override void OnBindingContextChanged(EventArgs e) + { + SetDataConnection(dataSource, displayMember, force: true); base.OnBindingContextChanged(e); } - - /// - protected virtual void OnDataSourceChanged(EventArgs e) { + protected virtual void OnDataSourceChanged(EventArgs e) + { EventHandler eh = Events[EVENT_DATASOURCECHANGED] as EventHandler; - if (eh != null) { - eh(this, e); - } + eh?.Invoke(this, e); } - /// - protected virtual void OnDisplayMemberChanged(EventArgs e) { + protected virtual void OnDisplayMemberChanged(EventArgs e) + { EventHandler eh = Events[EVENT_DISPLAYMEMBERCHANGED] as EventHandler; - if (eh != null) { - eh(this, e); - } + eh?.Invoke(this, e); } - /// - protected virtual void OnFormat(ListControlConvertEventArgs e) { + protected virtual void OnFormat(ListControlConvertEventArgs e) + { ListControlConvertEventHandler eh = Events[EVENT_FORMAT] as ListControlConvertEventHandler; - if (eh != null) - eh(this, e); + eh?.Invoke(this, e); } - /// - protected virtual void OnFormatInfoChanged(EventArgs e) { + protected virtual void OnFormatInfoChanged(EventArgs e) + { EventHandler eh = Events[EVENT_FORMATINFOCHANGED] as EventHandler; - if (eh != null) - eh(this,e); + eh?.Invoke(this, e); } - /// - protected virtual void OnFormatStringChanged(EventArgs e) { + protected virtual void OnFormatStringChanged(EventArgs e) + { EventHandler eh = Events[EVENT_FORMATSTRINGCHANGED] as EventHandler; - if (eh != null) - eh(this,e); + eh?.Invoke(this, e); } - - /// - protected virtual void OnFormattingEnabledChanged(EventArgs e) { + + protected virtual void OnFormattingEnabledChanged(EventArgs e) + { EventHandler eh = Events[EVENT_FORMATTINGENABLEDCHANGED] as EventHandler; - if (eh != null) - eh(this,e); + eh?.Invoke(this, e); } - - /// + /// - /// Actually goes and fires the selectedIndexChanged event. Inheriting controls - /// should use this to know when the event is fired [this is preferable to - /// adding an event handler on yourself for this event]. They should, - /// however, remember to call base.OnSelectedIndexChanged(e); to ensure the event is - /// still fired to external listeners + /// Actually goes and fires the selectedIndexChanged event. Inheriting controls + /// should use this to know when the event is fired [this is preferable to + /// adding an event handler on yourself for this event]. They should, + /// however, remember to call base.OnSelectedIndexChanged(e); to ensure the event is + /// still fired to external listeners /// - protected virtual void OnSelectedIndexChanged(EventArgs e) { + protected virtual void OnSelectedIndexChanged(EventArgs e) + { OnSelectedValueChanged(EventArgs.Empty); } - /// - protected virtual void OnValueMemberChanged(EventArgs e) { + protected virtual void OnValueMemberChanged(EventArgs e) + { EventHandler eh = Events[EVENT_VALUEMEMBERCHANGED] as EventHandler; - if (eh != null) { - eh(this, e); - } + eh?.Invoke(this, e); } - /// - protected virtual void OnSelectedValueChanged(EventArgs e) { + protected virtual void OnSelectedValueChanged(EventArgs e) + { EventHandler eh = Events[EVENT_SELECTEDVALUECHANGED] as EventHandler; - if (eh != null) { - eh(this, e); - } + eh?.Invoke(this, e); } - /// protected abstract void RefreshItem(int index); - - /// - protected virtual void RefreshItems() { + + protected virtual void RefreshItems() + { } - - private void DataSourceDisposed(object sender, EventArgs e) { - Debug.Assert(sender == this.dataSource, "how can we get dispose notification for anything other than our dataSource?"); - SetDataConnection(null, new BindingMemberInfo(""), true); + + private void DataSourceDisposed(object sender, EventArgs e) + { + Debug.Assert(sender == dataSource, "how can we get dispose notification for anything other than our dataSource?"); + SetDataConnection(null, new BindingMemberInfo(string.Empty), true); } - private void DataSourceInitialized(object sender, EventArgs e) { - ISupportInitializeNotification dsInit = (this.dataSource as ISupportInitializeNotification); + private void DataSourceInitialized(object sender, EventArgs e) + { + ISupportInitializeNotification dsInit = (dataSource as ISupportInitializeNotification); Debug.Assert(dsInit != null, "ListControl: ISupportInitializeNotification.Initialized event received, but current DataSource does not support ISupportInitializeNotification!"); Debug.Assert(dsInit.IsInitialized, "ListControl: DataSource sent ISupportInitializeNotification.Initialized event but before it had finished initializing."); - SetDataConnection(this.dataSource, this.displayMember, true); + SetDataConnection(dataSource, displayMember, true); } - private void SetDataConnection(object newDataSource, BindingMemberInfo newDisplayMember, bool force) { + private void SetDataConnection(object newDataSource, BindingMemberInfo newDisplayMember, bool force) + { bool dataSourceChanged = dataSource != newDataSource; bool displayMemberChanged = !displayMember.Equals(newDisplayMember); - // make sure something interesting is happening... - // - //force = force && (dataSource != null || newDataSource != null); - if (inSetDataConnection) { + if (inSetDataConnection) + { return; } - try { - if (force || dataSourceChanged || displayMemberChanged) { + try + { + if (force || dataSourceChanged || displayMemberChanged) + { inSetDataConnection = true; - IList currentList = this.DataManager != null ? this.DataManager.List : null; - bool currentManagerIsNull = this.DataManager == null; + IList currentList = DataManager?.List; + bool currentManagerIsNull = DataManager == null; UnwireDataSource(); @@ -709,23 +734,26 @@ private void SetDataConnection(object newDataSource, BindingMemberInfo newDispla // Provided the data source has been fully initialized, start listening to change events on its // currency manager and refresh our list. If the data source has not yet been initialized, we will // skip this step for now, and try again later (once the data source has fired its Initialized event). - // - if (isDataSourceInitialized) { - + if (isDataSourceInitialized) + { CurrencyManager newDataManager = null; - if (newDataSource != null && BindingContext != null && !(newDataSource == Convert.DBNull)) { + if (newDataSource != null && BindingContext != null && newDataSource != Convert.DBNull) + { newDataManager = (CurrencyManager)BindingContext[newDataSource, newDisplayMember.BindingPath]; } - if (dataManager != newDataManager) { - if (dataManager != null) { + if (dataManager != newDataManager) + { + if (dataManager != null) + { dataManager.ItemChanged -= new ItemChangedEventHandler(DataManager_ItemChanged); dataManager.PositionChanged -= new EventHandler(DataManager_PositionChanged); } dataManager = newDataManager; - if (dataManager != null) { + if (dataManager != null) + { dataManager.ItemChanged += new ItemChangedEventHandler(DataManager_ItemChanged); dataManager.PositionChanged += new EventHandler(DataManager_PositionChanged); } @@ -734,83 +762,94 @@ private void SetDataConnection(object newDataSource, BindingMemberInfo newDispla // See if the BindingField in the newDisplayMember is valid // The same thing if dataSource Changed // "" is a good value for displayMember - if (dataManager != null && (displayMemberChanged || dataSourceChanged) && displayMember.BindingMember != null && displayMember.BindingMember.Length != 0) { - + if (dataManager != null && (displayMemberChanged || dataSourceChanged) && !string.IsNullOrEmpty(displayMember.BindingMember)) + { if (!BindingMemberInfoInDataManager(displayMember)) - throw new ArgumentException(SR.ListControlWrongDisplayMember, "newDisplayMember"); + { + throw new ArgumentException(SR.ListControlWrongDisplayMember, nameof(newDisplayMember)); + } } - if (dataManager != null && (dataSourceChanged || displayMemberChanged || force)) { - // if we force a new data manager, then change the items in the list control + if (dataManager != null && (dataSourceChanged || displayMemberChanged || force)) + { + // If we force a new data manager, then change the items in the list control // only if the list changed or if we go from a null dataManager to a full fledged one // or if the DisplayMember changed - if (displayMemberChanged || (force && (currentList != this.dataManager.List || currentManagerIsNull))) { + if (displayMemberChanged || (force && (currentList != DataManager.List || currentManagerIsNull))) + { DataManager_ItemChanged(dataManager, new ItemChangedEventArgs(-1)); } } } - this.displayMemberConverter = null; + + displayMemberConverter = null; } - if (dataSourceChanged) { + if (dataSourceChanged) + { OnDataSourceChanged(EventArgs.Empty); } - if (displayMemberChanged) { + if (displayMemberChanged) + { OnDisplayMemberChanged(EventArgs.Empty); } } - finally { + finally + { inSetDataConnection = false; } } - private void UnwireDataSource() { - // If the source is a component, then unhook the Disposed event - if (this.dataSource is IComponent) { - ((IComponent) this.dataSource).Disposed -= new EventHandler(DataSourceDisposed); - } - - ISupportInitializeNotification dsInit = (this.dataSource as ISupportInitializeNotification); + private void UnwireDataSource() + { + // If the source is a component, then unhook the Disposed event + if (dataSource is IComponent componentDataSource) + { + componentDataSource.Disposed -= new EventHandler(DataSourceDisposed); + } - if (dsInit != null && isDataSourceInitEventHooked) { - // If we previously hooked the data source's ISupportInitializeNotification - // Initialized event, then unhook it now (we don't always hook this event, - // only if we needed to because the data source was previously uninitialized) - dsInit.Initialized -= new EventHandler(DataSourceInitialized); - isDataSourceInitEventHooked = false; - } + if (dataSource is ISupportInitializeNotification dsInit && isDataSourceInitEventHooked) + { + // If we previously hooked the data source's ISupportInitializeNotification + // Initialized event, then unhook it now (we don't always hook this event, + // only if we needed to because the data source was previously uninitialized) + dsInit.Initialized -= new EventHandler(DataSourceInitialized); + isDataSourceInitEventHooked = false; + } } - private void WireDataSource() { - // If the source is a component, then hook the Disposed event, - // so we know when the component is deleted from the form - if (this.dataSource is IComponent) { - ((IComponent) this.dataSource).Disposed += new EventHandler(DataSourceDisposed); - } - - ISupportInitializeNotification dsInit = (this.dataSource as ISupportInitializeNotification); + private void WireDataSource() + { + // If the source is a component, then hook the Disposed event, + // so we know when the component is deleted from the form + if (dataSource is IComponent componentDataSource) + { + componentDataSource.Disposed += new EventHandler(DataSourceDisposed); + } - if (dsInit != null && !dsInit.IsInitialized) { - // If the source provides initialization notification, and is not yet - // fully initialized, then hook the Initialized event, so that we can - // delay connecting to it until it *is* initialized. - dsInit.Initialized += new EventHandler(DataSourceInitialized); - isDataSourceInitEventHooked = true; - isDataSourceInitialized = false; - } - else { - // Otherwise either the data source says it *is* initialized, or it - // does not support the capability to report whether its initialized, - // in which case we have to just assume it that is initialized. - isDataSourceInitialized = true; - } + if (dataSource is ISupportInitializeNotification dsInit && !dsInit.IsInitialized) + { + // If the source provides initialization notification, and is not yet + // fully initialized, then hook the Initialized event, so that we can + // delay connecting to it until it *is* initialized. + dsInit.Initialized += new EventHandler(DataSourceInitialized); + isDataSourceInitEventHooked = true; + isDataSourceInitialized = false; + } + else + { + // Otherwise either the data source says it *is* initialized, or it + // does not support the capability to report whether its initialized, + // in which case we have to just assume it that is initialized. + isDataSourceInitialized = true; + } } - /// protected abstract void SetItemsCore(IList items); - /// - protected virtual void SetItemCore(int index, object value) {} + protected virtual void SetItemCore(int index, object value) + { + } } } From 75377edcc9ca471edc95a00939bcdca72d4ba9ca Mon Sep 17 00:00:00 2001 From: Hugh Bellamy Date: Wed, 3 Apr 2019 13:26:20 +0800 Subject: [PATCH 2/2] Rename variables --- .../src/System/Windows/Forms/ListControl.cs | 255 +++++++++--------- 1 file changed, 127 insertions(+), 128 deletions(-) diff --git a/src/System.Windows.Forms/src/System/Windows/Forms/ListControl.cs b/src/System.Windows.Forms/src/System/Windows/Forms/ListControl.cs index 050d5cc450e..34ee4c5dae6 100644 --- a/src/System.Windows.Forms/src/System/Windows/Forms/ListControl.cs +++ b/src/System.Windows.Forms/src/System/Windows/Forms/ListControl.cs @@ -16,30 +16,29 @@ namespace System.Windows.Forms [LookupBindingProperties(nameof(ListControl.DataSource), nameof(ListControl.DisplayMember), nameof(ListControl.ValueMember), nameof(ListControl.SelectedValue))] public abstract class ListControl : Control { - private static readonly object EVENT_DATASOURCECHANGED = new object(); - private static readonly object EVENT_DISPLAYMEMBERCHANGED = new object(); - private static readonly object EVENT_VALUEMEMBERCHANGED = new object(); - private static readonly object EVENT_SELECTEDVALUECHANGED = new object(); - private static readonly object EVENT_FORMATINFOCHANGED = new object(); - private static readonly object EVENT_FORMATSTRINGCHANGED = new object(); - private static readonly object EVENT_FORMATTINGENABLEDCHANGED = new object(); - - private object dataSource; - private CurrencyManager dataManager; - private BindingMemberInfo displayMember; - private BindingMemberInfo valueMember; - - // Formatting stuff - private string formatString = string.Empty; - private IFormatProvider formatInfo = null; - private bool formattingEnabled = false; - private static readonly object EVENT_FORMAT = new object(); - private TypeConverter displayMemberConverter = null; - private static TypeConverter stringTypeConverter = null; - - private bool isDataSourceInitialized; - private bool isDataSourceInitEventHooked; - private bool inSetDataConnection = false; + private static readonly object s_dataSourceChangedEvent = new object(); + private static readonly object s_displayMemberChangedEvent = new object(); + private static readonly object s_valueMemberChangedEvent = new object(); + private static readonly object s_selectedValueChangedEvent = new object(); + private static readonly object s_formatInfoChangedEvent = new object(); + private static readonly object s_formatStringChangedEvent = new object(); + private static readonly object s_formattingEnabledChangedEvent = new object(); + private static readonly object s_formatEvent = new object(); + + private object _dataSource; + private CurrencyManager _dataManager; + private BindingMemberInfo _displayMember; + private BindingMemberInfo _valueMember; + + private string _formatString = string.Empty; + private IFormatProvider _formatInfo = null; + private bool _formattingEnabled = false; + private TypeConverter _displayMemberConverter = null; + private static TypeConverter _stringTypeConverter = null; + + private bool _isDataSourceInitialized; + private bool _isDataSourceInitEventHooked; + private bool _inSetDataConnection = false; /// /// The ListSource to consume as this ListBox's source of data. @@ -52,7 +51,7 @@ public abstract class ListControl : Control [SRDescription(nameof(SR.ListControlDataSourceDescr))] public object DataSource { - get => dataSource; + get => _dataSource; set { if (value != null && !(value is IList || value is IListSource)) @@ -60,7 +59,7 @@ public object DataSource throw new ArgumentException(SR.BadDataSourceForComplexBinding); } - if (dataSource == value) + if (_dataSource == value) { return; } @@ -69,7 +68,7 @@ public object DataSource // the displayMember to "". try { - SetDataConnection(value, displayMember, force: false); + SetDataConnection(value, _displayMember, force: false); } catch { @@ -94,15 +93,15 @@ public event EventHandler DataSourceChanged { add { - Events.AddHandler(EVENT_DATASOURCECHANGED, value); + Events.AddHandler(s_dataSourceChangedEvent, value); } remove { - Events.RemoveHandler(EVENT_DATASOURCECHANGED, value); + Events.RemoveHandler(s_dataSourceChangedEvent, value); } } - protected CurrencyManager DataManager => dataManager; + protected CurrencyManager DataManager => _dataManager; /// /// If the ListBox contains objects that support properties, this indicates @@ -115,17 +114,17 @@ public event EventHandler DataSourceChanged [SRDescription(nameof(SR.ListControlDisplayMemberDescr))] public string DisplayMember { - get => displayMember.BindingMember; + get => _displayMember.BindingMember; set { - BindingMemberInfo oldDisplayMember = displayMember; + BindingMemberInfo oldDisplayMember = _displayMember; try { - SetDataConnection(dataSource, new BindingMemberInfo(value), force: false); + SetDataConnection(_dataSource, new BindingMemberInfo(value), force: false); } catch { - displayMember = oldDisplayMember; + _displayMember = oldDisplayMember; } } } @@ -136,11 +135,11 @@ public event EventHandler DisplayMemberChanged { add { - Events.AddHandler(EVENT_DISPLAYMEMBERCHANGED, value); + Events.AddHandler(s_displayMemberChangedEvent, value); } remove { - Events.RemoveHandler(EVENT_DISPLAYMEMBERCHANGED, value); + Events.RemoveHandler(s_displayMemberChangedEvent, value); } } @@ -151,22 +150,22 @@ private TypeConverter DisplayMemberConverter { get { - if (displayMemberConverter == null && + if (_displayMemberConverter == null && DataManager != null && - displayMember != null) + _displayMember != null) { PropertyDescriptorCollection props = DataManager.GetItemProperties(); if (props != null) { - PropertyDescriptor displayMemberProperty = props.Find(displayMember.BindingField, true); + PropertyDescriptor displayMemberProperty = props.Find(_displayMember.BindingField, true); if (displayMemberProperty != null) { - displayMemberConverter = displayMemberProperty.Converter; + _displayMemberConverter = displayMemberProperty.Converter; } } } - return displayMemberConverter; + return _displayMemberConverter; } } @@ -176,12 +175,12 @@ public event ListControlConvertEventHandler Format { add { - Events.AddHandler(EVENT_FORMAT, value); + Events.AddHandler(s_formatEvent, value); RefreshItems(); } remove { - Events.RemoveHandler(EVENT_FORMAT, value); + Events.RemoveHandler(s_formatEvent, value); RefreshItems(); } } @@ -191,12 +190,12 @@ public event ListControlConvertEventHandler Format [DefaultValue(null)] public IFormatProvider FormatInfo { - get => formatInfo; + get => _formatInfo; set { - if (value != formatInfo) + if (value != _formatInfo) { - formatInfo = value; + _formatInfo = value; RefreshItems(); OnFormatInfoChanged(EventArgs.Empty); } @@ -211,11 +210,11 @@ public event EventHandler FormatInfoChanged { add { - Events.AddHandler(EVENT_FORMATINFOCHANGED, value); + Events.AddHandler(s_formatInfoChangedEvent, value); } remove { - Events.RemoveHandler(EVENT_FORMATINFOCHANGED, value); + Events.RemoveHandler(s_formatInfoChangedEvent, value); } } @@ -225,7 +224,7 @@ public event EventHandler FormatInfoChanged [MergableProperty(false)] public string FormatString { - get => formatString; + get => _formatString; set { if (value == null) @@ -233,9 +232,9 @@ public string FormatString value = string.Empty; } - if (!value.Equals(formatString)) + if (!value.Equals(_formatString)) { - formatString = value; + _formatString = value; RefreshItems(); OnFormatStringChanged(EventArgs.Empty); } @@ -248,11 +247,11 @@ public event EventHandler FormatStringChanged { add { - Events.AddHandler(EVENT_FORMATSTRINGCHANGED, value); + Events.AddHandler(s_formatStringChangedEvent, value); } remove { - Events.RemoveHandler(EVENT_FORMATSTRINGCHANGED, value); + Events.RemoveHandler(s_formatStringChangedEvent, value); } } @@ -260,12 +259,12 @@ public event EventHandler FormatStringChanged [SRDescription(nameof(SR.ListControlFormattingEnabledDescr))] public bool FormattingEnabled { - get => formattingEnabled; + get => _formattingEnabled; set { - if (value != formattingEnabled) + if (value != _formattingEnabled) { - formattingEnabled = value; + _formattingEnabled = value; RefreshItems(); OnFormattingEnabledChanged(EventArgs.Empty); } @@ -278,22 +277,22 @@ public event EventHandler FormattingEnabledChanged { add { - Events.AddHandler(EVENT_FORMATTINGENABLEDCHANGED, value); + Events.AddHandler(s_formattingEnabledChangedEvent, value); } remove { - Events.RemoveHandler(EVENT_FORMATTINGENABLEDCHANGED, value); + Events.RemoveHandler(s_formattingEnabledChangedEvent, value); } } private bool BindingMemberInfoInDataManager(BindingMemberInfo bindingMemberInfo) { - if (dataManager == null) + if (_dataManager == null) { return false; } - PropertyDescriptorCollection props = dataManager.GetItemProperties(); + PropertyDescriptorCollection props = _dataManager.GetItemProperties(); int propsCount = props.Count; for (int i = 0; i < propsCount; i++) @@ -329,7 +328,7 @@ private bool BindingMemberInfoInDataManager(BindingMemberInfo bindingMemberInfo) [SRDescription(nameof(SR.ListControlValueMemberDescr))] public string ValueMember { - get => valueMember.BindingMember; + get => _valueMember.BindingMember; set { if (value == null) @@ -338,8 +337,8 @@ public string ValueMember } BindingMemberInfo newValueMember = new BindingMemberInfo(value); - BindingMemberInfo oldValueMember = valueMember; - if (!newValueMember.Equals(valueMember)) + BindingMemberInfo oldValueMember = _valueMember; + if (!newValueMember.Equals(_valueMember)) { // If the displayMember is set to the EmptyString, then recreate the dataConnection if (DisplayMember.Length == 0) @@ -357,7 +356,7 @@ public string ValueMember } } - valueMember = newValueMember; + _valueMember = newValueMember; OnValueMemberChanged(EventArgs.Empty); OnSelectedValueChanged(EventArgs.Empty); } @@ -370,11 +369,11 @@ public event EventHandler ValueMemberChanged { add { - Events.AddHandler(EVENT_VALUEMEMBERCHANGED, value); + Events.AddHandler(s_valueMemberChangedEvent, value); } remove { - Events.RemoveHandler(EVENT_VALUEMEMBERCHANGED, value); + Events.RemoveHandler(s_valueMemberChangedEvent, value); } } @@ -395,19 +394,19 @@ public object SelectedValue { get { - if (SelectedIndex != -1 && dataManager != null) + if (SelectedIndex != -1 && _dataManager != null) { - object currentItem = dataManager[SelectedIndex]; - return FilterItemOnProperty(currentItem, valueMember.BindingField); + object currentItem = _dataManager[SelectedIndex]; + return FilterItemOnProperty(currentItem, _valueMember.BindingField); } return null; } set { - if (dataManager != null) + if (_dataManager != null) { - string propertyName = valueMember.BindingField; + string propertyName = _valueMember.BindingField; // We can't set the SelectedValue property when the listManager does not // have a ValueMember set. if (string.IsNullOrEmpty(propertyName)) @@ -415,9 +414,9 @@ public object SelectedValue throw new InvalidOperationException(SR.ListControlEmptyValueMemberInSettingSelectedValue); } - PropertyDescriptorCollection props = dataManager.GetItemProperties(); + PropertyDescriptorCollection props = _dataManager.GetItemProperties(); PropertyDescriptor property = props.Find(propertyName, true); - int index = dataManager.Find(property, value, true); + int index = _dataManager.Find(property, value, true); SelectedIndex = index; } } @@ -429,11 +428,11 @@ public event EventHandler SelectedValueChanged { add { - Events.AddHandler(EVENT_SELECTEDVALUECHANGED, value); + Events.AddHandler(s_selectedValueChangedEvent, value); } remove { - Events.RemoveHandler(EVENT_SELECTEDVALUECHANGED, value); + Events.RemoveHandler(s_selectedValueChangedEvent, value); } } @@ -443,7 +442,7 @@ private void DataManager_PositionChanged(object sender, EventArgs e) { if (AllowSelection) { - SelectedIndex = dataManager.Position; + SelectedIndex = _dataManager.Position; } } } @@ -451,11 +450,11 @@ private void DataManager_PositionChanged(object sender, EventArgs e) private void DataManager_ItemChanged(object sender, ItemChangedEventArgs e) { // Note this is being called internally with a null event. - if (dataManager != null) + if (_dataManager != null) { if (e.Index == -1) { - SetItemsCore(dataManager.List); + SetItemsCore(_dataManager.List); if (AllowSelection) { SelectedIndex = DataManager.Position; @@ -463,14 +462,14 @@ private void DataManager_ItemChanged(object sender, ItemChangedEventArgs e) } else { - SetItemCore(e.Index, dataManager[e.Index]); + SetItemCore(e.Index, _dataManager[e.Index]); } } } protected object FilterItemOnProperty(object item) { - return FilterItemOnProperty(item, displayMember.BindingField); + return FilterItemOnProperty(item, _displayMember.BindingField); } protected object FilterItemOnProperty(object item, string field) @@ -506,7 +505,7 @@ protected object FilterItemOnProperty(object item, string field) /// We use this to prevent getting the selected item when mouse is hovering /// over the dropdown. /// - private protected bool BindingFieldEmpty => displayMember.BindingField.Length == 0; + private protected bool BindingFieldEmpty => _displayMember.BindingField.Length == 0; private protected int FindStringInternal(string str, IList items, int startIndex, bool exact, bool ignoreCase) { @@ -552,14 +551,14 @@ private protected int FindStringInternal(string str, IList items, int startIndex public string GetItemText(object item) { - if (!formattingEnabled) + if (!_formattingEnabled) { if (item == null) { return string.Empty; } - item = FilterItemOnProperty(item, displayMember.BindingField); + item = FilterItemOnProperty(item, _displayMember.BindingField); if (item == null) { return string.Empty; @@ -568,7 +567,7 @@ public string GetItemText(object item) return Convert.ToString(item, CultureInfo.CurrentCulture); } - object filteredItem = FilterItemOnProperty(item, displayMember.BindingField); + object filteredItem = FilterItemOnProperty(item, _displayMember.BindingField); // First try the OnFormat event var e = new ListControlConvertEventArgs(filteredItem, typeof(string), item); @@ -579,13 +578,13 @@ public string GetItemText(object item) } // Try Formatter.FormatObject - if (stringTypeConverter == null) + if (_stringTypeConverter == null) { - stringTypeConverter = TypeDescriptor.GetConverter(typeof(string)); + _stringTypeConverter = TypeDescriptor.GetConverter(typeof(string)); } try { - return (string)Formatter.FormatObject(filteredItem, typeof(string), DisplayMemberConverter, stringTypeConverter, formatString, formatInfo, null, DBNull.Value); + return (string)Formatter.FormatObject(filteredItem, typeof(string), DisplayMemberConverter, _stringTypeConverter, _formatString, _formatInfo, null, DBNull.Value); } catch (Exception exception) when (!ClientUtils.IsSecurityOrCriticalException(exception)) { @@ -623,43 +622,43 @@ protected override bool IsInputKey(Keys keyData) protected override void OnBindingContextChanged(EventArgs e) { - SetDataConnection(dataSource, displayMember, force: true); + SetDataConnection(_dataSource, _displayMember, force: true); base.OnBindingContextChanged(e); } protected virtual void OnDataSourceChanged(EventArgs e) { - EventHandler eh = Events[EVENT_DATASOURCECHANGED] as EventHandler; + EventHandler eh = Events[s_dataSourceChangedEvent] as EventHandler; eh?.Invoke(this, e); } protected virtual void OnDisplayMemberChanged(EventArgs e) { - EventHandler eh = Events[EVENT_DISPLAYMEMBERCHANGED] as EventHandler; + EventHandler eh = Events[s_displayMemberChangedEvent] as EventHandler; eh?.Invoke(this, e); } protected virtual void OnFormat(ListControlConvertEventArgs e) { - ListControlConvertEventHandler eh = Events[EVENT_FORMAT] as ListControlConvertEventHandler; + ListControlConvertEventHandler eh = Events[s_formatEvent] as ListControlConvertEventHandler; eh?.Invoke(this, e); } protected virtual void OnFormatInfoChanged(EventArgs e) { - EventHandler eh = Events[EVENT_FORMATINFOCHANGED] as EventHandler; + EventHandler eh = Events[s_formatInfoChangedEvent] as EventHandler; eh?.Invoke(this, e); } protected virtual void OnFormatStringChanged(EventArgs e) { - EventHandler eh = Events[EVENT_FORMATSTRINGCHANGED] as EventHandler; + EventHandler eh = Events[s_formatStringChangedEvent] as EventHandler; eh?.Invoke(this, e); } protected virtual void OnFormattingEnabledChanged(EventArgs e) { - EventHandler eh = Events[EVENT_FORMATTINGENABLEDCHANGED] as EventHandler; + EventHandler eh = Events[s_formattingEnabledChangedEvent] as EventHandler; eh?.Invoke(this, e); } @@ -677,13 +676,13 @@ protected virtual void OnSelectedIndexChanged(EventArgs e) protected virtual void OnValueMemberChanged(EventArgs e) { - EventHandler eh = Events[EVENT_VALUEMEMBERCHANGED] as EventHandler; + EventHandler eh = Events[s_valueMemberChangedEvent] as EventHandler; eh?.Invoke(this, e); } protected virtual void OnSelectedValueChanged(EventArgs e) { - EventHandler eh = Events[EVENT_SELECTEDVALUECHANGED] as EventHandler; + EventHandler eh = Events[s_selectedValueChangedEvent] as EventHandler; eh?.Invoke(this, e); } @@ -695,24 +694,24 @@ protected virtual void RefreshItems() private void DataSourceDisposed(object sender, EventArgs e) { - Debug.Assert(sender == dataSource, "how can we get dispose notification for anything other than our dataSource?"); + Debug.Assert(sender == _dataSource, "how can we get dispose notification for anything other than our dataSource?"); SetDataConnection(null, new BindingMemberInfo(string.Empty), true); } private void DataSourceInitialized(object sender, EventArgs e) { - ISupportInitializeNotification dsInit = (dataSource as ISupportInitializeNotification); + ISupportInitializeNotification dsInit = (_dataSource as ISupportInitializeNotification); Debug.Assert(dsInit != null, "ListControl: ISupportInitializeNotification.Initialized event received, but current DataSource does not support ISupportInitializeNotification!"); Debug.Assert(dsInit.IsInitialized, "ListControl: DataSource sent ISupportInitializeNotification.Initialized event but before it had finished initializing."); - SetDataConnection(dataSource, displayMember, true); + SetDataConnection(_dataSource, _displayMember, true); } private void SetDataConnection(object newDataSource, BindingMemberInfo newDisplayMember, bool force) { - bool dataSourceChanged = dataSource != newDataSource; - bool displayMemberChanged = !displayMember.Equals(newDisplayMember); + bool dataSourceChanged = _dataSource != newDataSource; + bool displayMemberChanged = !_displayMember.Equals(newDisplayMember); - if (inSetDataConnection) + if (_inSetDataConnection) { return; } @@ -720,21 +719,21 @@ private void SetDataConnection(object newDataSource, BindingMemberInfo newDispla { if (force || dataSourceChanged || displayMemberChanged) { - inSetDataConnection = true; + _inSetDataConnection = true; IList currentList = DataManager?.List; bool currentManagerIsNull = DataManager == null; UnwireDataSource(); - dataSource = newDataSource; - displayMember = newDisplayMember; + _dataSource = newDataSource; + _displayMember = newDisplayMember; WireDataSource(); // Provided the data source has been fully initialized, start listening to change events on its // currency manager and refresh our list. If the data source has not yet been initialized, we will // skip this step for now, and try again later (once the data source has fired its Initialized event). - if (isDataSourceInitialized) + if (_isDataSourceInitialized) { CurrencyManager newDataManager = null; if (newDataSource != null && BindingContext != null && newDataSource != Convert.DBNull) @@ -742,47 +741,47 @@ private void SetDataConnection(object newDataSource, BindingMemberInfo newDispla newDataManager = (CurrencyManager)BindingContext[newDataSource, newDisplayMember.BindingPath]; } - if (dataManager != newDataManager) + if (_dataManager != newDataManager) { - if (dataManager != null) + if (_dataManager != null) { - dataManager.ItemChanged -= new ItemChangedEventHandler(DataManager_ItemChanged); - dataManager.PositionChanged -= new EventHandler(DataManager_PositionChanged); + _dataManager.ItemChanged -= new ItemChangedEventHandler(DataManager_ItemChanged); + _dataManager.PositionChanged -= new EventHandler(DataManager_PositionChanged); } - dataManager = newDataManager; + _dataManager = newDataManager; - if (dataManager != null) + if (_dataManager != null) { - dataManager.ItemChanged += new ItemChangedEventHandler(DataManager_ItemChanged); - dataManager.PositionChanged += new EventHandler(DataManager_PositionChanged); + _dataManager.ItemChanged += new ItemChangedEventHandler(DataManager_ItemChanged); + _dataManager.PositionChanged += new EventHandler(DataManager_PositionChanged); } } // See if the BindingField in the newDisplayMember is valid // The same thing if dataSource Changed // "" is a good value for displayMember - if (dataManager != null && (displayMemberChanged || dataSourceChanged) && !string.IsNullOrEmpty(displayMember.BindingMember)) + if (_dataManager != null && (displayMemberChanged || dataSourceChanged) && !string.IsNullOrEmpty(_displayMember.BindingMember)) { - if (!BindingMemberInfoInDataManager(displayMember)) + if (!BindingMemberInfoInDataManager(_displayMember)) { throw new ArgumentException(SR.ListControlWrongDisplayMember, nameof(newDisplayMember)); } } - if (dataManager != null && (dataSourceChanged || displayMemberChanged || force)) + if (_dataManager != null && (dataSourceChanged || displayMemberChanged || force)) { // If we force a new data manager, then change the items in the list control // only if the list changed or if we go from a null dataManager to a full fledged one // or if the DisplayMember changed if (displayMemberChanged || (force && (currentList != DataManager.List || currentManagerIsNull))) { - DataManager_ItemChanged(dataManager, new ItemChangedEventArgs(-1)); + DataManager_ItemChanged(_dataManager, new ItemChangedEventArgs(-1)); } } } - displayMemberConverter = null; + _displayMemberConverter = null; } if (dataSourceChanged) @@ -797,25 +796,25 @@ private void SetDataConnection(object newDataSource, BindingMemberInfo newDispla } finally { - inSetDataConnection = false; + _inSetDataConnection = false; } } private void UnwireDataSource() { // If the source is a component, then unhook the Disposed event - if (dataSource is IComponent componentDataSource) + if (_dataSource is IComponent componentDataSource) { componentDataSource.Disposed -= new EventHandler(DataSourceDisposed); } - if (dataSource is ISupportInitializeNotification dsInit && isDataSourceInitEventHooked) + if (_dataSource is ISupportInitializeNotification dsInit && _isDataSourceInitEventHooked) { // If we previously hooked the data source's ISupportInitializeNotification // Initialized event, then unhook it now (we don't always hook this event, // only if we needed to because the data source was previously uninitialized) dsInit.Initialized -= new EventHandler(DataSourceInitialized); - isDataSourceInitEventHooked = false; + _isDataSourceInitEventHooked = false; } } @@ -823,26 +822,26 @@ private void WireDataSource() { // If the source is a component, then hook the Disposed event, // so we know when the component is deleted from the form - if (dataSource is IComponent componentDataSource) + if (_dataSource is IComponent componentDataSource) { componentDataSource.Disposed += new EventHandler(DataSourceDisposed); } - if (dataSource is ISupportInitializeNotification dsInit && !dsInit.IsInitialized) + if (_dataSource is ISupportInitializeNotification dsInit && !dsInit.IsInitialized) { // If the source provides initialization notification, and is not yet // fully initialized, then hook the Initialized event, so that we can // delay connecting to it until it *is* initialized. dsInit.Initialized += new EventHandler(DataSourceInitialized); - isDataSourceInitEventHooked = true; - isDataSourceInitialized = false; + _isDataSourceInitEventHooked = true; + _isDataSourceInitialized = false; } else { // Otherwise either the data source says it *is* initialized, or it // does not support the capability to report whether its initialized, // in which case we have to just assume it that is initialized. - isDataSourceInitialized = true; + _isDataSourceInitialized = true; } }