Проблема Crystal Reports Web Viewer с разбиением на страницы и дополнительными параметрами - PullRequest
0 голосов
/ 07 февраля 2020

Я искал пару дней и столкнулся с проблемой, независимо от того, что я пытался. Проблема в том, что я, кажется, столкнулся с идеальным штормом и не могу заставить все 3 вещи работать одновременно.

  1. Пагинация
  2. Необязательные параметры
  3. Диалоговое окно параметров

Итак, этот первый метод - то, что я использовал, и все работает, за исключением того, что он не будет переходить за последние 2 (и я очень хорошо понимаю, почему навигация не ' не работает)

// ##################################################################################################################################################
// METHOD 1: Everything works correctly except you can't go past page 2
    protected void Page_Load(object sender, EventArgs e)
    {
        CrystalReportViewer1.ReportSource = Session["myReportDoc"] as CrystalDecisions.CrystalReports.Engine.ReportDocument;

        if (CrystalReportViewer1.ReportSource == null)
        {
            //Generate the Report Document 
            Handlers.ReportHandler myReportHandler = new Handlers.ReportHandler();
            CrystalDecisions.CrystalReports.Engine.ReportDocument myReportDocument = myReportHandler.GenerateReport("AlarmStatusReport");
            Session["myReportDoc"] = myReportDocument;   //This is were we save it off for next time
            CrystalReportViewer1.ReportSource = myReportDocument;
        }
    }

Итак, зная, что общее исправление состоит в том, чтобы не использовать Page Load, а использовать Page_Init вместо этого. Это исправляет навигацию ... пока я не открою отчет с необязательными параметрами. При этом каждый раз, когда я пытаюсь перейти на следующую страницу, вместо того, чтобы она работала, снова появляется поле «Параметр», и теперь требуется заполнение хотя бы одного из моих дополнительных параметров. (Каждая «следующая страница» уменьшает запрос на 1 опционально). Но, поскольку меня заставляют изменять параметры, он «обновляет» отчет, и я снова на странице 1.

    // ##################################################################################################################################################
    // METHOD 2: Works, but not for any report that has Optional Parameters. They become "Required" and keep popping up instead of navigating to the next page
    protected void Page_Init(object sender, EventArgs e)
    {
        CrystalReportViewer1.ReportSource = Session["myReportDoc"] as CrystalDecisions.CrystalReports.Engine.ReportDocument;

        if (CrystalReportViewer1.ReportSource == null)
        {
            //Generate the Report Document 
            Handlers.ReportHandler myReportHandler = new Handlers.ReportHandler();
            CrystalDecisions.CrystalReports.Engine.ReportDocument myReportDocument = myReportHandler.GenerateReport("AlarmStatusReport");
            Session["myReportDoc"] = myReportDocument;   //This is were we save it off for next time
            CrystalReportViewer1.ReportSource = myReportDocument;
        }
    }

Теперь я очень взволнован, потому что стал немного умным и исправил обе эти проблемы, заманив в ловушку навигацию и отслеживая страницу самостоятельно. ВСЕ РАБОТАЕТ СЕЙЧАС !!! пока я не go в диалоговом окне параметров, и он был полностью поднят.

    // ##################################################################################################################################################
    // METHOD 3: Everything works correctly except the Prompt Box doesn't Format correcly due to the addition of the added Event Handers
    protected void Page_Load(object sender, EventArgs e)
    {

        CrystalReportViewer1.ReportSource = Session["myReportDoc"] as CrystalDecisions.CrystalReports.Engine.ReportDocument;

        if (CrystalReportViewer1.ReportSource == null)
        {
            //Generate the Report Document 
            Handlers.ReportHandler myReportHandler = new Handlers.ReportHandler();
            CrystalDecisions.CrystalReports.Engine.ReportDocument myReportDocument = myReportHandler.GenerateReport("AlarmStatusReport");
            Session["myReportDoc"] = myReportDocument;   //This is were we save it off for next time
            CrystalReportViewer1.ReportSource = myReportDocument;

            //Init our Manual Page Counter to 1
            HiddenFieldPageNumber.Value = "1";
        }

        CrystalReportViewer1.Navigate += CrystalReportViewer1_Navigate;     //Simply Adding this event, EVEN IF IT HAS NO CODE, Breaks the style and formating of the Parameter Prompt box.
        CrystalReportViewer1.PreRender += CrystalReportViewer1_PreRender;
    }

    private void CrystalReportViewer1_Navigate(object source, CrystalDecisions.Web.NavigateEventArgs e)
    {
        //This prevents this event from Incrementing the Page again when the PreRender Event 
        //below re-sets which page to show. 
        if (_SkipPageIncrement == true)
        {
            return;
        }

        //Whenever the Navigation is used, this Event fires. Here is the problem, there is nothing that actually tells 
        //us if the user clicked on Previous or Next (or GotoPage for that Matter). So we have to do some guessing here
        if (e.CurrentPageNumber == 1 && e.NewPageNumber == 2)
        {
            //If they pressed "NEXT" we will always get Current = 1 and New = 2 due to the Pagination starting over on the PostBack
            //So we INCREMENT our real Page Number Value.
            HiddenFieldPageNumber.Value = (Convert.ToInt32(HiddenFieldPageNumber.Value) + 1).ToString();
        }
        else if (e.CurrentPageNumber == 1 && e.NewPageNumber == 1)
        {
            //If they pressed "PREV" we will always get Current = 1 and New = 1 due to the Pagination starting over on the PostBack
            //So we DECREMENT our real Page Number Value.
            HiddenFieldPageNumber.Value = (Convert.ToInt32(HiddenFieldPageNumber.Value) - 1).ToString();
        }
    }

    private void CrystalReportViewer1_PreRender(object sender, EventArgs e)
    {
        //The Viewer has a method that allows us to set the page number. This PreRender Event is the only
        //Event I could find that works. It comes AFTER the Navigate, but before the reports is rendered.
        _SkipPageIncrement = true; //The ShowNthPage re-triggers the Navigation, so this prevents it from running again.
        CrystalReportViewer1.ShowNthPage(Convert.ToInt32(HiddenFieldPageNumber.Value));
    }

Как уже отмечалось выше, в момент добавления события OnNavigation, даже если я закомментирую весь фактический код внутри, окно подсказки будет выглядеть следующим образом ...

Working

К этому (моя страница в качестве темного фона, и вы можете видеть, что теперь показывает, плюс кнопка «ОК» все подняты.

Broken Styling

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

Примечание : Я использую VS 2019 с CR 13.0.3500.0

1 Ответ

0 голосов
/ 11 февраля 2020

Итак, благодаря помощи товарища по команде, который более опытен в CSS, я решил проблему "достаточно хорошо". Так что для любого, кто хочет использовать событие LOAD (или должен мне понравиться), но затем теряет возможность использовать навигацию и хочет использовать мой метод, лейкопластырь для приглашения Crystal Reports Parameter состоит в том, чтобы просто переопределить их Стилизация на вашем сайте. css с этим ...

/*---------------------- Custom CSS for Report Prompt Buttons ----------------------*/

.pePromptButton {
    padding-bottom:4.3px;
}

td.pePromptButton {
    display: inherit;
}
    img {
    vertical-align:top;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...