C# 数据绑定ListView的ItemTemplate中动态生成的列

C# 数据绑定ListView的ItemTemplate中动态生成的列,c#,asp.net,listview,sqldatasource,itemtemplate,C#,Asp.net,Listview,Sqldatasource,Itemtemplate,我的ASP.NET web应用程序中有一个页面,它本质上是一个生成临时报告的工具。用户在众多准则中设置值,然后提交这些值以检索结果集。获取结果所需的SQL在运行时生成;在代码中,我使用SQL创建一个SqlDataSource,然后将其绑定到ListView。到那时为止,一切正常 我不明白的是,如何动态地为ListView生成列。问题在于,我不知道编译时列的数量/名称,因为它们依赖于动态生成的SQL的输出。我认为这是一个非常简单的小练习,但我似乎找不到一个简单的例子来说明如何做到这一点 我现有的代

我的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中,仅供参考):


  • 没有什么。
    我有一个活页夹(“组织代码”)在里面,只是为了测试——我知道不管怎样,特定的专栏都会出现。为了澄清这一点,我想要的是指定在运行时输出的字段,它们的名称是不同查询的结果


    当然,我知道这是可能的,我只是没有看到适合我需要的例子。如果我对.NET不是那么陌生的话,我想这是相当明显的…

    迈克尔,给我一个机会来个
    GridView
    。 在您的ASPX上创建它,如下所示:

    <asp:gridview id="gvReportResults" autogeneratecolumns="True" runat="server" ></asp:gridview>
    
    我不确定这是否足以解决你的问题,但这是一个好的开始


    关于

    您是否需要使用ListView,或者是否可以将其更改为GridView?使用GridView,您可以将其设置为
    AutoGenerateColumns
    ,并将其绑定到数据源。在这里,绝对没有任何特定的要求。GridView很好,但是我不得不说,我没有想到为什么GridView会在ListView不工作的情况下工作……因为
    AutoGenerateColumns
    =)嗯,这听起来很有用:-D你能发布一个简单的代码使用示例吗?谢谢,Andre。这完全有效,而且符合我的需要。我仍然想学习如何在运行时以代码的形式为各种视图类型构建模板,但就目前而言,这将很好地工作。我喜欢这是一个非常简单的解决方案。在我的解决方案架构中,我或多或少会完全放弃GridView,但对于生成报告来说,它们似乎是一个不错的选择。
    <asp:gridview id="gvReportResults" autogeneratecolumns="True" runat="server" ></asp:gridview>
    
    gvReportResults.DataSource = rds;
    gvReportResults.DataBind();