Какой простой способ связать сетку с динамическими столбцами? - PullRequest
2 голосов
/ 02 августа 2011

У меня есть переменная, определенная следующим образом:

Dim iRows As List(Of String())

Я также преобразовал это в список списков, чтобы было легче работать с ним.

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

Я хотел бы связать этот список с GridView, используя содержимое вложенного массива / списка для динамического определения столбцов.Я не знаю заранее, сколько будет столбцов, но я знаю, что они все одинаковы по всему списку.

Я просто не совсем уверен, как это сделать.Мысли?

Ответы [ 2 ]

3 голосов
/ 31 января 2012

Мне кажется, что, не зная, как выглядит ваш источник данных / сколько будет столбцов, невозможно разместить каждый столбец в отдельном столбце gridview.

Это означает, что фиксированная разметка невозможна => Необходимо установить для свойства AutoGenerateColumns значение true.

Вы можете установить HeaderText каждого столбца, обратившись к HeaderCollecion GridView, если вы хотите использовать другой

Другое решение, которое может вас заинтересовать, - вообще не использовать GridView, если вас интересует только отображение данных (т.е. нет кнопок редактирования или удаления). Вы можете отобразить ваши данные в html-таблице со столбцами и строками. используя Reflection, как предложил aleafonso.

1 голос
/ 30 января 2012

Я сделал что-то подобное с c #, что могло бы вам помочь.

У меня будет список направлений , которые будут заполнены в GridView.

Целевой объект должен быть сериализуемым и не может иметь значений, допускающих значение NULL.Это мой пример:

[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);
         }
    }

Насколько я знаю, здесь используется рефлексия: использование массива адресатов для привязки его к сетке.

С другой стороны, ваш 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 вы будете привязывать столько свойств адресатов , сколько необходимо.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...