2012-07-17 31 views
0

我的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並不陌生,我想這會是相當明顯的......

+0

您是否有使用ListView的要求,或者您是否可以將其更改爲GridView?使用GridView,您可以將其設置爲「AutoGenerateColumns」並將其綁定到數據源。 – 2012-07-17 22:19:37

+0

絕對沒有要求,在這裏,任何具體的。 GridView是好的,但我不得不說,它不會出現我爲什麼GridView會在ListView不工作的地方工作... – 2012-07-17 22:35:44

+0

由於'AutoGenerateColumns' =) – 2012-07-17 22:48:33

回答

1

邁克爾,給一個GridView的機會。 你ASPX這樣創建:

<asp:gridview id="gvReportResults" autogeneratecolumns="True" runat="server" ></asp:gridview> 

而且,在你的後臺代碼:

gvReportResults.DataSource = rds; 
gvReportResults.DataBind(); 

我不知道這是否將足以解決你的問題,但是這是一個很好的開始。

關注

+0

謝謝,安德烈。這完全有效,並適合我的需求。我仍然想學習如何在代碼中爲運行時構建各種視圖類型的模板,但是現在這種方式可以很好地工作。我喜歡這是一個非常簡單的解決方案。在我的解決方案架構中,我會或多或少地放棄了GridView,但爲了生成報告,它似乎是一個不錯的選擇。 – 2012-07-18 16:39:26

+0

@MichaelDoleman你是最受歡迎的 – 2012-07-18 17:23:33

相關問題