ASP.NET Gridview с возможностью редактирования всех записей
Я думал, что это будет просто, но я уверен, что у меня много проблем с этим:
Название этого вопроса может ввести в заблуждение. Мне не нужно использовать сетку. На самом деле, я знаю, что GridView, вероятно, не подходит для этого. Я просто не знал, как еще назвать это. Но пока просто подумайте:
У меня есть очень простой класс под названием "Студент". Он имеет 4 свойства: int ID string FirstName string LastName string Email
Я хочу сохранить общую коллекцию из них в памяти (состояние сеанса): Список студентов;
Хорошо, теперь проблема: я хочу, чтобы пользователь создал столько объектов Student, сколько захочет. Для их отображения мне просто нужна какая-то простая таблица с тремя текстовыми полями в каждой строке. Я хотел бы, чтобы в каждой строке были текстовые поля без меток, чтобы любую запись можно было редактировать в любое время.
Когда пользователь завершает создание своих ученических объектов, он приступает к другим вещам. Но у меня просто не получается найти способ отображать записи таким образом. Могу ли я использовать ListView (3.5), таблицу html, gridview, повторитель и т. Д.?
Как бы ты это сделал?
Ответов (4)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)_;
}
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, и, как показывает другое решение, вы можете привязать свою сетку к списку вашего объекта. Это следует определять на основе объектной модели данных в вашей системе и того, как будут создаваться строки.