Browse Source

Better grouping with collections

pull/15/head^2
Peter Forstmeier 15 years ago
parent
commit
4237e4c6a7
  1. 48
      src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/ICSharpCode.Reports.Core.csproj
  2. 37
      src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/ChildNavigator.cs
  3. 63
      src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/ListStrategy/BaseListStrategy.cs
  4. 158
      src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/ListStrategy/CollectionStrategy.cs
  5. 2
      src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/ListStrategy/TableStrategy.cs
  6. 2
      src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Interfaces/IDataViewStrategy.cs
  7. 4
      src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Test/ICSharpCode.Reports.Core.Test/DataManager/TableStragy/GroupTableFixture.cs

48
src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/ICSharpCode.Reports.Core.csproj

@ -122,13 +122,17 @@
<Compile Include="Project\DataManager\ListStrategy\CollectionStrategy.cs" /> <Compile Include="Project\DataManager\ListStrategy\CollectionStrategy.cs" />
<Compile Include="Project\DataManager\DataManager.cs" /> <Compile Include="Project\DataManager\DataManager.cs" />
<Compile Include="Project\Dialogs\EditorDialog.cs"> <Compile Include="Project\Dialogs\EditorDialog.cs">
<SubType>Form</SubType>
</Compile> </Compile>
<Compile Include="Project\Dialogs\EditorDialog.Designer.cs" /> <Compile Include="Project\Dialogs\EditorDialog.Designer.cs" />
<Compile Include="Project\Dialogs\GroupingCollectionEditor.cs" /> <Compile Include="Project\Dialogs\GroupingCollectionEditor.cs" />
<Compile Include="Project\Dialogs\IStringBasedEditorDialog.cs" /> <Compile Include="Project\Dialogs\IStringBasedEditorDialog.cs" />
<Compile Include="Project\Dialogs\ParametersCollectionEditor.cs" /> <Compile Include="Project\Dialogs\ParametersCollectionEditor.cs" />
<Compile Include="Project\Dialogs\ParameterDialog.cs" /> <Compile Include="Project\Dialogs\ParameterDialog.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Project\Dialogs\PreviewControl.cs"> <Compile Include="Project\Dialogs\PreviewControl.cs">
<SubType>UserControl</SubType>
</Compile> </Compile>
<Compile Include="Project\Dialogs\DefaultTextEditor.cs" /> <Compile Include="Project\Dialogs\DefaultTextEditor.cs" />
<Compile Include="Project\Dialogs\SortingCollectionEditor.cs" /> <Compile Include="Project\Dialogs\SortingCollectionEditor.cs" />
@ -287,6 +291,7 @@
</Compile> </Compile>
<Compile Include="Project\ReportEngine.cs" /> <Compile Include="Project\ReportEngine.cs" />
<Compile Include="Project\ReportViewer\NumericToolStripTextBox.cs"> <Compile Include="Project\ReportViewer\NumericToolStripTextBox.cs">
<SubType>Component</SubType>
</Compile> </Compile>
<Compile Include="Project\ConnectionObject.cs" /> <Compile Include="Project\ConnectionObject.cs" />
<Compile Include="Project\ReportModel.cs" /> <Compile Include="Project\ReportModel.cs" />
@ -323,6 +328,7 @@
<Compile Include="Project\Exporter\ExportColumns\IExportColumnBuilder .cs" /> <Compile Include="Project\Exporter\ExportColumns\IExportColumnBuilder .cs" />
<Compile Include="Project\ReportViewer\PageNavigationEventArgs.cs" /> <Compile Include="Project\ReportViewer\PageNavigationEventArgs.cs" />
<Compile Include="Project\ReportViewer\ReportViewer.cs"> <Compile Include="Project\ReportViewer\ReportViewer.cs">
<SubType>UserControl</SubType>
</Compile> </Compile>
<Compile Include="Project\ReportViewer\ReportViewer.Designer.cs"> <Compile Include="Project\ReportViewer\ReportViewer.Designer.cs">
<DependentUpon>Project\ReportViewer.cs</DependentUpon> <DependentUpon>Project\ReportViewer.cs</DependentUpon>
@ -358,44 +364,6 @@
<None Include="Project\ReportViewer\Resources\Icons\Last.bmp" /> <None Include="Project\ReportViewer\Resources\Icons\Last.bmp" />
<None Include="Project\ReportViewer\Resources\Icons\Next.bmp" /> <None Include="Project\ReportViewer\Resources\Icons\Next.bmp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup />
<Folder Include="Project\BaseClasses\Printing" />
<Folder Include="Project\BaseItems" />
<Folder Include="Project\BaseItems\Graphics" />
<Folder Include="Project\Collections" />
<Folder Include="Project\DataManager" />
<Folder Include="Project\DataManager\Comparer" />
<Folder Include="Project\DataManager\ListHandling" />
<Folder Include="Project\DataManager\ListStrategy" />
<Folder Include="Project\Dialogs" />
<Folder Include="Project\Events" />
<Folder Include="Project\Exceptions" />
<Folder Include="Project\Exporter\Converters" />
<Folder Include="Project\Expressions\SimpleExpressionEvaluator" />
<Folder Include="Project\Expressions\ReportingLanguage" />
<Folder Include="Project\Expressions\SimpleExpressionEvaluator\Compilation" />
<Folder Include="Project\Expressions\SimpleExpressionEvaluator\Compilation\Functions" />
<Folder Include="Project\Expressions\SimpleExpressionEvaluator\Compilation\Functions\AggregateFunctions" />
<Folder Include="Project\Expressions\SimpleExpressionEvaluator\Compilation\Functions\Operators" />
<Folder Include="Project\Expressions\SimpleExpressionEvaluator\Compilation\Functions\ReportingService" />
<Folder Include="Project\Expressions\SimpleExpressionEvaluator\Evaluation" />
<Folder Include="Project\Expressions\SimpleExpressionEvaluator\Parser" />
<Folder Include="Project\Expressions\SimpleExpressionEvaluator\Utilities" />
<Folder Include="Project\Factories" />
<Folder Include="Project\Globals" />
<Folder Include="Project\Interfaces" />
<Folder Include="Project\Expressions" />
<Folder Include="Project\ReportViewer\Resources\Icons" />
<Folder Include="Project\Resources" />
<Folder Include="Project\Printing" />
<Folder Include="Project\Printing\Graphics" />
<Folder Include="Project\Xml" />
<Folder Include="Project\Configuration" />
<Folder Include="Project\BaseClasses" />
<Folder Include="Project\Exporter" />
<Folder Include="Project\Exporter\ExportColumns" />
<Folder Include="Project\ReportViewer" />
<Folder Include="Project\ReportViewer\Resources" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
</Project> </Project>

