我的“控制标签”属性去了哪里?无法在foreach循环中访问控件属性

时间:2019-07-08 21:51:24

标签: c# wpf reporting-services

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

我通过复制Paul Turley的“ SQL Server 2016报告服务和移动报告”第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();
}

使用从用户输入到动态生成的控制参数的信息以及使用ReportService 2010.asmx和ReportExecution2005.asmx从ReportServer返回的报表定义生成报表时,会生成错误消息。

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

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

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

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

我发现我的问题是对C#的工作方式的根本误解...请向我说明我的方式上的错误。

0 个答案:

没有答案