Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-ReportViewer-使类不是静态的_C#_Wpf_Reportviewer - Fatal编程技术网

C#-ReportViewer-使类不是静态的

C#-ReportViewer-使类不是静态的,c#,wpf,reportviewer,C#,Wpf,Reportviewer,我有一个类DependencyReportViewer,它对应于在程序中创建ReportViewer控件。这门课学得很好。在XAML中,我们只为想要的每个报告定义这一行: <ctr:DependencyReportViewer EmbeddedReportName="Program.View.Reports.ReportName.rdlc" ReportData="{Binding ReportData}"/> 课程的第一部分: <WindowsFormsHost x

我有一个类DependencyReportViewer,它对应于在程序中创建ReportViewer控件。这门课学得很好。在XAML中,我们只为想要的每个报告定义这一行:

  <ctr:DependencyReportViewer EmbeddedReportName="Program.View.Reports.ReportName.rdlc" ReportData="{Binding ReportData}"/>

课程的第一部分:

<WindowsFormsHost x:Class="Program.View.Controls.DependencyReportViewer"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
        mc:Ignorable="d"
        d:DesignHeight="300" d:DesignWidth="300"
        IsVisibleChanged="WindowsFormsHost_IsVisibleChanged">
</WindowsFormsHost>
public partial class DependencyReportViewer : WindowsFormsHost
{
    private static ReportViewer ReportViewer = new ReportViewer();
    private static int ReportIsRunning = 0;

    static DependencyReportViewer()
    {
        DependencyReportViewer.ReportViewer.SetDisplayMode(DisplayMode.PrintLayout);

        try
        {
            RenderingExtensions = ReportViewer.LocalReport.ListRenderingExtensions();
        }
        catch (Exception)
        {
            RenderingExtensions = new RenderingExtension[0];
        }

        ReportViewer.ReportError += ReportViewer_ReportError;
    }


    public static RenderingExtension[] RenderingExtensions { get; private set; }

    public static readonly RoutedEvent ReportDoneEvent = EventManager.RegisterRoutedEvent("ReportDone", RoutingStrategy.Bubble,
        typeof(RoutedEventHandler), typeof(DependencyReportViewer));
    public event RoutedEventHandler ReportDone
    {
        add { AddHandler(ReportDoneEvent, value); }
        remove { RemoveHandler(ReportDoneEvent, value); }
    }

    public string EmbeddedReportName
    {
        get { return (string)GetValue(EmbeddedReportNameProperty); }
        set { SetValue(EmbeddedReportNameProperty, value); }
    }
    public static readonly DependencyProperty EmbeddedReportNameProperty = DependencyProperty.Register("EmbeddedReportName",
        typeof(string), typeof(DependencyReportViewer));

    public Tuple<IEnumerable<Tuple<string, IEnumerable>>, IEnumerable<Tuple<string, string>>> ReportData
    {
        get { return (Tuple<IEnumerable<Tuple<string, IEnumerable>>, IEnumerable<Tuple<string, string>>>)GetValue(ReportDataProperty); }
        set { SetValue(ReportDataProperty, value); }
    }
    public static readonly DependencyProperty ReportDataProperty = DependencyProperty.Register("ReportData",
        typeof(Tuple<IEnumerable<Tuple<string, IEnumerable>>, IEnumerable<Tuple<string, string>>>), typeof(DependencyReportViewer),
        new FrameworkPropertyMetadata(null, ReportData_Changed));


    private static void ReportData_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var sts = Interlocked.CompareExchange(ref ReportIsRunning, 1, 0);
        if (sts != 0)
            return;

        var rv = (DependencyReportViewer)d;
        var data = (Tuple<IEnumerable<Tuple<string, IEnumerable>>, IEnumerable<Tuple<string, string>>>)e.NewValue;

        RenderingCompleteEventHandler evt = null;
        evt = (sender, rea) =>
        {
            ReportViewer.RenderingComplete -= evt;
            sts = Interlocked.Exchange(ref ReportIsRunning, 0);
            if (sts == 1)
                rv.RaiseEvent(new RoutedEventArgs(ReportDoneEvent));
        };
        ReportViewer.RenderingComplete += evt;

        DependencyReportViewer.ReportViewer.Reset();
        DependencyReportViewer.ReportViewer.LocalReport.ReportEmbeddedResource = null;
        if (data != null)
        {
            DependencyReportViewer.ReportViewer.LocalReport.SetBasePermissionsForSandboxAppDomain(new System.Security.PermissionSet(System.Security.Permissions.PermissionState.Unrestricted));

            DependencyReportViewer.ReportViewer.LocalReport.ReportEmbeddedResource = rv.EmbeddedReportName;

            var l = new List<ReportParameter>();
            foreach (var item in data.Item2)
            {
                l.Add(new ReportParameter(item.Item1, item.Item2));
            }
            DependencyReportViewer.ReportViewer.LocalReport.SetParameters(l);

            foreach (var item in data.Item1)
            {
                var rds = new ReportDataSource(item.Item1);
                rds.Value = item.Item2;
                DependencyReportViewer.ReportViewer.LocalReport.DataSources.Add(rds);
            }
        }
        DependencyReportViewer.ReportViewer.RefreshReport();
    }

    private static void ReportViewer_ReportError(object sender, ReportErrorEventArgs e)
    {
        Interlocked.Exchange(ref ReportIsRunning, 0);
    }


    public DependencyReportViewer()
    {
        InitializeComponent();
    }

    private void WindowsFormsHost_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        if ((bool)e.NewValue)
        {
            this.Child = DependencyReportViewer.ReportViewer;
        }
        else
        {
            DependencyReportViewer.ReportViewer.Reset();
            DependencyReportViewer.ReportViewer.LocalReport.ReportEmbeddedResource = null;
            DependencyReportViewer.ReportViewer.LocalReport.DataSources.Clear();
            DependencyReportViewer.ReportViewer.RefreshReport();
            this.Child = null;
        }
    }
}

最糟糕的部分是:

<WindowsFormsHost x:Class="Program.View.Controls.DependencyReportViewer"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
        mc:Ignorable="d"
        d:DesignHeight="300" d:DesignWidth="300"
        IsVisibleChanged="WindowsFormsHost_IsVisibleChanged">
</WindowsFormsHost>
public partial class DependencyReportViewer : WindowsFormsHost
{
    private static ReportViewer ReportViewer = new ReportViewer();
    private static int ReportIsRunning = 0;

    static DependencyReportViewer()
    {
        DependencyReportViewer.ReportViewer.SetDisplayMode(DisplayMode.PrintLayout);

        try
        {
            RenderingExtensions = ReportViewer.LocalReport.ListRenderingExtensions();
        }
        catch (Exception)
        {
            RenderingExtensions = new RenderingExtension[0];
        }

        ReportViewer.ReportError += ReportViewer_ReportError;
    }


    public static RenderingExtension[] RenderingExtensions { get; private set; }

    public static readonly RoutedEvent ReportDoneEvent = EventManager.RegisterRoutedEvent("ReportDone", RoutingStrategy.Bubble,
        typeof(RoutedEventHandler), typeof(DependencyReportViewer));
    public event RoutedEventHandler ReportDone
    {
        add { AddHandler(ReportDoneEvent, value); }
        remove { RemoveHandler(ReportDoneEvent, value); }
    }

    public string EmbeddedReportName
    {
        get { return (string)GetValue(EmbeddedReportNameProperty); }
        set { SetValue(EmbeddedReportNameProperty, value); }
    }
    public static readonly DependencyProperty EmbeddedReportNameProperty = DependencyProperty.Register("EmbeddedReportName",
        typeof(string), typeof(DependencyReportViewer));

