ASP.NET Gridview со всеми записями редактируемыми - PullRequest
2 голосов
/ 24 февраля 2009

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

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

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

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

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

Когда пользователь заканчивает создание своих ученических объектов, он переходит к другим делам. Но я просто не могу найти способ показывать записи таким образом. Использую ли я ListView (3.5), HTML-таблицу, gridview, повторитель и т. Д.?

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

Ответы [ 4 ]

4 голосов
/ 25 февраля 2009

Я был бы склонен использовать ListView лично для этого, так как вы можете вставить строки с ним. Ваш LayoutTemplate будет таблицей с

. Ваш 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)_;
}
1 голос
/ 25 февраля 2009

Да, это возможно. Это всего лишь пример кода того, что Виктор опубликовал.

            <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.
        }
    }

EDIT
Выше, где вы получите ваше редактирование данных. Вы можете работать с DataTables, DataViews, DataSets, и, как показывает другое решение, вы можете привязать свою сетку к списку вашего объекта. Это должно быть определено на основе модели объекта данных в вашей системе и того, как будут сгенерированы строки.

1 голос
/ 25 февраля 2009

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

public void BindGrid()
{
  // assume students is the name of your GridView control
  students.DataSource = (List<Student>)Session["StudentList"];
  students.DataBind();
}
1 голос
/ 25 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...