【问题标题】:How to edit datatable rows in Gridview如何在 Gridview 中编辑数据表行
【发布时间】:2013-08-29 14:36:24
【问题描述】:

感谢您查看我的帖子。我目前有一个由视图状态中的数据表填充的网格视图。我的问题是我无法编辑行。我将向您展示下面的代码,但是当我单击编辑时会发生什么,单元格 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

你能帮我弄清楚我哪里出错了吗?谢谢!

乔什

【问题讨论】:

  • 请发布您的网格视图标记。
  • 感谢您的回复。我刚刚添加了gridview代码。
  • &lt;EditItemTemplate&gt;&lt;TemplateField&gt; 中的TextBox1 部分在哪里?另外,你在哪里声明绑定RowEditing事件和RowUpdating事件?
  • 我对 gridview 不是很有经验。我使用 Visual Studio 自动创建 gridview 编辑。我需要在 部分中放置 吗?我已经在该部分中有 TextBox1 。我确实调试了代码,并且触发了 rowediting 和 rowupdating 事件。它会更新行号,但就是这样。再次感谢您的帮助!
  • 奇怪的是,Visual Studio 没有将编辑和更新事件放在网格视图标记本身上,但不管你的事件是什么情况。是的,您的TemplateField 需要有一个EditItemTemplate。这解释了为什么您只获得 RowNumber 值,因为“编辑”时您要查找的其他控件不存在。我将发布您的网格视图所需的代码。

标签: vb.net gridview datatable viewstate


【解决方案1】:

这是您在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)

注意:在您的&lt;ItemTemplate&gt; 中,您可能需要考虑将控件设置为只读,以便您的用户知道他们无法更改值,通常当用户看到他们认为可以编辑内容的文本框时,但它在网格视图的编辑模式下拥有一个可编辑的文本框是完全有意义的。要将&lt;ItemTemplate&gt; 文本框更改为只读,只需添加ReadOnly="True",如下所示:

<ItemTemplate>
    <asp:TextBox ID="TextBox1" Width="500px" TextMode="MultiLine" 
                 runat="server" ReadOnly="True"></asp:TextBox>
</ItemTemplate>

根据浏览器的不同,控件会有轻微的灰色调。用户将能够点击文本,但无法更改文本。

【讨论】:

  • 谢谢。我实际上将它放在他们将在文本框中输入的位置。然后用户单击“添加新行”按钮以在下面添加一个带有空白文本框的行。但是,如果用户需要返回并编辑上述文本框之一,他们应该能够这样做。我尝试了代码,但不幸的是,我仍然遇到同样的问题。单击编辑按钮后,“操作项”文本框将变为空白(可能会丢失数据表源)。但是,我仍然可以编辑行号字段。这很奇怪。注意:在我实际单击更新按钮之前,textbox1 字段变为空白。再次感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-30
  • 2020-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多