Browse Source

RowGrouping

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/reports@6274 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Peter Forstmeier 15 years ago
parent
commit
aa2767e6ff
  1. 1
      src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/ICSharpCode.Reports.Core.csproj
  2. 9
      src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseClasses/Printing/PrintHelper.cs
  3. 21
      src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/DataNavigator.cs
  4. 19
      src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/ListStrategy/TableStrategy.cs
  5. 164
      src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/GroupedRowConverter.cs
  6. 94
      src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/RowConverter.cs
  7. 3
      src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/TableConverter.cs
  8. 2
      src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Interfaces/IDataNavigator.cs
  9. 38
      src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Test/ICSharpCode.Reports.Core.Test/DataManager/GroupTableFixture.cs

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

@ -129,6 +129,7 @@ @@ -129,6 +129,7 @@
<Compile Include="Project\Exceptions\UnknownItemException.cs" />
<Compile Include="Project\Exceptions\WrongColumnException.cs" />
<Compile Include="Project\Exceptions\WrongSectionException.cs" />
<Compile Include="Project\Exporter\Converters\GroupedRowConverter.cs" />
<Compile Include="Project\Expressions\SimpleExpressionEvaluator\Compilation\Functions\ReportingService\FieldReference.cs" />
<Compile Include="Project\Exporter\BasePager.cs" />
<Compile Include="Project\Exporter\Converters\BaseConverter.cs" />

9
src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseClasses/Printing/PrintHelper.cs

@ -38,7 +38,7 @@ namespace ICSharpCode.Reports.Core.BaseClasses.Printing @@ -38,7 +38,7 @@ namespace ICSharpCode.Reports.Core.BaseClasses.Printing
#endregion
#region AdjustParentInSection
#region Section's
public static void AdjustParent (BaseReportItem parent,ReportItemCollection items)
{
@ -61,6 +61,13 @@ namespace ICSharpCode.Reports.Core.BaseClasses.Printing @@ -61,6 +61,13 @@ namespace ICSharpCode.Reports.Core.BaseClasses.Printing
}
}
public static void AdjustSectionLocation (BaseSection section)
{
section.Location = new Point(section.Location.X,section.SectionOffset );
}
#endregion

21
src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/DataNavigator.cs

@ -7,6 +7,7 @@ @@ -7,6 +7,7 @@
using System;
using System.Collections;
using System.Linq;
namespace ICSharpCode.Reports.Core
{
@ -52,9 +53,6 @@ namespace ICSharpCode.Reports.Core @@ -52,9 +53,6 @@ namespace ICSharpCode.Reports.Core
}
public AvailableFieldsCollection AvailableFields{
get
{
@ -131,10 +129,10 @@ namespace ICSharpCode.Reports.Core @@ -131,10 +129,10 @@ namespace ICSharpCode.Reports.Core
get{
IndexList ind = BuildChildList();
return ((ind != null) && (ind.Count > 0));
// return BuildChildList().Count > 0;
}
}
IndexList childList;
private System.Collections.Generic.List<BaseComparer>.Enumerator ce;
@ -160,11 +158,26 @@ namespace ICSharpCode.Reports.Core @@ -160,11 +158,26 @@ namespace ICSharpCode.Reports.Core
return BuildChildList().Count;
}
}
public bool ChildMoveNext()
{
return ce.MoveNext();
}
public void FillChild (ReportItemCollection collection)
{
TableStrategy t = store as TableStrategy;
foreach (BaseDataItem item in collection) {
CurrentItemsCollection ci = t.FillDataRow(ce.Current.ListIndex);
CurrentItem s = ci.FirstOrDefault(x => x.ColumnName == ((BaseDataItem)item).ColumnName);
item.DBValue = s.Value.ToString();
}
}
private IndexList BuildChildList()
{

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

@ -234,7 +234,24 @@ namespace ICSharpCode.Reports.Core @@ -234,7 +234,24 @@ namespace ICSharpCode.Reports.Core
return ci;
}
public CurrentItemsCollection FillDataRow(int pos)
{
CurrentItemsCollection ci = new CurrentItemsCollection();
DataRow row = this.table.Rows[pos] as DataRow;
if (row != null) {
CurrentItem c = null;
foreach (DataColumn dc in table.Columns)
{
c = new CurrentItem();
c.ColumnName = dc.ColumnName;
c.DataType = dc.DataType;
c.Value = row[dc.ColumnName];
ci.Add(c);
}
}
return ci;
}
#endregion

