如何组织此代码以在显示窗口后加载报告

本文关键字:窗口 加载 报告 显示 何组织 代码 | 更新日期: 2023-09-27 18:21:32

我正在尝试将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和设置报告代码移动到不同的事件以加载报告?

问候

如何组织此代码以在显示窗口后加载报告

以下是窗口生存期管理事件:(MSDN)

  • 已激活
  • 已关闭
  • 交割
  • 已停用
  • 源初始化

我相信Activated活动正是您所需要的。考虑到Activated事件不仅在窗口第一次打开时触发,而且在ALT+TAB开关等时也会触发,因此要从其他激活事件中筛选出第一个windo打开,只需在第一次处理Activated事件时使用布尔标志将其设置为true:

    bool firstActivateAlreadyHandled = false;
    protected override void OnActivated(EventArgs e)
    {
        base.OnActivated(e);
        if (!this.firstActivateAlreadyHandled)
        {
             // your code here
             this.firstActivateAlreadyHandled = true;
        }
    }

不能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;
}

如果您关心UI响应,即加载会停止应用程序流,则可以在其他线程中启动它。就这样包起来吧。

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();
}