繁体   English   中英

用于数据绑定ListView的ItemTemplate中动态生成的列

[英]Dynamically-generated Columns in ItemTemplate for Data-bound ListView

我的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的新手,我想这将是显而易见的...

迈克尔,给GridView一个机会。 像这样在您的ASPX上创建它:

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

并且,在您的代码背后:

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

我不确定这是否足以解决您的问题,但这是一个好的开始。

问候

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM