Browse Source

Better Solution to walk down PropertyPath from StackOverflow.com

pull/15/head^2
peterforstmeier 15 years ago
parent
commit
ad5e0a4e9c
  1. 90
      src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/ListStrategy/CollectionStrategy.cs
  2. 11
      src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Test/ICSharpCode.Reports.Core.Test/DataManager/ListStrategy/IListDataManagerFixture.cs

90
src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/ListStrategy/CollectionStrategy.cs

@ -4,9 +4,9 @@ @@ -4,9 +4,9 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Globalization;
using System.Reflection;
/// <summary>
/// This Class handles all List's with IList
@ -207,6 +207,7 @@ namespace ICSharpCode.Reports.Core { @@ -207,6 +207,7 @@ namespace ICSharpCode.Reports.Core {
#endregion
/*
public override void Fill(IDataItem item)
{
@ -262,13 +263,92 @@ namespace ICSharpCode.Reports.Core { @@ -262,13 +263,92 @@ namespace ICSharpCode.Reports.Core {
}
}
*/
static void WrongColumnName(IDataItem item)
public override void Fill(IDataItem item)
{
item.DBValue = string.Format(CultureInfo.InvariantCulture, "Error : <{0}> missing!", item.ColumnName);
}
if (item is BaseDataItem)
{
var retVal = FollowPropertyPath(Current,item.ColumnName);
//var retVal1 = ResolveValue(Current,item.ColumnName);
if (retVal != null) {
item.DBValue = retVal.ToString();
} else {
item.DBValue = String.Empty;
}
}
else
{
//image processing from IList
BaseImageItem baseImageItem = item as BaseImageItem;
if (baseImageItem != null) {
PropertyDescriptor p = this.listProperties.Find(baseImageItem.ColumnName, true);
if (p != null) {
baseImageItem.Image = p.GetValue(this.Current) as System.Drawing.Image;
}
return;
}
}
}
#region Proppath from StackOverflow
//http://stackoverflow.com/questions/366332/best-way-to-get-sub-properties-using-getproperty
private static object FollowPropertyPath(object value, string path)
{
Type currentType = value.GetType();
foreach (string propertyName in path.Split('.'))
{
PropertyInfo property = currentType.GetProperty(propertyName);
if (property != null) {
value = property.GetValue(value, null);
currentType = property.PropertyType;
} else {
return WrongColumnName(path);
}
}
return value;
}
/*
static object ResolveValue(object component, string path)
{
foreach(string segment in path.Split('.'))
{
if (component == null) return null;
if(component is IListSource)
{
component = ((IListSource)component).GetList();
}
if (component is IList)
{
component = ((IList)component)[0];
}
var r = ExtendedTypeDescriptor.GetProperties(component.GetType());
//component = GetValue(component, segment);
}
return component;
}
*/
#endregion
static string WrongColumnName(string propertyName)
{
return String.Format(CultureInfo.InvariantCulture, "Error : <{0}> missing!", propertyName);
}
/*
static void SetReturnValue(PropertyDescriptor p,object component,IDataItem item)
{
if (p != null)
@ -294,7 +374,7 @@ namespace ICSharpCode.Reports.Core { @@ -294,7 +374,7 @@ namespace ICSharpCode.Reports.Core {
return splittedNames;
}
*/
#region test
public override CurrentItemsCollection FillDataRow()

11
src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Test/ICSharpCode.Reports.Core.Test/DataManager/ListStrategy/IListDataManagerFixture.cs

@ -81,14 +81,16 @@ namespace ICSharpCode.Reports.Core.Test.DataManager.ListStrategy @@ -81,14 +81,16 @@ namespace ICSharpCode.Reports.Core.Test.DataManager.ListStrategy
[Test]
public void DataNavigator_Return_ErrMessage_If_ColumnName_NotExist ()
{
IDataManager dm = ICSharpCode.Reports.Core.DataManager.CreateInstance(this.contributorCollection as System.Collections.IList,new ReportSettings());
IDataManager dm = ICSharpCode.Reports.Core.DataManager.CreateInstance(this.contributorCollection,new ReportSettings());
IDataNavigator dataNav = dm.GetNavigator;
BaseDataItem item = new BaseDataItem();
item.ColumnName = "ColumnNotExist";
var items = new ReportItemCollection();
items.Add(item);
dataNav.Reset();
dataNav.MoveNext();
dataNav.Fill(items);
string str = "<" + item.ColumnName +">";
// string str = "<" + item.ColumnName +">";
Assert.That(item.DBValue.StartsWith("Error"));
}
@ -125,7 +127,7 @@ namespace ICSharpCode.Reports.Core.Test.DataManager.ListStrategy @@ -125,7 +127,7 @@ namespace ICSharpCode.Reports.Core.Test.DataManager.ListStrategy
IDataManager dm = ICSharpCode.Reports.Core.DataManager.CreateInstance(contColl, new ReportSettings());
IDataNavigator dataNav = dm.GetNavigator;
dataNav.MoveNext();
ReportItemCollection searchCol = new ReportItemCollection();
searchCol.Add(new BaseDataItem ()
@ -135,7 +137,8 @@ namespace ICSharpCode.Reports.Core.Test.DataManager.ListStrategy @@ -135,7 +137,8 @@ namespace ICSharpCode.Reports.Core.Test.DataManager.ListStrategy
}
);
dataNav.Reset();
dataNav.MoveNext();
do
{
dataNav.Fill(searchCol);

Loading…
Cancel
Save