我的ASP.NET Web應用程序中有一個頁面,它基本上是一個用於生成臨時報告的工具。用戶在多個標準中設置值,然後提交這些值以檢索結果集。獲得結果所需的SQL在運行時生成;在代碼中,我使用SQL來創建SqlDataSource,然後將其綁定到ListView。到目前爲止,一切都很順利。ItemTemplate中動態生成的列用於數據綁定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控件初始化方法,它與關聯基於上面的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並不陌生,我想這會是相當明顯的......
您是否有使用ListView的要求,或者您是否可以將其更改爲GridView?使用GridView,您可以將其設置爲「AutoGenerateColumns」並將其綁定到數據源。 – 2012-07-17 22:19:37
絕對沒有要求,在這裏,任何具體的。 GridView是好的,但我不得不說,它不會出現我爲什麼GridView會在ListView不工作的地方工作... – 2012-07-17 22:35:44
由於'AutoGenerateColumns' =) – 2012-07-17 22:48:33