Как изменить количество столбцов в DataList (Webforms, C#)

Я сделал веб-приложение, которое запрашивает базу данных и возвращает результаты в Datalist.

Пользователь может указать, какие столбцы возвращать. Для Datalist я сделал это:

        <asp:DataList runat="server" ID="list">
        <ItemTemplate>
            <%# DataBinder.Eval(Container.DataItem, columns[0])%>
            &nbsp &nbsp &nbsp
            <%# DataBinder.Eval(Container.DataItem, columns[1])%>
            &nbsp &nbsp &nbsp
            <%# DataBinder.Eval(Container.DataItem, columns[2])%>
            &nbsp &nbsp &nbsp
            <%# DataBinder.Eval(Container.DataItem, columns[3]) %>
            &nbsp &nbsp &nbsp
            <%# DataBinder.Eval(Container.DataItem, columns[4]) %>
            &nbsp &nbsp &nbsp
            <%# DataBinder.Eval(Container.DataItem, columns[5]) %>
        </ItemTemplate>
    </asp:DataList>

Это будет работать, если пользователь выберет 7 столбцов, чтобы вернуть его, будет отображаться только 6, и если пользователь выберет 5 столбцов, чтобы вернуть его, будет выбрасывать ArgumentOutOfRangeExpection.

Есть ли способ поместить оператор if, чтобы проверить, нужен ли ему этот столбец?

Спасибо

1 ответ

При привязке данных к списку данных / сетке / ретранслятору проще создать список объектов и связать их с элементом управления. Вот пример использования gridview:

<asp:GridView ID="GridView1" runat="server" AllowSorting="False"
  AutoGenerateColumns="false" BackColor="White" 
  BorderWidth="2px" BorderStyle="Solid"
  CellPadding="4" ForeColor="#333333" GridLines="both" 
  EmptyDataText="No Log Messages">

     <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
     <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
     <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
     <Columns>                                  
       <asp:TemplateField Visible="false" ItemStyle-HorizontalAlign="Center" HeaderText="ID" HeaderStyle-ForeColor="white">
         <ItemTemplate>
            <asp:Label ID="lblId" runat="Server" Text=' <%#Eval("ID")%>' />
             </ItemTemplate>
        </asp:TemplateField>  
<asp:TemplateField Visible="false" ItemStyle-HorizontalAlign="Center" HeaderText="Address" HeaderStyle-ForeColor="white">
         <ItemTemplate>
            <asp:Label ID="lblAddress" runat="Server" Text=' <%#Eval("Address1")%>' />
             </ItemTemplate>
        </asp:TemplateField>                   
     </Columns>
 </asp:GridView>

В этом примере создается таблица с двумя столбцами. Каждый столбец ожидает, что базовый источник данных будет иметь столбцы с именами: ID и Address1. На стороне сервера вы создаете список объектов, имеющих столбцы с этими именами, и привязываете источник данных к элементу управления. Как это:

Сначала создайте класс со своими свойствами:

Public Class myClassAddress
    Public Property ID  As String
    Public Property Address1  As String
End Class

Теперь, в коде, где у вас есть gridview, создайте экземпляр этого класса и заполните его:

    Dim myList As New List(Of myClassAddress)
    Dim newClass As myClassAddress

    newClass = New myClassAddress
    newClass.Address1 = "some address"
    newClass.ID = "1"
    myList.Add(newClass)

    newClass = New myClassAddress
    newClass.Address1 = "some address2"
    newClass.ID = "12"
    myList.Add(newClass)

Конечно, в этом примере я просто жестко кодирую значения. Вы можете заполнить класс данными из базы данных, XML-файла и т. Д. В приведенном выше примере создается два экземпляра вашего класса myClassAddress. Он также создает список этих классов и добавляет каждый экземпляр в этот список. Теперь просто свяжите список с вашим контролем:

me.gridView1.datasource = myList
me.gridview1.bindData()

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

Другие вопросы по тегам