164
src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/GroupedRowConverter.cs

@ -0,0 +1,164 @@ @@ -0,0 +1,164 @@
/*
* Erstellt mit SharpDevelop.
* Benutzer: Peter
* Datum: 02.01.2009
* Zeit: 17:33
*
* Sie können diese Vorlage unter Extras > Optionen > Codeerstellung > Standardheader ändern.
*/
using System;
using System.Collections.Generic;
using System.Drawing;
using ICSharpCode.Reports.Core.BaseClasses.Printing;
using ICSharpCode.Reports.Core.Interfaces;
namespace ICSharpCode.Reports.Core.Exporter
{
/// <summary>
/// Description of RowConverter.
/// </summary>
///
public class GroupedRowConverter:BaseConverter
{
private BaseReportItem parent;
public GroupedRowConverter(IDataNavigator dataNavigator,
ExporterPage singlePage,
ILayouter layouter):base(dataNavigator,singlePage,layouter)
{
}
public override ExporterCollection Convert(BaseReportItem parent, BaseReportItem item)
{
if (parent == null) {
throw new ArgumentNullException("parent");
}
if (item == null) {
throw new ArgumentNullException("item");
}
ISimpleContainer simpleContainer = item as ISimpleContainer;
this.parent = parent;
simpleContainer.Parent = parent;
PrintHelper.AdjustParent(parent,simpleContainer.Items);
if (PrintHelper.IsTextOnlyRow(simpleContainer)) {
ExporterCollection myList = new ExporterCollection();
base.BaseConvert (myList,simpleContainer,parent.Location.X,
new Point(base.SectionBounds.DetailStart.X,base.SectionBounds.DetailStart.Y));
return myList;
} else {
return this.ConvertDataRow(simpleContainer);
}
}
private ExporterCollection ConvertDataRow (ISimpleContainer simpleContainer)
{
ExporterCollection mylist = new ExporterCollection();
Point currentPosition = new Point(base.SectionBounds.DetailStart.X,base.SectionBounds.DetailStart.Y);
BaseSection section = parent as BaseSection;
int defaultLeftPos = parent.Location.X;
do {
PrintHelper.AdjustSectionLocation (section);
section.Size = this.SectionBounds.DetailSectionRectangle.Size;
base.SaveSize(section.Items[0].Size);
Color color = ((BaseReportItem)simpleContainer).BackColor;
if (base.DataNavigator.HasChildren)
{
TestDecorateElement(simpleContainer);
}
base.FillRow(simpleContainer);
TestPrepareContainerForConverting(simpleContainer);
base.FireSectionRendering(section);
currentPosition = base.BaseConvert(mylist,simpleContainer,defaultLeftPos,currentPosition);
TestAfterConverting (mylist,section);
if (base.DataNavigator.HasChildren) {
((BaseReportItem)simpleContainer).BackColor = color;
base.DataNavigator.SwitchGroup();
do {
((BaseReportItem)simpleContainer).BackColor = color;
base.DataNavigator.FillChild(simpleContainer.Items);
TestPrepareContainerForConverting(simpleContainer);
base.FireSectionRendering(section);
currentPosition = base.BaseConvert(mylist,simpleContainer,defaultLeftPos,currentPosition);
TestAfterConverting (mylist,section);
}
while ( base.DataNavigator.ChildMoveNext());
}
if (PrintHelper.IsPageFull(new Rectangle(new Point (simpleContainer.Location.X,currentPosition.Y), section.Size),base.SectionBounds)) {
base.FirePageFull(mylist);
section.SectionOffset = base.SinglePage.SectionBounds.PageHeaderRectangle.Location.Y;
currentPosition = new Point(base.SectionBounds.PageHeaderRectangle.X,base.SectionBounds.PageHeaderRectangle.Y);
mylist.Clear();
}
ShouldDrawBorder (section,mylist);
}
while (base.DataNavigator.MoveNext());
SectionBounds.ReportFooterRectangle = new Rectangle(SectionBounds.ReportFooterRectangle.Left,
section.Location.Y + section.Size.Height,
SectionBounds.ReportFooterRectangle.Width,
SectionBounds.ReportFooterRectangle.Height);
return mylist;
}
void TestPrepareContainerForConverting(ISimpleContainer simpleContainer)
{
base.LayoutRow(simpleContainer);
}
void TestAfterConverting (ExporterCollection mylist,BaseSection section)
{
StandardPrinter.EvaluateRow(base.Evaluator,mylist);
section.Items[0].Size = base.RestoreSize;
section.SectionOffset += section.Size.Height + 3 * GlobalValues.GapBetweenContainer;
}
Color TestDecorateElement(ISimpleContainer simpleContainer)
{
BaseReportItem i = simpleContainer as BaseReportItem;
var retval = i.BackColor;
i.BackColor = System.Drawing.Color.LightGray;
return retval;
}
void ShouldDrawBorder (BaseSection section,ExporterCollection list)
{
if (section.DrawBorder == true) {
BaseRectangleItem br = BasePager.CreateDebugItem (section);
BaseExportColumn bec = br.CreateExportColumn();
bec.StyleDecorator.Location = section.Location;
list.Insert(0,bec);
}
}
}
}

