2

我认为这很简单,但我确实在这样做时遇到了很多麻烦:

这个问题的标题可能有点误导。我不必使用网格视图。事实上,我知道 GridView 可能不是这样做的方法。我只是不知道如何命名它。但是,现在只考虑:

我有一个非常简单的类,叫做 Student。它有 4 个属性: int ID string FirstName string LastName string Email

我想在内存中保留这些的通用集合(会话状态):列出学生;

好的,现在的问题是:我希望用户根据需要创建尽可能多的学生对象。为了显示这些,我只想要一个简单的表格,每行有 3 个文本框。我希望每一行都有标签的文本框,以便可以随时编辑任何记录。

当用户完成创建他们的学生对象后,他们会继续做其他事情。但是,我只是很难找到一种以这种方式显示记录的方法。我是否使用 ListView(3.5)、html 表格、gridview、repeater 等?

你会怎么做?

4

4 回答 4

4

我个人倾向于使用 ListView,因为你可以用它插入 Rows。您的 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)_;
}
于 2009-02-24T21:14:16.153 回答
1

是的,您可以使用网格视图来执行此操作。您可以为列创建自定义模板,以便它们显示在文本框中而不是标签中。然后,您可以通过行捕获“保存”事件并更新数据。

于 2009-02-24T21:01:40.007 回答
1

是的,这是可能的。这只是 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,并且正如其他解决方案所示,您可以将网格绑定到对象列表。这应该根据系统中的数据对象模型以及如何生成行来确定。

于 2009-02-24T21:06:10.713 回答
1

Gridview 将是实现这一点的最简单方法。您可以使用 html 表格,但是当用户想要添加更多用户时,您将不得不做更多的事情。使用您的四个属性(Id、FirstName、LastName、Email)为 gridview 创建一个模板,然后从会话对象中绑定它,例如:

public void BindGrid()
{
  // assume students is the name of your GridView control
  students.DataSource = (List<Student>)Session["StudentList"];
  students.DataBind();
}
于 2009-02-24T21:08:56.433 回答