Asp.net 用动态列绑定gridview的简单方法是什么?

Asp.net 用动态列绑定gridview的简单方法是什么?,asp.net,vb.net,list,gridview,Asp.net,Vb.net,List,Gridview,我有一个变量定义如下: Dim iRows As List(Of String()) 我还将其转换为列表列表,以使其更易于使用 Dim iRows As List(Of IList(Of String)) 我想使用嵌套数组/列表的内容将该列表绑定到GridView,以动态定义列。我不知道提前会有多少列,但我知道在整个列表中它们都是相同的 我只是不知道该怎么做。想法?我用c#做了类似的事情,这可能会对你有所帮助 我将有一个目的地列表,将填充到GridView 目标对象必须可序列化,并且不能具有

我有一个变量定义如下:

Dim iRows As List(Of String())
我还将其转换为列表列表,以使其更易于使用

Dim iRows As List(Of IList(Of String))
我想使用嵌套数组/列表的内容将该列表绑定到GridView,以动态定义列。我不知道提前会有多少列,但我知道在整个列表中它们都是相同的


我只是不知道该怎么做。想法?

我用c#做了类似的事情,这可能会对你有所帮助

我将有一个目的地列表,将填充到GridView

目标对象必须可序列化,并且不能具有可为空的值。这是我的例子:

[Serializable]
public class destination
{
    private int idDestination;
    public int IDDestination { get; set; }

    private string name;
    public string Name { get; set; }

    private string type;
    public string Type { get; set; }

    private string ringingTime;
    public string RingingTime { get; set; }

    private int priority;
    public int Priority { get; set; }

    private int huntBusy;
    public int HuntBusy { get; set; }

    public destination() { }
}
每次要填充GridView时,都需要执行以下操作:

GridViewDestination.DataSource = ConvertArrayListToDataTable(listSelectedDestinations);
GridViewDestination.DataBind();
public static DataTable ConvertArrayListToDataTable(ArrayList arrayList)
    {
        DataTable dt = new DataTable();

        if (arrayList.Count != 0)
        {
            dt = ConvertObjectToDataTableSchema(arrayList[0]);
            FillData(arrayList, dt);
        }

        return dt;
    }

public static DataTable ConvertObjectToDataTableSchema(Object o)
    {
        DataTable dt = new DataTable();
        PropertyInfo[] properties = o.GetType().GetProperties();
        if (o.GetType() == typeof(destination))
        {
            foreach (PropertyInfo property in properties)
            {
                DataColumn dc = new DataColumn(property.Name);
                dc.DataType = property.PropertyType; dt.Columns.Add(dc);
            }
        }

        return dt;
    }

private static void FillData(ArrayList arrayList, DataTable dt)
    {
        foreach (Object o in arrayList)
        {
            DataRow dr = dt.NewRow();
            PropertyInfo[] properties = o.GetType().GetProperties();
            if (o.GetType() == typeof(destination))
            {
                foreach (PropertyInfo property in properties)
                {
                    dr[property.Name] = property.GetValue(o, null);
                }
            }

            dt.Rows.Add(dr);
         }
    }
其中ConvertArrayListToDataTable如下所示:

GridViewDestination.DataSource = ConvertArrayListToDataTable(listSelectedDestinations);
GridViewDestination.DataBind();
public static DataTable ConvertArrayListToDataTable(ArrayList arrayList)
    {
        DataTable dt = new DataTable();

        if (arrayList.Count != 0)
        {
            dt = ConvertObjectToDataTableSchema(arrayList[0]);
            FillData(arrayList, dt);
        }

        return dt;
    }

public static DataTable ConvertObjectToDataTableSchema(Object o)
    {
        DataTable dt = new DataTable();
        PropertyInfo[] properties = o.GetType().GetProperties();
        if (o.GetType() == typeof(destination))
        {
            foreach (PropertyInfo property in properties)
            {
                DataColumn dc = new DataColumn(property.Name);
                dc.DataType = property.PropertyType; dt.Columns.Add(dc);
            }
        }

        return dt;
    }

private static void FillData(ArrayList arrayList, DataTable dt)
    {
        foreach (Object o in arrayList)
        {
            DataRow dr = dt.NewRow();
            PropertyInfo[] properties = o.GetType().GetProperties();
            if (o.GetType() == typeof(destination))
            {
                foreach (PropertyInfo property in properties)
                {
                    dr[property.Name] = property.GetValue(o, null);
                }
            }

            dt.Rows.Add(dr);
         }
    }
据我所知,这是在使用反射:使用目的地的arraylist将其绑定到gridview

另一方面,GridView的定义如下:

<asp:GridView ID="GridViewDestination" runat="server" Visible="False" Width="98%" CssClass="GridView" AutoGenerateColumns="False">
          <Columns>
              <asp:TemplateField HeaderText="Name">
                   <ItemTemplate>
                       <asp:Label ID="idNonAnsweredCreating" runat="server" Text='<%# bind("idDestination") %>' Visible="false"></asp:Label>
                       <asp:Label Visible="true" runat="server" ID="destinationLabelCreating" Text='<%# bind("name")  %>'></asp:Label>
                   </ItemTemplate>
              </asp:TemplateField>
              <asp:TemplateField HeaderText="Type">
                  <ItemTemplate>
                       <asp:Label Visible="true" runat="server" ID="destinationTypeLabelCreating" Text='<%# bind("type")  %>'></asp:Label>
                  </ItemTemplate>
              </asp:TemplateField>
          </Columns>
</asp:GridView>

如您所见,您将根据需要在GridView的每一列中绑定任意多个destinations属性


希望这能有所帮助。

在我看来,如果不知道数据源的外观/将有多少列,就无法将每一列放入不同的gridview列中

这意味着,不可能使用固定标记=>您需要将AutoGenerateColumns属性设置为true

如果要使用其他名称,可以通过访问GridView的HeaderCollection来设置每列的HeaderText


您可能感兴趣的另一个解决方案是根本不使用GridView,如果您只对显示数据感兴趣(即不使用编辑或删除按钮),则可以使用反射将数据呈现到包含列和行的html表中,就像aleafonso建议的那样。

考虑改用DataTable。我认为动态构建要绑定的DataTable并没有那么糟糕。我只是觉得可能有更简单的方法。同意@Slaks。。或者
DataSet
构建数据表是更简单的方法。更难的方法是
ICustomTypeDescriptor
。正如您在标记中看到的,您使用固定标记和AutoGenerateColumns=“False”。据我所知,OP不知道哪些列会出现在这个数据源中?很抱歉,但OP是什么意思?我也不能理解这个问题:“他不知道这个数据源中会有哪些列?”。你能重新表述一下吗?CheersOP=原始海报=提出问题的用户。对不起,我漏了一个字。我想写:据我所知,OP不知道该数据源中将包含哪些列。我只是想阐明如何绑定与datatable不同的结构,在本例中是arraylist,以填充gridview。正如您所指出的,这个例子需要知道列(或对象属性)才能工作。。。我想这是一个非常好的观点。毕竟,这就是它的目的。我一直在寻找一种不那么“自动化”的方法,因为我正在定义我的列的其他属性,如按钮等。也就是说,你是对的,这将完成基本操作,也许还有另一种方法来处理其余的操作。我想我对这个问题的措辞不太恰当。