Устаревшие проблемы с приложением отчетов с автоматически генерируемыми полями во время выполнения - PullRequest
0 голосов
/ 05 марта 2012

Я не знаю, намеревается ли следующий фрагмент кода работать таким образом, потому что иногда мы, «как разработчики», пытаемся автоматизировать создание элемента управления отображением данных, где количество полей не контролируется и имеет похожую привязку данных, поэтому, прежде чем япросмотрите приложение, которое некоторые парни оставили:

Под ActiveReport_ReportStart() событие:

    for (Ind = 1; Ind <=CM.Length; Ind++) {

        if (Ind == 1) {
            Left = ((Line)rpt.Sections["PageHeader"].Controls["lnH8"]).Left + 0.05f;
        } else if (Ind == 2) {
            Left = ((Line)rpt.Sections["PageHeader"].Controls["lnH9"]).Left + 0.05f;
        } else if (Ind == 3) {
            Left = ((Line)rpt.Sections["PageHeader"].Controls["lnH10"]).Left + 0.05f;
        }

        TextBox TB = new TextBox();
        TB.Size = ((Label)rpt.Sections["PageHeader"].Controls["tbColorway1"]).Size;
        TB.Font = ((Label)rpt.Sections["PageHeader"].Controls["tbColorway1"]).Font;
        TB.Width = ((Label)rpt.Sections["PageHeader"].Controls["tbColorway1"]).Width;
        TB.Height = ((Label)rpt.Sections["PageHeader"].Controls["tbColorway1"]).Height;
        TB.VerticalAlignment = VerticalTextAlignment.Top;
        TB.Location =  new System.Drawing.PointF(Left, ((Label)rpt.Sections["PageHeader"].Controls["tbColorway1"]).Top);
        TB.DataField = "ColorText" + Ind + ColorwayNumber;
        rpt.Sections["Detail"].Controls.Add(TB);

При предварительном просмотре не возникает ошибка компиляции, также другие поля, которые не генерируются автоматически,отображается правильно (ReporHeader, ReportFooter), но, думаю, лучше заменить этот механизм на подотчет внутри раздела подробностей, конечно, эти поля должны отображаться в разделе подробностей отчета.В любом случае я хотел бы увидеть некоторые рекомендации, потому что, если это возможно для автоматически сгенерированного текстового поля или надписей во время выполнения, мне придется объяснить боссу, почему этот код не работает, и если вместо этого я должен использовать подотчеты, мне нужно знать, какпередать параметр (по крайней мере, мне нужно работать с двумя параметрами для генерации еще одного sql-запроса для него) и какое «событие» подходит для помещения в него скрипта ..


После того, как я обнаружил, что самая важная проблемачтобы получить изменения формата отчета по количеству полей / текстовых полей, добавленных к деталям отчета во время выполнения, ограниченных возвращаемым значением sqlquery, например:

  1. Возвращенное значение SQLQuery = 4
  2. 10поля, сгенерированные для подробной строки 1
  3. 6 полей для строки 2
  4. 4 поля для строки 3

Подробные поля связаны с процедурой хранилища SQL *

Отчет будет распечатан / показан следующим образом:

//Report Init
    Page 1 :
                         |field 1|field 2|field 3|field 4|
    ------------------------------------------------------
    row1                 | valA1 | valA2 | valA3 | valA4 |
    ------------------------------------------------------
    row2                 | valB1 | valB2 | valB3 | valB4 |
    ------------------------------------------------------
    row3                 | valC1 | valC2 | valC3 | valC4 |
    ------------------------------------------------------

    Page 2 :
                         |field 1|field 2|field 3|field 4|
    ------------------------------------------------------
    row1                 | valA5 | valA6 | valA7 | valA8 |
    ------------------------------------------------------
    row2                 | valB5 | valB6 |
    ------------------------------------------------------
    row3                 
    ------------------------------------------------------

    Page 3 :
                         |field 1|field 2|field 3|field 4|
    ------------------------------------------------------
    row1                 | valA9 | valA10| 
    ------------------------------------------------------
    row2                 
    ------------------------------------------------------
    row3                 
    ------------------------------------------------------
//End of Report

Любая помощь будет оценена

Спасибо вам большоеч

1 Ответ

1 голос
/ 09 марта 2012

Прекрасно динамически создавать поля в отчете во время выполнения.Создание этих полей действительно необходимо выполнить в событии reportstart или ранее (т. Е. Перед вызовом ActiveReport.Run).

Однако вы можете разместить ту же логику для динамического создания этихполя в подотчете и тоже передают параметр, но в целом подотчеты накладывают дополнительные издержки (и в большинстве случаев дополнительный запрос), поэтому я бы не использовал подотчет, если нет убедительных преимуществ.Однако здесь есть пошаговое руководство по передаче параметров в подотчет здесь .

Единственное, что выглядит подозрительным в вашем коде, - это следующая строка:

 TB.Location =  new System.Drawing.PointF(Left, ((Label)rpt.Sections["PageHeader"].Controls["tbColorway1"]).Top);

Выиспользуют значение Top из элемента управления в PageHeader, но TB находится в разделе Сведения.Я могу понять повторное использование значения Left, но повторное использование значения Top не будет одинаковым для разных разделов (Top - это вертикальное положение сверху раздела, содержащего элемент управления )

ТеперьПохоже, иногда эти поля не отображаются в отчете.Вот некоторые вещи, которые вы можете проверить для устранения проблемы:

  • Определите, есть ли проблема с привязкой или визуальная проблема / проблема с расположением.Чтобы сделать это, просто дайте текстовому полю рамку, цвет фона или что-то такое, чтобы вы могли видеть его, даже если текст отсутствует (из-за сбоя привязки данных).
  • Начните выходить из положения каждого текстового поля изначение поля данных в файл журнала.Когда вы заметите проблему, вернитесь в журнал и посмотрите, сможете ли вы определить причину проблемы (может быть, конкретный индекс, местоположение или значение поля данных?).
  • Наконец, убедитесь, что размер страницы (определенсистемным принтером по умолчанию) не изменяется и, возможно, отключает одно из динамически добавляемых текстовых полей.
...