как организовать этот код для загрузки отчета после показа окна? - PullRequest
2 голосов
/ 27 января 2012

Я пытаюсь загрузить XML-файл в набор данных и создать отчет Crystal с загруженными данными.

Я использую приложение Crystal Reports WPF для проекта.

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
        reportViewer.Owner = this;

        DataSet dset = new DataSet1();

        DataSet reportData = new DataSet();
        reportData.ReadXml("http://192.168.1.10/test/persons.xml");

        dset.Tables[0].Merge(reportData.Tables[0]); 


        ReportDocument report = null;
        report = new CrystalReport1();
        report.SetDataSource(dset.Tables[0]);
        reportViewer.ViewerCore.ReportSource = report;
    }

}

Это нормально работает, и мой вопрос заключается в том, как переместить загрузку XML и установить коды отчетов в другое событие для загрузки отчета после показа приложения?

Привет

Ответы [ 3 ]

0 голосов
/ 27 января 2012

Если вас беспокоит ответ пользовательского интерфейса, т.е. загрузка останавливает поток приложения, вы можете запустить его в другом потоке.Просто оберните это так.

public Window1()
{
    InitializeComponent();

    new Task(() =>
    {
        Dispatcher.BeginInvoke(new Action(() =>
        {
            reportViewer.Owner = this;

            DataSet dset = new DataSet1();

            DataSet reportData = new DataSet();
            reportData.ReadXml("http://192.168.1.10/test/persons.xml");

            dset.Tables[0].Merge(reportData.Tables[0]);


            ReportDocument report = null;
            report = new CrystalReport1();
            report.SetDataSource(dset.Tables[0]);
            reportViewer.ViewerCore.ReportSource = report;
        }), null);
    }).Start();
}
0 голосов
/ 27 января 2012

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

Private void Form1_Shown(object sender, EventArgs e)
{
            DataSet dset = new DataSet1();

            DataSet reportData = new DataSet();
            reportData.ReadXml("http://192.168.1.10/test/persons.xml");

            dset.Tables[0].Merge(reportData.Tables[0]); 


            ReportDocument report = null;
            report = new CrystalReport1();
            report.SetDataSource(dset.Tables[0]);
            reportViewer.ViewerCore.ReportSource = report;

}

Как вы сказали, это дляWPF попробуй ....

private void Window_Loaded(object sender, RoutedEventArgs e)
{
            DataSet dset = new DataSet1();

            DataSet reportData = new DataSet();
            reportData.ReadXml("http://192.168.1.10/test/persons.xml");

            dset.Tables[0].Merge(reportData.Tables[0]); 


            ReportDocument report = null;
            report = new CrystalReport1();
            report.SetDataSource(dset.Tables[0]);
            reportViewer.ViewerCore.ReportSource = report;
}

или

private void Window_ContentRendered(object sender, RoutedEventArgs e)
{
            DataSet dset = new DataSet1();

            DataSet reportData = new DataSet();
            reportData.ReadXml("http://192.168.1.10/test/persons.xml");

            dset.Tables[0].Merge(reportData.Tables[0]); 


            ReportDocument report = null;
            report = new CrystalReport1();
            report.SetDataSource(dset.Tables[0]);
            reportViewer.ViewerCore.ReportSource = report;
}
0 голосов
/ 27 января 2012

Вот события Window Lifetime Management: ( MSDN )

  • Активированный
  • Закрыто
  • Закрытие
  • Деактивирован
  • SourceInitialized

Я считаю, Activated событие - это то, что вам нужно. Учитывая, что событие Activated возникает не только при первом открытии окна, но и при переключении ALT + TAB и т. Д., Чтобы отфильтровать первое открытое окно из других активированных событий, просто используйте логический флаг, устанавливающий значение true при обработке события Activated в первый раз:

    bool firstActivateAlreadyHandled = false;
    protected override void OnActivated(EventArgs e)
    {
        base.OnActivated(e);

        if (!this.firstActivateAlreadyHandled)
        {
             // your code here
             this.firstActivateAlreadyHandled = true;
        }
    }
...