Как включить редактирование на месте в 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
}