/******************************************************************************* * Copyright(c) 2014 DongkeSoft All rights reserved. / Confidential * 类的信息: * 1.程序名称:ObjectSelectionWrapper.cs * 2.功能描述:类文件 * 编辑履历: * 作者 日期 版本 修改内容 * 陈晓野 2014/09/29 1.00 新建 *******************************************************************************/ using System; using System.ComponentModel; using System.Data; using System.Reflection; namespace Dongke.IBOSS.PRD.Basics.BaseControls { /// /// Used together with the ListSelectionWrapper in order to wrap data sources for a CheckBoxComboBox. /// It helps to ensure you don't add an extra "Selected" property to a class that don't really need or want that information. /// public class ObjectSelectionWrapper { public ObjectSelectionWrapper(TItem item, ListSelectionWrapper container) : base() { _Container = container; _Item = item; } #region PRIVATE PROPERTIES /// /// Used as a count indicator for the item. Not necessarily displayed. /// private int _Count = 0; /// /// Is this item selected. /// private bool _Selected = false; /// /// A reference to the wrapped item. /// private TItem _Item; /// /// The containing list for these selections. /// private ListSelectionWrapper _Container; #endregion #region PUBLIC PROPERTIES /// /// An indicator of how many items with the specified status is available for the current filter level. /// Thaught this would make the app a bit more user-friendly and help not to miss items in Statusses /// that are not often used. /// public int Count { get { return _Count; } set { _Count = value; } } /// /// A reference to the item wrapped. /// public TItem Item { get { return _Item; } //set { _Item = value; } } public TValue Value { get { TValue Value = default(TValue); if (string.IsNullOrEmpty(_Container.ValueProperty)) { //Value = Item.ToString(); } else if (Item is DataRow) // A specific implementation for DataRow { var v = ((DataRow)((Object)Item))[_Container.ValueProperty]; Value = (v is TValue) ? (TValue)v : Value; } else { bool isFind = false; PropertyDescriptorCollection PDs = TypeDescriptor.GetProperties(Item); foreach (PropertyDescriptor PD in PDs) if (PD.Name.CompareTo(_Container.ValueProperty) == 0) { var v = PD.GetValue(Item); Value = (v is TValue) ? (TValue)v : Value; isFind = true; break; } if (!isFind) { PropertyInfo PI = Item.GetType().GetProperty(_Container.ValueProperty); if (PI == null) throw new Exception(String.Format( "Property {0} cannot be found on {1}.", _Container.DisplayNameProperty, Item.GetType())); var v = PI.GetValue(Item, null); Value = (v is TValue) ? (TValue)v : Value; } } return Value; } } /// /// The item display value. If ShowCount is true, it displays the "Name [Count]". /// public string Name { get { string Name = null; if (string.IsNullOrEmpty(_Container.DisplayNameProperty)) Name = Item.ToString(); else if (Item is DataRow) // A specific implementation for DataRow Name = ((DataRow)((Object)Item))[_Container.DisplayNameProperty].ToString(); else { bool isFind = false; PropertyDescriptorCollection PDs = TypeDescriptor.GetProperties(Item); foreach (PropertyDescriptor PD in PDs) if (PD.Name.CompareTo(_Container.DisplayNameProperty) == 0) { Name = (string)PD.GetValue(Item).ToString(); isFind = true; break; } if (!isFind) { PropertyInfo PI = Item.GetType().GetProperty(_Container.DisplayNameProperty); if (PI == null) throw new Exception(String.Format( "Property {0} cannot be found on {1}.", _Container.DisplayNameProperty, Item.GetType())); Name = PI.GetValue(Item, null).ToString(); } } return _Container.ShowCounts ? String.Format("{0} [{1}]", Name, Count) : Name; } } /// /// The textbox display value. The names concatenated. /// public string NameConcatenated { get { return _Container.SelectedNames; } } public TValue[] ValueConcatenated { get { return _Container.SelectedValues; } } /// /// Indicates whether the item is selected. /// public bool Selected { get { return _Selected; } set { _Selected = value; } } #endregion } }