37
src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/ChildNavigator.cs

@ -12,7 +12,7 @@ namespace ICSharpCode.Reports.Core
public class ChildNavigator:IDataNavigator public class ChildNavigator:IDataNavigator
{ {
private IndexList indexList; private IndexList indexList;
private IDataViewStrategy store; private IDataViewStrategy dataStore;
private System.Collections.Generic.List<BaseComparer>.Enumerator enumerator; private System.Collections.Generic.List<BaseComparer>.Enumerator enumerator;
public ChildNavigator(IDataViewStrategy dataStore,IndexList indexList) public ChildNavigator(IDataViewStrategy dataStore,IndexList indexList)
@ -20,7 +20,7 @@ namespace ICSharpCode.Reports.Core
if (dataStore == null) { if (dataStore == null) {
throw new ArgumentNullException("dataStore"); throw new ArgumentNullException("dataStore");
} }
this.store = dataStore; this.dataStore = dataStore;
this.indexList = indexList; this.indexList = indexList;
enumerator = this.indexList.GetEnumerator(); enumerator = this.indexList.GetEnumerator();
enumerator.MoveNext(); enumerator.MoveNext();
@ -70,34 +70,34 @@ namespace ICSharpCode.Reports.Core
public object Current { public object Current {
get { get {
TableStrategy t = this.store as TableStrategy; return dataStore.myCurrent(this.indexList[CurrentRow].ListIndex);
// return t.myCurrent(enumerator.Current.ListIndex);
return t.myCurrent(this.indexList[CurrentRow].ListIndex);
} }
} }
public AvailableFieldsCollection AvailableFields { public AvailableFieldsCollection AvailableFields {
get { get {
return store.AvailableFields; return dataStore.AvailableFields;
} }
} }
public void Fill(ReportItemCollection collection) public void Fill(ReportItemCollection collection)
{ {
TableStrategy tableStrategy = store as TableStrategy; foreach (var item in collection)
foreach (var item in collection) { {
IDataItem dataItem = item as IDataItem; IDataItem dataItem = item as IDataItem;
if (dataItem != null) { if (dataItem != null)
CurrentItemsCollection currentItemsCollection = tableStrategy.FillDataRow(this.indexList[CurrentRow].ListIndex); {
CurrentItem s = currentItemsCollection.FirstOrDefault(x => x.ColumnName == dataItem.ColumnName); CurrentItemsCollection currentItemsCollection = dataStore.FillDataRow(this.indexList[CurrentRow].ListIndex);
dataItem.DBValue = s.Value.ToString(); CurrentItem s = currentItemsCollection.FirstOrDefault(x => x.ColumnName == dataItem.ColumnName);
} dataItem.DBValue = s.Value.ToString();
}
}
}
} }
public bool MoveNext() public bool MoveNext()
{ {
this.indexList.CurrentPosition ++; this.indexList.CurrentPosition ++;
@ -113,8 +113,7 @@ namespace ICSharpCode.Reports.Core
public CurrentItemsCollection GetDataRow public CurrentItemsCollection GetDataRow
{ {
get { get {
var st= store as TableStrategy; return dataStore.FillDataRow(this.indexList[CurrentRow].ListIndex);
return st.FillDataRow(this.indexList[CurrentRow].ListIndex);
} }
} }
@ -126,7 +125,7 @@ namespace ICSharpCode.Reports.Core
if ((i == null) || (i.Count == 0)) { if ((i == null) || (i.Count == 0)) {
return null; return null;
} }
return new ChildNavigator(this.store,i); return new ChildNavigator(this.dataStore,i);
} }
} }

