Страница 1 из 4
Возможна ли группировка в динамическом отчёте
Добавлено: 16 апр 2009, 07:38
Master
Добрый день :biggrin:
Подскажите пожалуйста, можно ли делать группировку в динамическом отчёте.
Например в примере PrintTable сделать группировку?
Если это возможно, приведите пожалуйста маленький кусочек кода.
Спасибо.
Возможна ли группировка в динамическом отчёте
Добавлено: 17 апр 2009, 04:17
Jan
Здравствуйте,
Подскажите пожалуйста, можно ли делать группировку в динамическом отчёте.
Например в примере PrintTable сделать группировку?
Можно. Ниже пример кода:
Код: Выделить всё
StiGroupHeaderBand groupHeaderBand = StiActivator.CreateObject(StiOptions.Designer.ComponentsTypes.Bands.GroupHeaderBand) as StiGroupHeaderBand;
groupHeaderBand.Name = "GroupHeader1";
groupHeaderBand.Height = AlignToMaxGrid(page, 30, true);
groupHeaderBand.Condition.Value = "{condition}";
page.Components.Add(groupHeaderBand);
Спасибо.
Возможна ли группировка в динамическом отчёте
Добавлено: 23 апр 2009, 12:04
Master
Подскажите пожалуйста, что такое: AlignToMaxGrid.
Спасибо.
Возможна ли группировка в динамическом отчёте
Добавлено: 23 апр 2009, 12:27
Jan
Здравствуйте,
Запишите так:
Спасибо.
Возможна ли группировка в динамическом отчёте
Добавлено: 25 апр 2009, 06:22
Master
Вот исходный код модуля печати FlexGrida, с возможностью вывода заголовка и итога.
Код: Выделить всё
class PrintTable
{
static public void ShowReport(string strTitle, C1FlexGrid fg, string strSummary)
{
StiReport report = new StiReport();
//Создаём и копируем ресурсную таблицу у FlexGrid во временную DataTable вывода на экран
DataTable dt = new DataTable();
DataTable dtDS = (DataTable)fg.DataSource;
dt = dtDS.Copy();
//Удаляем из временной DataTable столбцов, которые скрыты во FlexGrid
int intDelCol = 0; //Количесво удалённых ячеек
for (int intCol = 0; intCol < dt.Columns.Count + intDelCol; intCol++)
{
int intColFlex = intCol + 1;
//if (dt.Columns[intCol - intDelCol].ColumnName != fg[0, intCol + 1].ToString())
// dt.Columns[intCol - intDelCol].ColumnName = fg[0, intCol + 1].ToString();
if (intColFlex <= fg.Cols.Count)
if (fg.Cols[intColFlex].Visible == false)
{
string str = dt.Columns[intCol - intDelCol].ColumnName;
//fg[0, intCol + 1].ToString();
dt.Columns.Remove(str);
intDelCol++; //Увеличиваем кол-во удалённых ячеек
}
}
//Add data to datastore
report.RegData("data", dt);
//Fill dictionary
report.Dictionary.Synchronize();
report.Dictionary.DataSources[0].Name = "data";
report.Dictionary.DataSources[0].Alias = "data";
StiPage page = report.Pages[0];
//Создаём заголовок отчёта
//
// ReportTitle1
//
StiReportTitleBand reportTitle;
reportTitle = new StiReportTitleBand();
reportTitle.ClientRectangle = new Stimulsoft.Base.Drawing.RectangleD(0, 0.4, 19, 0.8);
reportTitle.Name = "ReportTitle1";
page.Components.Add(reportTitle);
//
// TextTitle
//
StiText textTitle;
textTitle = new StiText();
textTitle.ClientRectangle = new Stimulsoft.Base.Drawing.RectangleD(0, 0, 19, 0.8);
textTitle.DockStyle = Stimulsoft.Report.Components.StiDockStyle.Fill;
textTitle.Name = "TextTitle";
textTitle.Text.Value = strTitle;
textTitle.HorAlignment = StiTextHorAlignment.Center;
reportTitle.Components.Add(textTitle);
//Create HeaderBand
StiHeaderBand headerBand = new StiHeaderBand();
headerBand.Height = 0.5;
headerBand.Name = "HeaderBand";
page.Components.Add(headerBand);
//Create HeaderBand
StiGroupHeaderBand groupHeaderBand = StiActivator.CreateObject(StiOptions.Designer.ComponentsTypes.Bands.GroupHeaderBand) as StiGroupHeaderBand;
groupHeaderBand.Name = "GroupHeader1";
//groupHeaderBand.Height = AlignToMaxGrid(page, 30, true);
groupHeaderBand.Height = 1;
groupHeaderBand.Condition.Value = "{data." + dt.Columns[0].ColumnName + "}";
page.Components.Add(groupHeaderBand);
//Create Databand
StiDataBand dataBand = new StiDataBand();
dataBand.DataSourceName = "data";
dataBand.Height = 0.5;
dataBand.Name = "DataBand";
page.Components.Add(dataBand);
//Create texts
double pos = 0;
double columnWidth = StiAlignValue.AlignToMinGrid(page.Width / dt.Columns.Count, 0.1, true);
int nameIndex = 1;
int intColumnViewFlex = 1; //Переменная для указания тех столбцов, которые отображены в гриде
foreach (DataColumn dataColumn in dt.Columns)
{
//Create text on header
StiText headerText = new StiText(new RectangleD(pos, 0, columnWidth, 0.5));
while (fg.Cols[intColumnViewFlex].Visible == false)
{//Мотаем номер столбца, до тех пор, пока не встретим видимый :)
intColumnViewFlex++;
}
headerText.Text.Value = fg[0, intColumnViewFlex].ToString();//dataColumn.Caption;
headerText.HorAlignment = StiTextHorAlignment.Center;
headerText.Name = "HeaderText" + nameIndex.ToString();
//headerText.Brush = new StiSolidBrush(Color.LightGreen);
headerText.Border.Side = StiBorderSides.All;
headerBand.Components.Add(headerText);
//Create text on Data Band
StiText dataText = new StiText(new RectangleD(pos, 0, columnWidth, 0.5));
dataText.Text.Value = "{data." + Stimulsoft.Report.CodeDom.StiCodeDomSerializator.ReplaceSymbols(dataColumn.ColumnName) + "}";
dataText.Name = "DataText" + nameIndex.ToString();
dataText.Border.Side = StiBorderSides.All;
dataBand.Components.Add(dataText);
pos = pos + columnWidth;
nameIndex++;
intColumnViewFlex++;
}
//Создаём итог отчёта
//
// ReportSummary1
//
StiReportSummaryBand ReportSummary1;
ReportSummary1 = new Stimulsoft.Report.Components.StiReportSummaryBand();
ReportSummary1.ClientRectangle = new Stimulsoft.Base.Drawing.RectangleD(0, columnWidth, 19, 0.8);
ReportSummary1.Name = "ReportSummary1";
page.Components.Add(ReportSummary1);
//
// TextSummary
//
StiText textSummary;
textSummary = new StiText();
textSummary.ClientRectangle = new Stimulsoft.Base.Drawing.RectangleD(0, 0, 19, 0.8);
textSummary.DockStyle = Stimulsoft.Report.Components.StiDockStyle.Fill;
textSummary.Name = "textSummary";
textSummary.Text.Value = strSummary;
textSummary.HorAlignment = StiTextHorAlignment.Center;
ReportSummary1.Components.Add(textSummary);
//Render without progress bar
report.Render(false);
report.Show();
}
}
Подскажите пожалуйста, что я неверно вставил в группировке, происходит просто сортировка по 1-ому столбцу. Если в первый столбец заполнен значениями 1,2,3,4, то мне необходимо чтобы шёл заголовок, например "1" и под ним таблица, начиная со второго столбца, далее "2" и таблица начиная со второго столбца.
Спасибо.
Возможна ли группировка в динамическом отчёте
Добавлено: 26 апр 2009, 07:30
Jan
Здравствуйте,
А сама группировка выводится?
Спасибо.
Возможна ли группировка в динамическом отчёте
Добавлено: 07 май 2009, 11:07
Master
Спасибо большое,
Jan, я разобрался
Возможна ли группировка в динамическом отчёте
Добавлено: 25 май 2009, 06:33
Master
Добавляю группировку так:
Код: Выделить всё
double posic = 0;
for (int i = intCountGroup + 1; i < dt.Columns.Count; i+=2)
{
//Create GroupHeaderBand - группировка по первому столбцу
StiGroupHeaderBand groupHeaderBand = StiActivator.CreateObject(StiOptions.Designer.ComponentsTypes.Bands.GroupHeaderBand) as StiGroupHeaderBand;
groupHeaderBand.Name = "GroupHeader" + i.ToString();
groupHeaderBand.CanShrink = true; //Может сжиматься, если пустой
//groupHeaderBand.Height = 0.5;
groupHeaderBand.Condition.Value = "{data." + dt.Columns[i].ColumnName + "}";
page.Components.Add(groupHeaderBand);
// TextGroup - значение первого столбца на заголовок группировки
StiText TextGroup;
TextGroup = new Stimulsoft.Report.Components.StiText();
TextGroup.ClientRectangle = new Stimulsoft.Base.Drawing.RectangleD(posic, 0, 19 - posic, 0.5);
TextGroup.Name = "TextGroup" + i.ToString();
TextGroup.Text.Value = "{data." + dt.Columns[i - 1].ColumnName + "}";
TextGroup.Border.Side = StiBorderSides.All;
TextGroup.Enabled = false; //Невидимый элемент
TextGroup.BeforePrint += new System.EventHandler(Text5_Conditions);
groupHeaderBand.Components.Add(TextGroup);
posic +=0.3;
}
Всё работает, вот только обработчик события не вызываеться :dumb: Не заходит на точку останова.
Код обработчика:
Код: Выделить всё
private void Text5_Conditions(object sender, System.EventArgs e)
{
string str = ((Stimulsoft.Report.Components.StiText)(sender)).Text.Value.ToString().ToLower();
if ( str != "".ToString().ToLower())
{
((Stimulsoft.Report.Components.IStiTextBrush)(sender)).TextBrush = new Stimulsoft.Base.Drawing.StiSolidBrush(System.Drawing.Color.Red);
((Stimulsoft.Report.Components.IStiBrush)(sender)).Brush = new Stimulsoft.Base.Drawing.StiSolidBrush(System.Drawing.Color.Transparent);
((Stimulsoft.Report.Components.IStiFont)(sender)).Font = new System.Drawing.Font("Arial", 8F);
((Stimulsoft.Report.Components.StiComponent)(sender)).Enabled = true;
return;
}
}
В чём причина?
Суть обработчика - сделать группировку видимой, если поле заголовка группировки не пустое.
Спасибо.
Возможна ли группировка в динамическом отчёте
Добавлено: 25 май 2009, 19:07
Jan
Здравствуйте,
В случае с событиями важен момент в который происходит создание бэнда. Если отчет уже скомпилирован, то Ваш код будет работать. Но в данном случае код отчета еще не скомпилирован. Соотвественно, Вам нужно не подписываться к событию, а записать текст события в comp.BeforePrintEvent.Value.
Спасибо.
Возможна ли группировка в динамическом отчёте
Добавлено: 26 май 2009, 05:37
Master
Jan, прочитал в хелпе и сделал так:
Код: Выделить всё
report.Compile();
for (int i = 0; i < arlNameTextGroup.Count; i++)
{
report.CompiledReport.GetComponents()[arlNameTextGroup[i].ToString()].BeforePrint += new EventHandler(Text_Conditions);
}
//Render without progress bar
report.Render(false);
report.Show();
Заходит в событие ровно 11 раз (сколько и тестовых полей группировки), но значение текстовых переменных всё время равно "". Может значение их позже инициализируеться?
Спасибо большое за заботу,
Jan.