Как включить редактирование на месте в asp:GridView?

Как я могу добавить поля редактирования и прочитать их значения во время отправки, с asp:Repeater?


у меня есть asp:GridView который отображает доступный только для чтения (т.е. не редактируемый) набор данных, например:

Как я могу включить клетки GridView быть редактируемым, например (Photoshop Mockup):

Примечание: я не макетировал в Photoshop окно редактирования для каждой строки и столбца (потому что это занимало слишком много времени). Вы все еще поняли идею.

  • Как я могу убедить asp:GridView показать поле редактирования в каждой ячейке?
  • Если я убедить asp:GridView показать окно редактирования, как мне их "прочитать" OnClick кнопки Сохранить?

Бонус Болтовня

я не был бы против использования asp:Repeater, размещение вручную <INPUT> управления. Моя путаница заключается в том, как читать каждый ввод во время OnClick кнопки Сохранить. И хотя я был бы совершенно счастлив использовать ретранслятор, а GridView не смог бы выполнить то, что я хочу, сделав ретранслятор единственной возможностью, этот вопрос касается GridView.

  • Если GridView может это сделать: отлично; как?
  • Если GridView не может это сделать, это тоже ответ.

2 ответа

Вы пытались настроить EditIndex собственность DataGrid?

Пример:

<asp:GridView runat="server" onrowediting="grdProducts_RowEditing" 
    ID="grdProducts">
    <Columns>
        <asp:CommandField ShowEditButton="True" />
    </Columns>
</asp:GridView>

Код позади

    protected void grdProducts_RowEditing(object sender, GridViewEditEventArgs e)
    {
        this.grdProducts.EditIndex = e.NewEditIndex;
        This.BindGrid();
    }

Обратите внимание, что вы должны повторно связать свою сетку

Обычно вы сохраняете данные для каждой строки, что означает, что у вас есть ссылка для редактирования в каждой строке, а после входа в режим редактирования появляется кнопка сохранения и, при необходимости, кнопка отмены, которая позволит вам сохранить значения этой конкретной строки.

Следование этому подходу тривиально при использовании GridView:

    protected void grdProducts_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        // old values for the current row
        var oldValues = e.OldValues;

        // new (updated) values for the current row
        var newvalues = e.NewValues;

        // Exit edit mode
        this.grdProducts.EditIndex = -1;

        // Update the grid
        this.BindGrid();
    }

В разметке сетки просто добавьте следующее:

    onrowupdating="grdProducts_RowUpdating"

Если вам нужно указать пользовательские элементы управления при редактировании или при отображении данных ячейки в режиме только для чтения, используйте шаблоны сетки:

       <Columns>
        <asp:TemplateField HeaderText="Name">
            <EditItemTemplate>
                <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Name") %>'></asp:TextBox>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:Label ID="Label1" runat="server" Text='<%# Bind("Name") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
      </Columns>

Вы можете сделать это, используя GridView, но вы создадите довольно много кода, если у вас много столбцов.

Сначала сделайте все столбцы в GridView TemplateFields. В моем примере я буду использовать только один столбец. Вот так:

<asp:GridView ID="test" runat="server" AutoGenerateColumns="false">
    <Columns>
        <asp:TemplateField HeaderText="Foo" SortExpression="foo">
            <ItemTemplate>
                <asp:TextBox ID="FooText" runat="server" Text='<%# Eval("Foo") %>'></asp:TextBox>
            </ItemTemplate>
        </asp:TemplateField>
        <!-- other cols here -->
    </Columns>
</asp:GridView>
<asp:Button ID="Save" runat="server" Text="Save" OnClick="Save_Click" />

Затем в своем коде для кнопки Сохранить вы можете перебирать строки в GridView:

foreach (GridViewRow gvRow in test.Rows)
{
    string val = ((TextBox)gvRow.FindControl("FooText")).Text;
    <!-- other cols here -->
    //do something with all the values you have parsed from the row
}
Другие вопросы по тегам