94
src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/RowConverter.cs

@ -27,7 +27,7 @@ namespace ICSharpCode.Reports.Core.Exporter @@ -27,7 +27,7 @@ namespace ICSharpCode.Reports.Core.Exporter
public RowConverter(IDataNavigator dataNavigator,
ExporterPage singlePage,
ILayouter layouter):base(dataNavigator,singlePage,layouter)
{
}
@ -66,31 +66,50 @@ namespace ICSharpCode.Reports.Core.Exporter @@ -66,31 +66,50 @@ namespace ICSharpCode.Reports.Core.Exporter
BaseSection section = parent as BaseSection;
int defaultLeftPos = parent.Location.X;
do {
Console.WriteLine ("haschild {0}",base.DataNavigator.HasChildren);
if (base.DataNavigator.HasChildren) {
ReadFromChilds(base.DataNavigator);
}
section.Location = new Point(section.Location.X,section.SectionOffset );
PrintHelper.AdjustSectionLocation (section);
section.Size = this.SectionBounds.DetailSectionRectangle.Size;
base.SaveSize(section.Items[0].Size);
Color color = ((BaseReportItem)simpleContainer).BackColor;
if (base.DataNavigator.HasChildren)
{
TestDecorateElement(simpleContainer);
}
base.FillRow(simpleContainer);
base.LayoutRow(simpleContainer);
TestPrepareContainerForConverting(simpleContainer);
base.FireSectionRendering(section);
currentPosition = base.BaseConvert(mylist,simpleContainer,defaultLeftPos,currentPosition);
StandardPrinter.EvaluateRow(base.Evaluator,mylist);
section.Items[0].Size = base.RestoreSize;
section.SectionOffset += section.Size.Height + 3 * GlobalValues.GapBetweenContainer;
TestAfterConverting (mylist,section);
// Grouping starts
if (base.DataNavigator.HasChildren) {
((BaseReportItem)simpleContainer).BackColor = color;
base.DataNavigator.SwitchGroup();
do {
((BaseReportItem)simpleContainer).BackColor = color;
base.DataNavigator.FillChild(simpleContainer.Items);
TestPrepareContainerForConverting(simpleContainer);
base.FireSectionRendering(section);
currentPosition = base.BaseConvert(mylist,simpleContainer,defaultLeftPos,currentPosition);
TestAfterConverting (mylist,section);
}
while ( base.DataNavigator.ChildMoveNext());
}
// end grouping
if (PrintHelper.IsPageFull(new Rectangle(new Point (simpleContainer.Location.X,currentPosition.Y), section.Size),base.SectionBounds)) {
base.FirePageFull(mylist);
section.SectionOffset = base.SinglePage.SectionBounds.PageHeaderRectangle.Location.Y;
@ -98,12 +117,8 @@ namespace ICSharpCode.Reports.Core.Exporter @@ -98,12 +117,8 @@ namespace ICSharpCode.Reports.Core.Exporter
mylist.Clear();
}
if (section.DrawBorder == true) {
BaseRectangleItem br = BasePager.CreateDebugItem (section);
BaseExportColumn bec = br.CreateExportColumn();
bec.StyleDecorator.Location = section.Location;
mylist.Insert(0,bec);
}
ShouldDrawBorder (section,mylist);
}
while (base.DataNavigator.MoveNext());
@ -115,15 +130,36 @@ namespace ICSharpCode.Reports.Core.Exporter @@ -115,15 +130,36 @@ namespace ICSharpCode.Reports.Core.Exporter
}
void ReadFromChilds (IDataNavigator nav)
void TestPrepareContainerForConverting(ISimpleContainer simpleContainer)
{
nav.SwitchGroup();
do {
var o = nav.ReadChild() as System.Data.DataRow;
string v = o.ItemArray[3].ToString();
Console.WriteLine("\t {0}",v);
base.LayoutRow(simpleContainer);
}
void TestAfterConverting (ExporterCollection mylist,BaseSection section)
{
StandardPrinter.EvaluateRow(base.Evaluator,mylist);
section.Items[0].Size = base.RestoreSize;
section.SectionOffset += section.Size.Height + 3 * GlobalValues.GapBetweenContainer;
}
Color TestDecorateElement(ISimpleContainer simpleContainer)
{
BaseReportItem i = simpleContainer as BaseReportItem;
var retval = i.BackColor;
i.BackColor = System.Drawing.Color.LightGray;
return retval;
}
void ShouldDrawBorder (BaseSection section,ExporterCollection list)
{
if (section.DrawBorder == true) {
BaseRectangleItem br = BasePager.CreateDebugItem (section);
BaseExportColumn bec = br.CreateExportColumn();
bec.StyleDecorator.Location = section.Location;
list.Insert(0,bec);
}
while ( nav.ChildMoveNext());
}
}
}

