Проблема с Groupfooter
Здравствуйте!
В общем есть таблица, там хранится информация об объекте и его координаты. Проблема в том, что количество точек у каждого объекта может быть неодинаковым. Не нашел ничего лучше, как создать дополнительные столбцы в таблице, в каждом из которых хранится информация об одной точке. Но так как количество точек у объектов разное, а количество столбцов у каждого объекта равно максимальному количеству точек, возникает куча пустых строк. Был бы признателен, если бы мне подсказали либо как избавиться от пустых строк, либо как поставить Groupfooter сразу после последней непустой строки в датабэнде.
Работаю с FastReport.Net через код(без дизайнера).
В общем есть таблица, там хранится информация об объекте и его координаты. Проблема в том, что количество точек у каждого объекта может быть неодинаковым. Не нашел ничего лучше, как создать дополнительные столбцы в таблице, в каждом из которых хранится информация об одной точке. Но так как количество точек у объектов разное, а количество столбцов у каждого объекта равно максимальному количеству точек, возникает куча пустых строк. Был бы признателен, если бы мне подсказали либо как избавиться от пустых строк, либо как поставить Groupfooter сразу после последней непустой строки в датабэнде.
Работаю с FastReport.Net через код(без дизайнера).
private void button1_Click(object sender, EventArgs e)
{
string value = null;
int addit_col_ind = 0;
int all_col_count = 0;
string visible_name = null;
string pk_field = null;
string geom_field = null;
dic.TryGetValue((string)comboBox1.SelectedItem, out value);
DataTable dt = new DataTable(value);
using (db_work c = new db_work())
{
// primary key finding
c.sql = string.Format("SELECT pk_fileld, geom_field FROM sys_scheme.table_info WHERE name_db='{0}'", value.Split('.')[1]);
Npgsql.NpgsqlDataReader rd = c.ExecuteReader();
if (rd == null) return;
while (rd.Read())
{
pk_field = rd.GetValue(0).ToString();
geom_field = rd.GetValue(1).ToString();
}
rd.Close();
// Table filling
string _str = string.Format("SELECT substring(astext({1}),E'\\\\(+(.*?)\\\\)+') coord, * FROM {0}", value, geom_field);
if (!dataSet1.Tables.Contains(value))
{
c.GetDataTable(out dt, _str);
int col_count = 0;
foreach (DataRow dr in dt.Rows)
{
// добавление дополнительных столбцов для координат точек
string[] points = dr["coord"].ToString().Split(',');
while (col_count < points.Count())
{
col_count++;
dt.Columns.Add("PointCoord"+col_count.ToString());
dt.Columns["PointCoord" + col_count.ToString()].DefaultValue = String.Empty;
}
int i = dt.Columns.IndexOf("PointCoord1");
int j = 1;
foreach (string point in points)
{
dr[i++] = "Точка " + j++ + ": " + point;
}
}
addit_col_ind = dt.Columns.IndexOf("PointCoord1");
all_col_count = dt.Columns.Count;
dt.TableName = value;
dataSet1.Tables.Add(dt);
}
Report report = new Report();
// registering
report.RegisterData(dataSet1.Tables[0], "tablename");
// enable it to use in a report
report.GetDataSource("tablename").Enabled = true;
// create A4 page with all margins set to 1cm
ReportPage page1 = new ReportPage();
page1.Name = "Page1";
report.Pages.Add(page1);
// create ReportTitle band
page1.ReportTitle = new ReportTitleBand();
page1.ReportTitle.Name = "ReportTitle1";
// set its height to 1.5cm
page1.ReportTitle.Height = Units.Centimeters * 1.5f;
// create group header
GroupHeaderBand group1 = new GroupHeaderBand();
group1.Name = "GroupHeader1";
group1.Height = Units.Centimeters * 1;
// set group condition
group1.Condition = "[tablename." + pk_field + "]";
// add group to the page.Bands collection
page1.Bands.Add(group1);
// create group footer
group1.GroupFooter = new GroupFooterBand();
group1.GroupFooter.Name = "GroupFooter1";
group1.GroupFooter.Height = Units.Centimeters * all_col_count * 0.5f;
// create DataBand
DataBand data1 = new DataBand();
data1.Name = "Data1";
data1.Height = Units.Centimeters * 0.5f;
// set data source
data1.DataSource = report.GetDataSource("tablename");
// connect databand to a group
group1.Data = data1;
// create "Text" objects
// report title
TextObject text1 = new TextObject();
text1.Name = "Text1";
// set bounds
text1.Bounds = new RectangleF(0, 0,
Units.Centimeters * 19, Units.Centimeters * 1);
// set text
rev_dic.TryGetValue(value, out visible_name);
text1.Text = visible_name.ToUpper();
// set appearance
text1.HorzAlign = HorzAlign.Center;
text1.Font = new Font("Tahoma", 14, FontStyle.Bold);
// add it to ReportTitle
page1.ReportTitle.Objects.Add(text1);
// group(header)
TextObject text2 = new TextObject();
text2.Name = "Text2";
text2.Bounds = new RectangleF(0, 0,//Units.Centimeters*1f*dataSet1.Tables[value].Columns.Count,
Units.Centimeters * 2, Units.Centimeters);// * dataSet1.Tables[value].Columns.Count);
text2.Text = "Object: [tablename." + pk_field + "]";
text2.Font = new Font("Tahoma", 10, FontStyle.Bold);
// add it to GroupHeader
group1.Objects.Add(text2);
// data band(list of attributes)
float counter = 0;
foreach (System.Data.DataColumn column in dataSet1.Tables[value].Columns)
{
if (column.ColumnName != geom_field && column.ColumnName != "coord" && (column.ColumnName.Length < 10||column.ColumnName.Substring(0, 10) != "PointCoord"))
{
TextObject text3 = new TextObject();
text3.Name = "Text3";
text3.Bounds = new RectangleF(Units.Centimeters, Units.Centimeters * counter,
Units.Centimeters * 20, Units.Centimeters * 1f);
counter += 0.5f;
text3.Text = column.ColumnName + ": [tablename." + column.ColumnName + "]";
text3.Font = new Font("Tahoma", 8);
// add it to DataBand
data1.Objects.Add(text3);
}
}
//photo
TextObject text5 = new TextObject();
text5.Name = "Text5";
text5.Bounds = new RectangleF(0, Units.Centimeters * counter,
Units.Centimeters * 20, Units.Centimeters * 1f);
counter += 0.5f;
text5.Text = "Фото: ";
text5.Font = new Font("Tahoma", 8);
// add it to DataBand
data1.Objects.Add(text5);
//coordinates
TextObject text7 = new TextObject();
text7.Name = "Text7";
text7.Bounds = new RectangleF(0, Units.Centimeters * counter,
Units.Centimeters * 20, Units.Centimeters * 1f);
counter += 0.5f;
text7.Text = "Координаты: ";
text7.Font = new Font("Tahoma", 8);
// add it to DataBand
data1.Objects.Add(text7);
int num = 1;
while (addit_col_ind + num - 1 < all_col_count)
{
TextObject text6 = new TextObject();
text6.Name = "Text6";
text6.Bounds = new RectangleF(Units.Centimeters, Units.Centimeters * counter,
Units.Centimeters * 20, Units.Centimeters * 1f);
counter += 0.5f;
text6.Text = "[tablename.PointCoord"+num+"]";
text6.Font = new Font("Tahoma", 8);
text6.HideZeros = true;
text6.HideValue = "Точка " + num + ": ";
// add it to DataBand
data1.Objects.Add(text6);
num++;
}
// group footer
TextObject text4 = new TextObject();
text4.Name = "Text4";
text4.Bounds = new RectangleF(0, Units.Centimeters*2,
Units.Centimeters * 10, Units.Centimeters * 0.5f);
text4.Text = "";
text4.Font = new Font("Tahoma", 8, FontStyle.Bold);
// add it to GroupFooter
group1.GroupFooter.Objects.Add(text4);
// run the report
report.Show();
}
}
Комментарии