ASP.NET Gridview с возможностью редактирования всех записей

Я думал, что это будет просто, но я уверен, что у меня много проблем с этим:

Название этого вопроса может ввести в заблуждение. Мне не нужно использовать сетку. На самом деле, я знаю, что GridView, вероятно, не подходит для этого. Я просто не знал, как еще назвать это. Но пока просто подумайте:

У меня есть очень простой класс под названием "Студент". Он имеет 4 свойства: int ID string FirstName string LastName string Email

Я хочу сохранить общую коллекцию из них в памяти (состояние сеанса): Список студентов;

Хорошо, теперь проблема: я хочу, чтобы пользователь создал столько объектов Student, сколько захочет. Для их отображения мне просто нужна какая-то простая таблица с тремя текстовыми полями в каждой строке. Я хотел бы, чтобы в каждой строке были текстовые поля без меток, чтобы любую запись можно было редактировать в любое время.

Когда пользователь завершает создание своих ученических объектов, он приступает к другим вещам. Но у меня просто не получается найти способ отображать записи таким образом. Могу ли я использовать ListView (3.5), таблицу html, gridview, повторитель и т. Д.?

Как бы ты это сделал?

Ответов (4)

Решение

Я был бы склонен использовать для этого ListView лично, поскольку с его помощью вы можете вставлять строки. Ваш LayoutTemplate будет таблицей с <tr runat = "server" ID = "itemPlaceHolder" /> в ней. Ваш ItemTemplate будет иметь ваш TextBox (и, по желанию, кнопку сохранения для каждой строки. Затем у вас может быть InsertItemTemplate, если вам также нужны вставки.

В любом месте страницы вы можете добавить кнопку для сохранения всех элементов, пройдя цикл по коллекции ListView.Item и вызвав ListView.Update (itemIndex, validate).

<asp:ListView runat="server" ID="lv" InsertItemPosition="LastItem" DataKeyNames="id">
<LayoutTemplate>
    <asp:LinkButton runat="server" OnClick="SaveAll" Text="Save All" />
    <table>
    <tr>
        <th>First Name</th>
        <th>Last Name</th>
        <th>Email</th>
    </tr>
    <tr runat="server" id="itemPlaceHolder" />
    </table>
    <asp:LinkButton runat="server" OnClick="SaveAll" Text="Save All" />
</LayoutTemplate>
<ItemTemplate>
    <tr>
        <td><asp:TextBox runat="server" ID="firstName" Text='<%#Bind("firstName") %>' /></td>
        <td><asp:TextBox runat="server" ID="firstName" Text='<%#Bind("lastName") %>' /></td>
        <td><asp:TextBox runat="server" ID="firstName" Text='<%#Bind("email") %>' /></td>
        <td><asp:LinkButton runat="server" CommandName="update" Text="Save" /></td>
    </tr>
</ItemTemplate>
<InsertItemTemplate>
    <tr>
        <td><asp:TextBox runat="server" ID="firstName" Text='<%#Bind("firstName") %>' /></td>
        <td><asp:TextBox runat="server" ID="firstName" Text='<%#Bind("lastName") %>' /></td>
        <td><asp:TextBox runat="server" ID="firstName" Text='<%#Bind("email") %>' /></td>
        <td><asp:LinkButton runat="server" CommandName="insert" Text="Save" /></td>
    </tr>
</InsertItemTemplate>
</asp:ListView>

protected void SaveAll(object sender, EventArgs e)
{
    lv.Items.ToList().ForEach(li => lv.UpdateItem(li.DataItemIndex, true)_;
}

Да, для этого можно использовать сетку. вы можете создать собственный шаблон для столбцов, чтобы они отображались в текстовом поле, а не в метке. затем вы можете захватить событие 'save' в цикле по строкам и обновить свои данные.

Gridview будет самым простым способом реализовать это. Вы можете использовать таблицу html, но когда пользователь захочет добавить больше пользователей, вам придется сделать гораздо больше. Создайте шаблон для gridview с вашими четырьмя свойствами (Id, FirstName, LastName, Email), а затем просто привяжите его к объекту сеанса, например:

public void BindGrid()
{
  // assume students is the name of your GridView control
  students.DataSource = (List<Student>)Session["StudentList"];
  students.DataBind();
}

Yes, this is possible. This is just a code sample for what Victor had posted.

            <asp:GridView ID="gvDetails" runat="server" AutoGenerateColumns="False" DataKeyNames="PartNumber" GridLines="Horizontal"
                ForeColor="#333333" CellPadding="4" Width="800" PageSize="20" OnDataBound="gvPartDetails_DataBound" OnSelectedIndexChanged="gvPartDetails_SelectedIndexChanged" OnSorting="gvPartDetails_Sorting">
                <Columns>
                    <asp:TemplateField HeaderText="#">
                        <ItemTemplate>
                            <asp:Label ID="lblNumber" runat="server" Text='<%# Bind("Number") %>' ToolTip='<%# Bind("Description") %>'></asp:Label>
                        </ItemTemplate>
                        <HeaderStyle Wrap="False" />
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="LOC 1">
                        <ItemTemplate>
                            <asp:TextBox ID="txt_Qty1" AutoPostBack="false" runat="server" MaxLength="5" Width="50" Text='<%# Bind("Qty1") %>'></asp:TextBox>
                        </ItemTemplate>
                        <HeaderStyle Wrap="False" />
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="LOC 2">
                        <ItemTemplate>
                            <asp:TextBox ID="txt_Qty2" AutoPostBack="false" runat="server" MaxLength="5" Width="50" Text='<%# Bind("Qty2") %>'></asp:TextBox>
                        </ItemTemplate>
                        <HeaderStyle Wrap="False" />
                    </asp:TemplateField>
                </Columns>

                <EmptyDataTemplate>
                    <span id="Empty">No Details For This Such and Such.</span>
                    <a href="javascript:showNewPartMPE();"><img src="Images/icons/table_add.png" style="border:0px" alt="Add New Part" /></a>
                </EmptyDataTemplate>

                <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
                <EditRowStyle BackColor="#999999" />
                <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
                <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
                <HeaderStyle BackColor="#284775" Font-Bold="True" ForeColor="White" HorizontalAlign="Left" />
                <AlternatingRowStyle BackColor="Gainsboro" ForeColor="#284775" />
            </asp:GridView>

А затем код ... это очень грубо ...

   private void ApplyChanges()
    {
        foreach (GridViewRow row in this.gvDetails.Rows)
        {
           //do something with cells and data objects
           //and then save add to list, save, etc.
        }
    }

РЕДАКТИРОВАТЬ
Выше вы можете редактировать данные. Вы можете работать с DataTables, DataViews, DataSets, и, как показывает другое решение, вы можете привязать свою сетку к списку вашего объекта. Это следует определять на основе объектной модели данных в вашей системе и того, как будут создаваться строки.