C# 显示窗口后,如何组织此代码以加载报告?

C# 显示窗口后,如何组织此代码以加载报告?,c#,.net,wpf,crystal-reports,C#,.net,Wpf,Crystal Reports,我正在尝试将xml文件加载到数据集中,并使用加载的数据生成crystal报告 im使用Crystal Reports WPF应用程序进行项目 public partial class Window1 : Window { public Window1() { InitializeComponent(); reportViewer.Owner = this; DataSet dset = new DataSet1();

我正在尝试将xml文件加载到数据集中,并使用加载的数据生成crystal报告

im使用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移动到另一个事件,并将报告代码设置为在显示应用程序后加载报告


这是窗口生命周期管理事件:()

  • 激活
  • 封闭的
  • 结束
  • 停用
  • SourceInitialized
我相信,
激活的
事件就是您所需要的。考虑到
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;
        }
    }

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

  • 激活
  • 封闭的
  • 结束
  • 停用
  • SourceInitialized
我相信,
激活的
事件就是您所需要的。考虑到
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;
        }
    }

如果您担心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();
}

如果您担心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();
}

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


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


虽然我在寻找类似的东西,但似乎在WPF中显示的应用程序不起作用。应用程序正常打开但报告不会加载。hmmm尝试呈现内容,同时在其中添加某种控制台。WriteLine(),以便您可以看到它是否在公共Window1()中被调用(抱歉,不知道控制台的WPF等价物{}Console.WriteLine()可以工作,并且在Window_ContentRendered或Window_加载的内容中没有发生任何事情。尽管我正在寻找类似的东西,但在WPF中显示的应用程序似乎不工作。没有任何事情发生应用程序正常打开但报告不会加载。hmmm请尝试渲染内容,同时添加某种控制台。WriteLine()在那里,您可以看到它是否在公共Window1(){}控制台内被调用(对不起,不知道控制台的WPF等价物)。WriteLine()工作,在Window_ContentRendered或Window_加载中什么都没有发生是的,加载应用程序需要时间,但我不知道如何使用这段代码,虽然这似乎是我需要的方式,但一旦它运行,我就会在reportData.ReadXml(“)行出错;服务器违反了协议。Section=ResponseStatusLine-1。这不能保证在显示表单后会显示它,而OP希望这样。此外,在构造函数中加载数据时,这是一种糟糕的编码做法。由于数据是从远程源检索的,因此很难控制何时加载。为什么会这样在构造函数中加载数据是一种不好的做法?你能给我指出一些链接来解释为什么这是一种不好的做法吗?是的,加载应用程序需要时间,但我不知道如何使用这段代码,虽然这似乎是我需要的方式,但一旦它运行,我就会在reportData.ReadXml(“)行出错;服务器违反了协议。截面=响应STATUSLINE-1。这并不保证它会在表单显示后显示,而OP希望这样。此外,在构造函数中加载数据时,这是一种糟糕的编码实践。很难控制何时加载数据,因为数据是从远程源检索的。为什么在构造函数中加载数据是一种不好的做法?你能给我指一些链接来解释为什么这是一种不好的做法吗?我使用了protectedoverride void OnContentRendered(EventArgs e)方法,似乎效果不错。我使用了protected override void OnContentRendered(EventArgs e)方法,似乎效果不错