Как редактировать строки данных в Gridview
И спасибо за просмотр моего поста. В настоящее время у меня есть gridview, заполненный датабельным в viewstate. Мой двойник - я не могу редактировать строки. Я покажу вам код ниже, но когда я нажимаю кнопку "Изменить", текстовое поле в ячейке 2 становится пустым, а текст в ячейке 1 - нет. Вот код, который у меня есть, начиная с создания таблицы данных:
Разметка GridView:
<asp:GridView ID="GridView2" runat="server" Visible="False"
AutoGenerateColumns="false" ShowFooter="True"
AutoGenerateDeleteButton="True" AutoGenerateEditButton="True">
<Columns>
<asp:BoundField DataField="RowNumber" HeaderText="Row Number" />
<asp:TemplateField HeaderText="Action Item">
<ItemTemplate>
<asp:TextBox ID="TextBox1" Width="500px" TextMode="MultiLine" runat="server"></asp:TextBox>
</ItemTemplate>
<FooterTemplate>
<asp:Button ID="ButtonAdd" OnClick="ButtonAdd_Click" runat="server" Text="Add New Row" />
</FooterTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
'set initial dt :
Private Sub SetInitialRow()
Dim dt As New DataTable()
Dim dr As DataRow = Nothing
dt.Columns.Add(New DataColumn("RowNumber", GetType(String)))
dt.Columns.Add(New DataColumn("Action Item", GetType(String)))
dr = dt.NewRow()
dr("RowNumber") = 1
dr("Action Item") = String.Empty
dt.Rows.Add(dr)
'dr = dt.NewRow();
'Store the DataTable in ViewState
ViewState("CurrentTable") = dt
GridView2.DataSource = dt
GridView2.DataBind()
Затем я добавляю строку с помощью нажатия кнопки в нижнем колонтитуле gridview:
Private Sub AddNewRowToGrid()
Dim rowIndex As Integer = 0
If ViewState("CurrentTable") IsNot Nothing Then
Dim dtCurrentTable As DataTable = DirectCast(ViewState("CurrentTable"), DataTable)
Dim drCurrentRow As DataRow = Nothing
If dtCurrentTable.Rows.Count > 0 Then
For i As Integer = 1 To dtCurrentTable.Rows.Count
'extract the TextBox values
Dim box1 As TextBox = DirectCast(GridView2.Rows(rowIndex).Cells(1).FindControl("TextBox1"), TextBox)
drCurrentRow = dtCurrentTable.NewRow()
drCurrentRow("RowNumber") = i + 1
drCurrentRow("Action Item") = box1.Text
rowIndex += 1
Next
'add new row to DataTable
dtCurrentTable.Rows.Add(drCurrentRow)
'Store the current data to ViewState
ViewState("CurrentTable") = dtCurrentTable
'Rebind the Grid with the current data
GridView2.DataSource = dtCurrentTable
GridView2.DataBind()
End If
Else
Response.Write("ViewState is null")
End If
'Set Previous Data on Postbacks
SetPreviousData()
End Sub
Теперь вот где у меня проблемы. Этот код обновляет номер строки (первый столбец), но ничего не делает для второго столбца. Это фактически удаляет контент.
Protected Sub GridView2_RowEditing(sender As Object, e As System.Web.UI.WebControls.GridViewEditEventArgs) Handles GridView2.RowEditing
'Set the edit index.
Dim dt As DataTable = CType(ViewState("CurrentTable"), DataTable)
GridView2.EditIndex = e.NewEditIndex
GridView2.DataSource = ViewState("CurrentTable")
GridView2.DataBind()
End Sub
Protected Sub GridView2_RowUpdating(sender As Object, e As System.Web.UI.WebControls.GridViewUpdateEventArgs) Handles GridView2.RowUpdating
'Retrieve the table from the session object.
Dim dt As DataTable = CType(ViewState("CurrentTable"), DataTable)
'Update the values.
Dim row = GridView2.Rows(e.RowIndex)
dt.Rows(row.DataItemIndex)("RowNumber") = (CType((row.Cells(1).Controls(0)), TextBox)).Text
dt.Rows(row.DataItemIndex)("Action Item") = (CType((row.Cells(2).FindControl("TextBox1")), TextBox).Text)
'Reset the edit index.
GridView2.EditIndex = -1
'Bind data to the GridView control.
GridView2.DataSource = ViewState("CurrentTable")
GridView2.DataBind()
End Sub
Не могли бы вы помочь мне понять, где я иду не так? Спасибо!
мистифицировать
1 ответ
Вот разметка, вам нужно создать EditItemTemplate
в вашем TemplateField
:
<asp:GridView ID="GridView2" runat="server" Visible="False" AutoGenerateColumns="false"
ShowFooter="True"
AutoGenerateDeleteButton="True" AutoGenerateEditButton="True">
<Columns>
<asp:BoundField DataField="RowNumber" HeaderText="Row Number" />
<asp:TemplateField HeaderText="Action Item">
<ItemTemplate>
<asp:TextBox ID="TextBox1" Width="500px" TextMode="MultiLine" runat="server"></asp:TextBox>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox id="EditActionItemTextBox" runat="server" Width="500px" TextMode="MultiLine"></asp:TextBox>
</EditItemTemplate>
<FooterTemplate>
<asp:Button ID="ButtonAdd" OnClick="ButtonAdd_Click" runat="server" Text="Add New Row" />
</FooterTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Теперь в вашем коде, где вы обновляете свою таблицу данных, сделайте это:
'Update the values.
Dim row = GridView2.Rows(e.RowIndex)
dt.Rows(row.DataItemIndex)("RowNumber") = (CType((row.Cells(1).Controls(0)), TextBox)).Text
dt.Rows(row.DataItemIndex)("Action Item") = (CType((row.FindControl("EditActionItemTextBox")), TextBox).Text)
Примечание: в вашем <ItemTemplate>
Вы можете захотеть сделать элемент управления доступным только для чтения, чтобы пользователи знали, что они не могут изменить значение, обычно, когда пользователь видит текстовое поле, которое, по их мнению, может редактировать содержимое, но вполне разумно иметь редактируемое текстовое поле в режим редактирования вашего вида сетки. Чтобы изменить <ItemTemplate>
текстовое поле только для чтения, просто добавьте ReadOnly="True"
, как это:
<ItemTemplate>
<asp:TextBox ID="TextBox1" Width="500px" TextMode="MultiLine"
runat="server" ReadOnly="True"></asp:TextBox>
</ItemTemplate>
В зависимости от браузера элемент управления будет иметь слегка серый оттенок. Пользователь сможет нажать на текст, но не сможет изменить текст.