c# - 我的控制标签属性去了哪里?无法访问 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++ - CMake 不编译具有非标准扩展名的文件
- github-actions - 使用 GitHub Actions 将 Angular 应用程序部署到 beanstalk
- swift - 空核心数据表
- flutter - 为什么 Container 不尊重它给定的大小?
- dc.js - dc.js 禁用画笔调整大小
- python - 我的数据框包含许多列,我的标题显示不正确
- reactjs - 如何使用 React Js 使用 axios post 方法发送 cookie
- azure - Function-App Proxy 无法通过 Certificate"X-ARR-ClientCert" 到另一个 Function-App 的函数
- python - 在scrapy post中传递参数和数据
- javascript - 等待 Promise.all 继续执行