Как заставить Crystal Report Viewer отображать отчет после обратной передачи

На моей странице есть раскрывающийся список, метка и средство просмотра CR. Когда я выбираю отчет из DD, я обновляю метку, чтобы показать текущий выбранный отчет, и я обновляю CRV, чтобы показать отчет.

Метка обновляется нормально, и я просто поместил ее в качестве теста, чтобы убедиться, что другие элементы управления обновляются правильно. CRV, с другой стороны, всегда отстает на один запрос. Выбираю отчет, а он не появляется. Я выбираю другой отчет, а затем появляется тот, который я выбрал ранее.

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

using System;
using DataAccess;
using CrystalDecisions.CrystalReports.Engine;

namespace Reporting
{
    public partial class CRViewer : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack) return;
            ReportDropDown.Items.Add("Select a report");

            var reports = Data.ExecutSql("select * from ngmasterdb..reports");
            while (reports.Read()) ReportDropDown.Items.Add(reports["Name"].ToString());
            reports.Close();
        }

        protected void ReportDropDown_SelectedIndexChanged(object sender, EventArgs e)
        {
            var reportInfo = Data.ExecutSql("select * from ngmasterdb..reports where Name = '" + ReportDropDown.SelectedValue.Replace("'", "''") + "'");

            try
            {
                ReportDocument rptdoc = new ReportDocument();

                if (!reportInfo.Read()) return;
                var file = reportInfo["ReportFile"].ToString();
                if (file == null || file.Trim() == "") return;

                ReportSource.Report.FileName = file;
                CrystalReportViewer1.RefreshReport();
            }
            finally
            {
                reportInfo.Close();
            }
        }
    }
}

Я считаю, что единственное, что представляет интерес в aspx, это то, что AutoPostBack имеет значение true для элемента управления DropDown. Если вы все еще хотите увидеть aspx, дайте мне знать, и я опубликую его.


person Brandon Moore    schedule 24.04.2012    source источник
comment
Вы должны показать нам свой обработчик события SelectedIndexChanged. Когда, где и как вы привязываете данные к DropDownList?   -  person Tim Schmelter    schedule 25.04.2012
comment
@TimSchmelter, судя по вопросу, он использует это   -  person Habib    schedule 25.04.2012
comment
@ Habib.OSU: Что он использует? Я не говорил, что он должен обрабатывать событие SelectedIndexChanged. Я сказал, что он должен показать нам этот обработчик, чтобы мы могли увидеть, что происходит не так.   -  person Tim Schmelter    schedule 25.04.2012
comment
@BrandonMoore: Для меня ничего очевидного, но у меня нет опыта работы с CrystalReportViewer. Вы использовали отладчик, чтобы посмотреть, возникло ли исключение или что-то подобное? Примечание: Data.ExecutSql выглядит как самодельный DB-класс, не так ли? Может быть не очень хорошей идеей в ASP.NET (если вы используете статические соединения и т.д.) connection-the-connections-curren/9707060#9707060" title="executereader требует открытого и доступного соединения, для которого текущие соединения"> stackoverflow.com/questions/9705637/   -  person Tim Schmelter    schedule 25.04.2012
comment
@TimSchmelter Спасибо, я не знал, что, хотя код доступа к данным, который сейчас там, является временным, поскольку я просто пытаюсь заставить эти чертовы отчеты отображаться правильно прямо сейчас :). Но... мне все еще нравится идея инкапсулировать это; просто звучит так, будто мне нужен класс, который делает это для открытия/закрытия соединений по каждому запросу.   -  person Brandon Moore    schedule 25.04.2012
comment
@TimSchmelter Хорошо, я думал, что это просто случай, когда я не совсем понимаю, как поток событий работает в asp.net, но когда я просто разместил метку на своей странице, чтобы показать текущий выбранный элемент, он остается синхронизированным должным образом. Так что я предполагаю, что это как-то связано с Crystal Report Viewer: / Не совсем уверен, что делать дальше.   -  person Brandon Moore    schedule 25.04.2012
comment
@BrandonMoore: я не хочу отвлекаться от вопроса, но открывайте, закрывайте и удаляйте (используя оператор) соединения, как только вы закончите (например, в том методе, который его использует). Весь запрос слишком длинный. И никогда не используйте статическое соединение (реже всего в ASP.NET, поскольку каждый запрос представляет собой отдельный поток). Редактировать Как я уже упоминал, я не знаком с CrystalReportViewer, поэтому я не тот человек, который здесь нужен.   -  person Tim Schmelter    schedule 25.04.2012
comment
@TimSchmelter Да, уровень данных, который я в конечном итоге буду использовать, заполняет бизнес-объекты и возвращает их, а не возвращает средство чтения данных. Мне просто нужно изменить его, чтобы открывать/закрывать соединение каждый раз, как вы говорите.   -  person Brandon Moore    schedule 25.04.2012


Ответы (1)


Первоначально я в основном делал это:

ReportSource.Report.FileName = rptFileName;
CrystalReportViewer1.ReportSource = ReportSource;

Когда я избавился от ReportSource (объект CrystalDecisions.Web.CrystalReportSource) и вместо этого сделал следующее:

CrystalReportViewer1.ReportSource = rptFileName;

Потом стал вести себя корректно. Я пробовал этот подход раньше (или, по крайней мере, я уверен, что сделал, хотя сейчас это может показаться иначе...), но получал какие-то ошибки относительно пути к файлу.

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

person Brandon Moore    schedule 24.04.2012