将gridview与动态列绑定的简单方法是什么?

时间:2011-08-02 19:14:12

标签: asp.net vb.net list gridview

我的变量定义如下:

Dim iRows As List(Of String())

我也将其转换为列表列表,以便更轻松地使用。

Dim iRows As List(Of IList(Of String))

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

我真的不确定如何去做。想法?

2 个答案:

答案 0 :(得分:3)

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

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

如果要使用不同的

,可以通过访问GridView的HeaderCollecion来设置每列的HeaderText。

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

答案 1 :(得分:1)

我用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();

其中ConvertArrayListToDataTable如下:

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的每一列中根据需要绑定尽可能多的目标属性。

希望这有帮助。