3
src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/TableConverter.cs

@ -82,8 +82,7 @@ namespace ICSharpCode.Reports.Core.Exporter @@ -82,8 +82,7 @@ namespace ICSharpCode.Reports.Core.Exporter
do {
//
BaseSection section = this.baseTable.Parent as BaseSection;
section.Location = new Point(section.Location.X,section.SectionOffset );
PrintHelper.AdjustSectionLocation(section);
base.FillRow(simpleContainer);
StandardPrinter.EvaluateRow(base.Evaluator,mylist);

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

@ -31,7 +31,7 @@ using System.ComponentModel; @@ -31,7 +31,7 @@ using System.ComponentModel;
bool ChildMoveNext();
int ChildListCount {get;}
void FillChild (ReportItemCollection collection);
//endtest
bool IsSorted {get;}

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

@ -59,6 +59,44 @@ namespace ICSharpCode.Reports.Core.Test.DataManager @@ -59,6 +59,44 @@ namespace ICSharpCode.Reports.Core.Test.DataManager
}
}
[Test]
public void Can_FillChild()
{
var dataNav = PrepareStandardGrouping();
while (dataNav.MoveNext()) {
if (dataNav.HasChildren) {
Assert.That(dataNav.HasChildren,Is.True);
DataRow r = dataNav.Current as DataRow;
string v2 = r["last"].ToString() + " GroupVal :" + r[3].ToString();
Console.WriteLine(v2);
FillChildList(dataNav);
}
}
}
void FillChildList (IDataNavigator nav)
{
BaseDataItem first= new BaseDataItem("First");
BaseDataItem last = new BaseDataItem("Last");
ReportItemCollection ric = new ReportItemCollection();
ric.Add(first);
ric.Add(last);
nav.SwitchGroup();
do {
nav.FillChild(ric);
foreach (BaseDataItem element in ric) {
Console.WriteLine("\t{0} - {1}",element.ColumnName,element.DBValue);
}
}
while ( nav.ChildMoveNext());
}
[Test]
public void Can_Read_Grouped_List()
{

Loading…
Cancel
Save