我正在构建一个查询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#的工作方式的根本误解...请向我说明我的方式上的错误。