【问题标题】:How to bind dynamic DataTable to DataList?如何将动态 DataTable 绑定到 DataList?
【发布时间】:2013-02-03 08:13:51
【问题描述】:

背后的代码:

DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("Rego No", typeof(string)));
foreach (var item in list)
{ 
    dt.Columns.Add(new DataColumn(string.Format("{0:dd/MM}",item),typeof(string)));
    //enter code here 
}
dlcalender.DataSource = dt;
dlcalender.DataBind();

ASPX:

DataTable 列像日期一样是动态的。我正在绑定DataTable,但没有显示任何内容。

您能指导我如何在DataTable 中显示标题列表吗?

【问题讨论】:

  • 您已经创建了数据列,但尚未插入行。

标签: c# asp.net datalist


【解决方案1】:

使用 linq。

dlcalender.DataSource = dt.select(p=>new{
c1=p.columns[0],
c2=p.columns[1],
......
});

并使用

<%# Eval("c1") %>
<%# Eval("c2") %>
......

【讨论】:

    【解决方案2】:

    问题是您已经创建了列,但没有在 DataTable 中插入任何行,这就是为什么在浏览器中运行网站时看不到任何结果的原因

    我认为您还应该了解DataList 控件在 ASP.NET 中的工作原理。

    您需要为只会出现一次的信息创建一个HeaderTemplate,并为将要重复的项目创建一个ItemTemplate。

    您不能将 DataTable 绑定到 HeaderTemplate,因为它不知道要为标题使用哪一行;

    在下面的示例中,我将字符串属性用于标题,将 DataTable 用于重复项:

    ASPX:

    <asp:DataList ID="dlcalender" runat="server">
        <FooterTemplate>
        </FooterTemplate>
        <HeaderTemplate>
            <asp:Label ID="head1" runat="server" Text='<%# Heading1 %>' />
            <asp:Label ID="head2" runat="server" Text='<%# Heading2 %>' />
            <asp:Label ID="head3" runat="server" Text='<%# Heading3 %>' />
            <asp:Label ID="head4" runat="server" Text='<%# Heading4 %>' />
        </HeaderTemplate>
        <ItemTemplate>
            <%# DataBinder.Eval(Container.DataItem,"Rego No")%>
            <%# DataBinder.Eval(Container.DataItem,"Column1") %>
            <%# DataBinder.Eval(Container.DataItem,"Column2")%>
            <%# DataBinder.Eval(Container.DataItem,"Column3")%>
        </ItemTemplate>
    </asp:DataList>
    

    背后的代码:

    public string Heading1 { get; set; }
    public string Heading2 { get; set; }
    public string Heading3 { get; set; }
    public string Heading4 { get; set; }
    
    protected void Page_Load(object sender, EventArgs e)
    {
        Heading1 = "Heading 1";
        Heading2 = "Heading 2";
        Heading3 = "Heading 3";
        Heading4 = "Heading 4";
    
        var list = new List<string> { "Column1", "Column2", "Column3" };
    
        var table = new DataTable();
        table.Columns.Add(new DataColumn("Rego No", typeof(string)));
    
        foreach (var item in list)
            table.Columns.Add(item, typeof(string));
    
        //Now add some rows(which will be repeated in the ItemTemplate)
        table.Rows.Add("0", "Row 0", "Row 0", "Row 0");
        table.Rows.Add("1", "Row 1", "Row 1", "Row 1");
        table.Rows.Add("2", "Row 2", "Row 2", "Row 2");
    
        dlcalender.DataSource = table;
        dlcalender.DataBind();
    }
    

    另外你为什么不直接使用网格视图?显示表格数据要好得多,我相信这就是你所拥有的

    【讨论】:

      【解决方案3】:

      由于您在运行时动态创建了数据列,因此您还必须在运行时将它们添加到 gridview,例如:

      DataTable dt = new DataTable();
      dt.Columns.Add(new DataColumn("Rego No", typeof(string)));
       foreach (var item in list)
        { 
          dt.Columns.Add(new DataColumn(string.Format("{0:dd/MM}",item),typeof(string)));
          //enter code here 
      
      dlcalender.Columns.Add(string.Format("{0:dd/MM}",item), string.Format("{0:dd/MM}",item));
        }
      dlcalender.DataSource = dt;
      dlcalender.DataBind();
      

      在上面的代码中,我在将列添加到数据表的同时将其添加到数据列表中。

      如果您不想全部添加,可以过滤它们。

      【讨论】:

        猜你喜欢
        • 2014-12-22
        • 2019-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-12
        • 2014-01-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多