    public Tuple<IEnumerable<Tuple<string, IEnumerable>>, IEnumerable<Tuple<string, string>>> ReportData
    {
        get { return (Tuple<IEnumerable<Tuple<string, IEnumerable>>, IEnumerable<Tuple<string, string>>>)GetValue(ReportDataProperty); }
        set { SetValue(ReportDataProperty, value); }
    }
    public static readonly DependencyProperty ReportDataProperty = DependencyProperty.Register("ReportData",
        typeof(Tuple<IEnumerable<Tuple<string, IEnumerable>>, IEnumerable<Tuple<string, string>>>), typeof(DependencyReportViewer),
        new FrameworkPropertyMetadata(null, ReportData_Changed));


    private static void ReportData_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var sts = Interlocked.CompareExchange(ref ReportIsRunning, 1, 0);
        if (sts != 0)
            return;

        var rv = (DependencyReportViewer)d;
        var data = (Tuple<IEnumerable<Tuple<string, IEnumerable>>, IEnumerable<Tuple<string, string>>>)e.NewValue;

        RenderingCompleteEventHandler evt = null;
        evt = (sender, rea) =>
        {
            ReportViewer.RenderingComplete -= evt;
            sts = Interlocked.Exchange(ref ReportIsRunning, 0);
            if (sts == 1)
                rv.RaiseEvent(new RoutedEventArgs(ReportDoneEvent));
        };
        ReportViewer.RenderingComplete += evt;

