我的 ASP.NET Web 应用程序中有一个页面,它本质上是一个生成临时报告的工具。用户在众多标准中设置值,然后提交这些值以检索结果集。获取结果所需的 SQL 在运行时生成;在代码中,我使用 SQL 创建一个 SqlDataSource,然后将其绑定到 ListView。到目前为止,一切都运行良好。
然后,我无法弄清楚如何为 ListView 动态生成列。问题在于我在编译时不知道列的编号/名称,因为它们取决于动态生成的 SQL 的输出。我认为这将是一个非常简单的小练习,但我似乎找不到一个简化的例子来说明如何做到这一点。
我现有的代码几乎是无关紧要的,因为我基本上要求的是基础示例。我什至不确定我的方法是否正确——即,在标记中使用 ListView 并尝试在运行时在代码中操作其模板。这里有一些片段,但是......
这是我生成 SQL 的方法,仅供参考:
public static string GetReportSQL(HttpContext c = null)
{
if (c.Equals(null)) c = HttpContext.Current;
string report_id = c.Request.Params["report_id"].ToString();
string select_list = null;
string where_list = null;
string field = null;
string criteria_value = null;
POST.App_Objects.Report report = new POST.App_Objects.Report();
POST.App_Objects.Report report_fields = new POST.App_Objects.Report();
DataSet rds = report.GetReport_Summary_ByID(Int32.Parse(report_id));
DataSet rfds = report_fields.GetReportFields(Int32.Parse(report_id));
foreach (DataRow f in rfds.Tables[0].Rows)
{
field = f["report_field_name"].ToString();
if (!String.IsNullOrEmpty(c.Request["show_field__" + field]))
{
select_list += (!String.IsNullOrEmpty(select_list) ? ", " : null) + field + " AS '" + f["report_field_title"].ToString() + "'";
}
if (!String.IsNullOrEmpty(c.Request["criteria_value__" + field]))
{
criteria_value = c.Request["criteria_value__" + field].ToString();
where_list += (!String.IsNullOrEmpty(where_list) ? " AND " : null) + field;
switch (f["report_field_filter_type"].ToString())
{
case FILTER_TYPE_SEARCH_TERM:
where_list += " LIKE '%" + criteria_value + "%'";
break;
case FILTER_TYPE_TEXT_LIST:
break;
case FILTER_TYPE_MULTIPLE_SELECT:
where_list += " IN ('" + criteria_value.Replace(",", "','") + "')";
break;
}
}
}
string sql = "SELECT " + select_list + " FROM " + rds.Tables[0].Rows[0]["report_definition_source"].ToString() + " WHERE " + where_list;
return sql;
}
这是我的 ListView 控件的 Init 方法,它根据上面的 SQL 生成代码将它与 SqlDataSource 相关联:
public void ReportResultListView_Init(object sender, ListViewEditEventArgs e)
{
ListView rlv = (ListView)ReportFormView.FindControl("ReportResultListView");
SqlDataSource rds = new SqlDataSource(
ConfigurationManager.ConnectionStrings["POST"].ConnectionString.ToString(),
GetReportSQL(HttpContext.Current)
);
rlv.DataSource = rds;
ListViewDataItem lvdi = new ListViewDataItem(0,0);
rlv.Items.Add(lvdi);
rlv.DataBind();
}
最后,这是我获得相关 ListView 的标记片段(位于 FormView 内,仅供参考):
<asp:ListView
ID="ReportResultListView"
OnInit="ReportResultListView_Init"
runat="server">
<ItemTemplate>
<li><%# Eval("Organization Code").ToString() %></li>
</ItemTemplate>
<EmptyDataTemplate>
Nothing.
</EmptyDataTemplate>
</asp:ListView>
我有一个活页夹(“组织代码”)只是为了测试——我知道无论如何都会出现特定的列。澄清一下,我要在运行时指定要输出的字段,它们的名称是不同查询的结果......
我当然知道这是可能的,我只是没有看到适合我需要的示例。如果我对 .NET 不是那么陌生,我想这将是相当明显的......