/*******************************************************************************
* 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
}
}