        DependencyReportViewer.ReportViewer.Reset();
        DependencyReportViewer.ReportViewer.LocalReport.ReportEmbeddedResource = null;
        if (data != null)
        {
            DependencyReportViewer.ReportViewer.LocalReport.SetBasePermissionsForSandboxAppDomain(new System.Security.PermissionSet(System.Security.Permissions.PermissionState.Unrestricted));

            DependencyReportViewer.ReportViewer.LocalReport.ReportEmbeddedResource = rv.EmbeddedReportName;

            var l = new List<ReportParameter>();
            foreach (var item in data.Item2)
            {
                l.Add(new ReportParameter(item.Item1, item.Item2));
            }
            DependencyReportViewer.ReportViewer.LocalReport.SetParameters(l);

            foreach (var item in data.Item1)
            {
                var rds = new ReportDataSource(item.Item1);
                rds.Value = item.Item2;
                DependencyReportViewer.ReportViewer.LocalReport.DataSources.Add(rds);
            }
        }
        DependencyReportViewer.ReportViewer.RefreshReport();
    }

    private static void ReportViewer_ReportError(object sender, ReportErrorEventArgs e)
    {
        Interlocked.Exchange(ref ReportIsRunning, 0);
    }


    public DependencyReportViewer()
    {
        InitializeComponent();
    }

    private void WindowsFormsHost_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        if ((bool)e.NewValue)
        {
            this.Child = DependencyReportViewer.ReportViewer;
        }
        else
        {
            DependencyReportViewer.ReportViewer.Reset();
            DependencyReportViewer.ReportViewer.LocalReport.ReportEmbeddedResource = null;
            DependencyReportViewer.ReportViewer.LocalReport.DataSources.Clear();
            DependencyReportViewer.ReportViewer.RefreshReport();
            this.Child = null;
        }
    }
}
公共部分类DependencyReportViewer:WindowsFormsHost
{
私有静态ReportViewer ReportViewer=新建ReportViewer();
私有静态int ReportIsRunning=0;
静态依赖关系ReportViewer()
{
DependencyReportViewer.ReportViewer.SetDisplayMode(DisplayMode.PrintLayout);
尝试
{
RenderingExtensions=ReportViewer.LocalReport.ListRenderingExtensions();
}
捕获(例外)
{
RenderingExtensions=新的RenderingExtension[0];
}
ReportViewer.ReportError+=ReportViewer\u ReportError;
}
公共静态RenderingExtension[]RenderingExtensions{get;private set;}
public static readonly RoutedEvent ReportDoneEvent=EventManager.RegisterRoutedEvent(“ReportDone”,RoutingStrategy.Bubble,
typeof(RoutedEventHandler),typeof(DependencyReportViewer));
公共事件路由EventHandler报告完成
{
添加{AddHandler(ReportDoneEvent,value);}
remove{RemoveHandler(ReportDoneEvent,value);}
}
公共字符串EmbeddedReportName
{
get{return(string)GetValue(EmbeddedReportNameProperty);}
set{SetValue(EmbeddedReportNameProperty,value);}
}
公共静态只读DependencyProperty EmbeddedReportNameProperty=DependencyProperty.Register(“EmbeddedReportName”,
typeof(字符串)、typeof(DependencyReportViewer));
公共元组数据
{
get{return(元组)GetValue(ReportDataProperty);}
set{SetValue(ReportDataProperty,value);}
}
公共静态只读DependencyProperty ReportDataProperty=DependencyProperty.Register(“ReportData”,
typeof(元组),typeof(DependencyReportViewer),
新的FrameworkPropertyMetadata(null,ReportData_Changed));
私有静态void ReportData_已更改(DependencyObject d、DependencyPropertyChangedEventArgs e)
{
var sts=联锁。比较交换(参考报告运行,1,0);
如果(sts!=0)
返回;
var rv=(DependencyReportViewer)d;
var data=(元组)e.NewValue;
RenderingCompleteEventHandler evt=null;
evt=(发送方,rea)=>
{
ReportViewer.RenderingComplete-=evt;
sts=联锁交换(参考报告运行,0);
如果(sts==1)
rv.RaiseEvent(新路线EventTargets(ReportDoneEvent));
};
ReportViewer.RenderingComplete+=evt;
DependencyReportViewer.ReportViewer.Reset();
DependencyReportViewer.ReportViewer.LocalReport.ReportEmbeddedResource=null;
如果(数据!=null)
{
DependencyReportViewer.ReportViewer.LocalReport.SetBasePermissionsForSandboxAppDomain(新的System.Security.PermissionSet(System.Security.Permissions.PermissionState.Unrestricted));
DependencyReportViewer.ReportViewer.LocalReport.ReportEmbeddedResource=rv.EmbeddedReportName;
var l=新列表();
foreach(data.Item2中的var项)
{
l、 添加(新的ReportParameter(item.Item1,item.Item2));
}
DependencyReportViewer.ReportViewer.LocalReport.SetParameters(l);
foreach(data.Item1中的var项)
{
var rds=新的ReportDataSource(item.Item1);
rds.Value=item.Item2;
DependencyReportViewer.ReportViewer.LocalReport.DataSources.Add(rds);
}
}
DependencyReportViewer.ReportViewer.RefreshReport();
}
私有静态void ReportViewer_ReportError(对象发送方,ReportErrorEventArgs e)
{
联锁交换(参考报告正在运行,0);
}
公共依赖性ReportViewer()
{
初始化组件();
}
私有void WindowsFormsHost_IsVisibleChanged(对象发送方,DependencyPropertyChangedEventArgs e)
{
if((bool)e.NewValue)
{
this.Child=DependencyReportViewer.ReportViewer;
}
其他的
{
DependencyReportViewer.ReportViewer.Reset();
DependencyReportViewer.ReportViewer.LocalReport.ReportEmbeddedResource=null;
DependencyReportViewer.ReportViewer.LocalReport.DataSources.Clear();
DependencyReportViewer.ReportViewer.RefreshReport();
this.Child=null;
}
}
}
问题是,此代码仅在只有一个UserControl打开此ReportViewer的情况下正常工作。如果我们打开两个或多个控件,那么最后一个打开的控件将接管ReportViewer。换句话说,可以同时只打开一个ReportViewer

现在,我想有一个可能打开多个控件与多个报告查看器。我得到的问题是这个类是静态的。当我们定义一个新控件时,在“this.Child=DependencyReportViewer.ReportViewer;”行中,我们只是将这个查看器重置为最新的控件


但是写这篇文章的人比我现在有更高的技巧。我多次未能使用XamlParseException将此类设置为非静态。如何将该类转换为非静态?

另一个要考虑的选项是。它是一个WPF控件,一个免费的社区版本是可用的。它是一个WPF控件,提供免费的社区版本。