Проблема с Groupfooter

отредактировано 21:04 Раздел: 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();
            }
        }

Комментарии

  • отредактировано 21:04
    Разобрался, нашел свойства датабэндов CanGrow, CanShrink

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.