ASP.NET的GridView的所有记录编辑
我想这将是简单的,但我肯定是有很多的麻烦这样做:ASP.NET的GridView的所有记录编辑
这个问题的标题可能有点误导。我不必使用gridview。事实上,我知道GridView可能不是这样做的。我只是不知道该怎么称呼它。但是,现在只考虑:
我有一个非常简单的类叫学生。它有4个属性: INT ID 串名字 串名字 串电子邮件
我想保持这些泛型集合在内存中(会话状态): 名单的学生;
好吧,现在的问题: 我希望用户创建尽可能多的这些学生对象,因为他们想要的。为了显示这些,我只想要一个简单的表格,每行有3个文本框。我希望每行都有标签的文本框,以便任何时候都可以编辑任何记录。
当用户完成创建他们的学生对象时,他们继续做其他事情。但是,我只是无法找到一种以这种方式显示记录的方法。我使用ListView(3.5),html表格,gridview,中继器等?
你会怎么做?
我会倾向于亲自使用ListView为此,因为你可以插入行。你的LayoutTemplate将是一个表格,里面有一个< tr runat =“server”ID =“itemPlaceHolder”/ >。你的ItemTemplate会有你的文本框(每行有一个可选的保存按钮,如果你还需要插入的话,你可以有一个InsertItemTemplate)
页面上任何地方都可以添加一个按钮来保存所有项目.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'事件循环并更新数据。
是的,这是可能的。这只是Victor发布的代码示例。
<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,并且如其他解决方案所示,您可以将网格绑定到对象列表。这应该根据系统中的数据对象模型以及如何生成行来确定。
Gridview将是实现这个最简单的方法。你可能使用html表格,但是当用户想要添加更多的用户时,你将不得不做更多的事情。与四个属性(ID,名字,姓氏,电子邮件),然后就从会话对象像绑定它创建为GridView的模板:
public void BindGrid()
{
// assume students is the name of your GridView control
students.DataSource = (List<Student>)Session["StudentList"];
students.DataBind();
}
感谢您发布示例代码。我没有试图从我的手机上这样做。 – Victor 2009-02-24 21:39:16