[英]How to edit datatable rows in Gridview
並感謝您查看我的帖子。 我目前在viewstate中有一個數據表填充的gridview。 我的錯誤是我無法編輯行。 我將向您展示下面的代碼,但是當我單擊編輯時,單元格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
你能幫我弄清楚我哪里出錯嗎? 謝謝!
玩笑
以下是在TemplateField
創建EditItemTemplate
所需的標記:
<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>
根據瀏覽器的不同,控件會有輕微的灰色調。 用戶可以單擊文本,但無法更改文本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.