63
src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/ListStrategy/BaseListStrategy.cs

@ -110,7 +110,7 @@ namespace ICSharpCode.Reports.Core {
} }
compVal = v; compVal = v;
} }
// ShowIndexList(IndexList); ShowIndexList(IndexList);
} }
@ -130,7 +130,7 @@ namespace ICSharpCode.Reports.Core {
#endregion #endregion
#region Debug Code #region Debug Code
/*
protected static void ShowIndexList (IndexList list) protected static void ShowIndexList (IndexList list)
{ {
@ -151,7 +151,7 @@ namespace ICSharpCode.Reports.Core {
} }
} }
} }
*/
#endregion #endregion
public virtual void Reset() public virtual void Reset()
@ -180,7 +180,17 @@ namespace ICSharpCode.Reports.Core {
{ {
return new CurrentItemsCollection(); return new CurrentItemsCollection();
} }
public virtual object myCurrent(int pos)
{
return null;
}
public virtual CurrentItemsCollection FillDataRow(int pos)
{
return FillDataRow();
}
#endregion #endregion
#region SharpReportCore.IDataViewStrategy interface implementation #region SharpReportCore.IDataViewStrategy interface implementation
@ -231,33 +241,6 @@ namespace ICSharpCode.Reports.Core {
public bool IsGrouped {get;set;} public bool IsGrouped {get;set;}
/*
public bool IsFiltered
{
get {
return this.isFiltered;
} set {
this.isFiltered = value;
}
}
*/
/*
protected virtual void Group()
{
if (this.indexList != null) {
this.isGrouped = true;
this.isSorted = true;
} else {
throw new ReportException ("BaseListStrategy:Group Sorry, no IndexList");
}
}
*/
public virtual void Sort() public virtual void Sort()
{ {
@ -283,24 +266,6 @@ namespace ICSharpCode.Reports.Core {
} }
/*
public IndexList ChildRows
{
get {
if (this.IsGrouped == true) {
GroupSeparator gs = (GroupSeparator)this.indexList[this.CurrentRow] as GroupSeparator;
if (gs != null) {
return (gs.GetChildren);
} else {
return null;
}
} else {
return null;
}
}
}
*/
public virtual void Dispose() public virtual void Dispose()
{ {
this.Dispose(true); this.Dispose(true);

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

@ -166,7 +166,7 @@ namespace ICSharpCode.Reports.Core {
base.Group(); base.Group();
IndexList gl = new IndexList("group"); IndexList gl = new IndexList("group");
gl = this.BuildSortIndex (ReportSettings.GroupColumnsCollection); gl = this.BuildSortIndex (ReportSettings.GroupColumnsCollection);
// ShowIndexList(gl); ShowIndexList(gl);
base.BuildGroup(gl); base.BuildGroup(gl);
} }
@ -207,71 +207,12 @@ namespace ICSharpCode.Reports.Core {
#endregion #endregion
/*
public override void Fill(IDataItem item)
{
if (item is BaseDataItem)
{
if (item.ColumnName.Contains(".")) {
string[] splittedNames = SplitNames(ref item);
// PropDes for SubClass
PropertyDescriptor classProperty = this.listProperties.Find(splittedNames[0], true);
if (classProperty == null)
{
WrongColumnName (item);
}
else
{
//all Props for SubClass
var propCollection = ExtendedTypeDescriptor.GetProperties(classProperty.PropertyType);
var subProperty = propCollection.Find(splittedNames[1], true);
var classValue = classProperty.GetValue(this.Current);
SetReturnValue(subProperty,classValue,item);
}
}
else
{
PropertyDescriptor p = this.listProperties.Find(item.ColumnName, true);
if (p != null) {
SetReturnValue(p,this.Current,item);
} else {
WrongColumnName (item);
}
}
return;
}
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;
}
}
}
*/
public override void Fill(IDataItem item) public override void Fill(IDataItem item)
{ {
if (item is BaseDataItem) if (item is BaseDataItem)
{ {
var retVal = FollowPropertyPath(Current,item.ColumnName); var retVal = FollowPropertyPath(Current,item.ColumnName);
//var retVal1 = ResolveValue(Current,item.ColumnName);
if (retVal != null) { if (retVal != null) {
item.DBValue = retVal.ToString(); item.DBValue = retVal.ToString();
} else { } else {
@ -320,27 +261,7 @@ namespace ICSharpCode.Reports.Core {
return value; 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 #endregion
static string WrongColumnName(string propertyName) static string WrongColumnName(string propertyName)
@ -348,35 +269,16 @@ namespace ICSharpCode.Reports.Core {
return String.Format(CultureInfo.InvariantCulture, "Error : <{0}> missing!", propertyName); return String.Format(CultureInfo.InvariantCulture, "Error : <{0}> missing!", propertyName);
} }
/*
static void SetReturnValue(PropertyDescriptor p,object component,IDataItem item)
{
if (p != null)
{
var o = p.GetValue(component);
if (o != null) {
item.DBValue = o.ToString();
} else {
item.DBValue = String.Empty;
}
} else {
WrongColumnName(item);
}
}
static string[] SplitNames(ref IDataItem item)
{
char[] delimiters = new char[] { '.' };
var splittedNames = item.ColumnName.Split(delimiters);
return splittedNames;
}
*/
#region test #region test
public override object myCurrent(int pos)
{
// return this.IndexList[pos];
return this.IndexList[this.CurrentPosition];
}
public override CurrentItemsCollection FillDataRow() public override CurrentItemsCollection FillDataRow()
{ {
CurrentItemsCollection ci = base.FillDataRow(); CurrentItemsCollection ci = base.FillDataRow();
@ -387,13 +289,47 @@ namespace ICSharpCode.Reports.Core {
c = new CurrentItem(); c = new CurrentItem();
c.ColumnName = pd.Name; c.ColumnName = pd.Name;
c.DataType = pd.PropertyType; c.DataType = pd.PropertyType;
c.Value = pd.GetValue(this.Current).ToString(); var s = pd.GetValue(this.Current);
if (s != null)
{
c.Value = s.ToString();
}
else
{
c.Value = String.Empty;
}
ci.Add(c); ci.Add(c);
} }
} }
return ci; return ci;
} }
public override CurrentItemsCollection FillDataRow(int pos)
{
CurrentItemsCollection ci = new CurrentItemsCollection();
CurrentItem c = null;
foreach (PropertyDescriptor pd in this.listProperties)
{
c = new CurrentItem();
c.ColumnName = pd.Name;
c.DataType = pd.PropertyType;
var s = pd.GetValue(this.Current);
if (s != null)
{
c.Value = s.ToString();
}
else
{
c.Value = String.Empty;
}
ci.Add(c);
}
return ci;
}
#endregion #endregion
#region IDisposable #region IDisposable

2
src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/ListStrategy/TableStrategy.cs

@ -189,7 +189,7 @@ namespace ICSharpCode.Reports.Core
} }
public object myCurrent (int pos) public override object myCurrent (int pos)
{ {
return this.table.Rows[pos]; return this.table.Rows[pos];
} }

2
src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Interfaces/IDataViewStrategy.cs

@ -18,7 +18,9 @@ namespace ICSharpCode.Reports.Core{
IndexList IndexList {get;} IndexList IndexList {get;}
//test //test
object myCurrent(int pos);
CurrentItemsCollection FillDataRow(); CurrentItemsCollection FillDataRow();
CurrentItemsCollection FillDataRow(int pos);
// //
AvailableFieldsCollection AvailableFields {get;} AvailableFieldsCollection AvailableFields {get;}

4
src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Test/ICSharpCode.Reports.Core.Test/DataManager/TableStragy/GroupTableFixture.cs

@ -163,9 +163,9 @@ namespace ICSharpCode.Reports.Core.Test.DataManager.TableStrategy
if (dataNavigator.HasChildren) { if (dataNavigator.HasChildren) {
DataRow r = dataNavigator.Current as DataRow; DataRow r = dataNavigator.Current as DataRow;
IDataNavigator child = dataNavigator.GetChildNavigator;
string v2 = r["last"].ToString() + " GroupVal :" + r[3].ToString() ; string v2 = r["last"].ToString() + " GroupVal :" + r[3].ToString() ;
IDataNavigator child = dataNavigator.GetChildNavigator;
Console.WriteLine(v2); Console.WriteLine(v2);
Assert.That (child,Is.Not.Null); Assert.That (child,Is.Not.Null);
RecursiveCall(child); RecursiveCall(child);

Loading…
Cancel
Save