首页 > 解决方案 > 我的控制标签属性去了哪里?无法访问 foreach 循环中的控件属性

问题描述

我正在构建一个应用程序来查询 SQL Server 报表服务器,返回一个控件列表供用户选择,然后启动报表并将结果保存到用户选择的文件夹中。

我通过复制 Paul Turley 的“SQL Server 2016 Reporting Services and Mobile Reports”的第 15 章的部分内容开始了这段旅程,其中提供了一些基本的代码示例,这些示例将简单的报表提取到文件夹位置。此启动点旨在用于具有单个参数的非常基本的报告。我的组织有近千份各种复杂性的报告,该应用程序必须处理这些报告。我有一个方法:

private REService.ParameterValue[] GetReportExecutionParameters()

其中 REService 是 ReportExecution2005.asmx 的 Web 引用。

我建立了一个控件列表:

var controlList = new List<Control>();

对于我的 Wpf Stackpanel 中的每个控件,我根据控件类型添加到列表中:

foreach (var control in StackPanelParameters.Children.OfType<Object>())

带有一系列 if 语句:

    if (control is DatePicker )
    {
        DatePicker dp = (DatePicker)control;
        controlList.Add(dp);
        continue;
    }

然后,在同一方法中,我创建了一个值列表:

var parameterValues = new List<REService.ParameterValue>();

并尝试使用另一个 foreach/if 块填充 parameterValues。

完整的方法。

    private REService.ParameterValue[] GetReportExecutionParameters()
    {
        var controlList = new List<Control>();


        //same issue using UIElement....  
        //https://stackoverflow.com/questions/14688136/loop-through-stackpanel-children-genericaly
        //***This one helped: 
        //https://stackoverflow.com/questions/22298431/traversing-elements-of-stackpanel/22298680#22298680


        //create a list<> of controls extracted from the StackPanel, add them to the "controlList"
        foreach (var control in StackPanelParameters.Children.OfType<Object>())
        {
            if (control is DatePicker )
        {
            DatePicker dp = (DatePicker)control;
            controlList.Add(dp);
            continue;
        }
        if (control is TextBox)
        {
            TextBox t = (TextBox)control;
            controlList.Add(t);
            continue;
        }
        if (control is CheckBox)
        {
            CheckBox cb = (CheckBox)control;
            controlList.Add(cb);
            continue;
        }
        if (control is ComboBox)
        {
            ComboBox cbx = (ComboBox)control;
            controlList.Add(cbx);
            continue;
        }
        if (control is Label)
        {
            Label l = (Label)control;
            controlList.Add(l);
            continue;
        }
        else
        {
            //the generic case
            Control x = (Control)control;
            controlList.Add(x);
            continue;
        }

    }  //Ok, now I have a populated controlList

    // now I'm assigning the control value to the report parameter
    // per "https://odetocode.com/articles/123.aspx" a different approach?

    var parameterValues = new List<REService.ParameterValue>();

    foreach(var control in controlList)
    {
        if (control is DatePicker)
        {
            parameterValues.Add(new REService.ParameterValue
            { 
                Name = control.Name,
                Value = ((DatePicker)control).ToString()
            });
            continue;
        }
        else if (control is TextBox)
        {
            parameterValues.Add(new REService.ParameterValue
            {
                Name = control.Name,
                Value = ((TextBox)control).Text
            });
            continue;
        }
        else if (control is CheckBox)
        {
            parameterValues.Add(new REService.ParameterValue
            {
                Name = control.Name,
                Value = ((CheckBox)control).IsChecked.ToString()
            });
            continue;
        }
        else if (control is ComboBox)
        {
            parameterValues.Add(new REService.ParameterValue
            {
                Name = control.Name,
                Value = ((ComboBox)control).SelectedItem.ToString()
            });
            continue;
        }
        else if (control is Label)
        {
            parameterValues.Add(new REService.ParameterValue
            {
                //Name = control.ToString(),   
                //Name = control.Name, //this one is null
                //Name = ((System.Windows.Forms.Label)control).label


                //the control doesn't have a Label property, where did I lose you, little Label?
                Name = "",
                Value = ((Label)control).Content.ToString()
            });
            continue;
        }
    }
    return parameterValues.ToArray();
}

使用从用户输入到动态生成的控制参数和使用 ReportService2010.asmx 和 ReportExecution2005.asmx 从 ReportServer 返回的报告定义中收集的信息生成报告时会生成错误消息。

我收到一个错误,期望的是要填充 ParameterValue 中的 Name 属性,我相信 Label 值就是它要查找的值。虽然 Label 属性存在于控件数组级别,但当我“foreach”它时,Label 属性不再可用。

错误:消息“输入结构中缺少必填字段名称。--->

我无法访问 CDN 来托管我拥有的屏幕截图(在工作中),但Locals显示了以下列:名称、值、类型。当我查看“值”下(controlList 中的 var 控件)中的“控制”变量时,我看到 {System.Windows.Controls.Label: ProcessDate}

当我展开它以查找 Label 属性时,它不存在。我需要标签及其值。

我知道我的问题是对 C# 如何工作的根本误解......请指导我关于我的方式的错误。

标签: c#wpfreporting-services

解决方案


推荐阅读