Wie zu Bearbeiten datatable Zeilen in Gridview

und vielen Dank für die Anzeige meiner post. Momentan habe ich ein gridview-bevölkert von einer datatable in viewstate. Meine touble ist, ich bin nicht in der Lage zu Bearbeiten Sie die Zeilen. Ich zeige Ihnen den code unten, aber was passiert, wenn ich auf Bearbeiten klicken, wird das Textfeld in Zelle 2 leer ist, aber der text in Zelle 1 nicht. Hier ist der code, den ich habe, so weit, beginnend mit der Erstellung der Daten Tabelle:

GridView-markup:

<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()

"Dann fügen Sie eine Zeile hinzu mit einen Klick auf eine Schaltfläche in der gridview-Fußzeile:

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

Nun, hier ist, wo ich Probleme habe. Dieser code aktualisiert die Zeile Nummer (erste Spalte), aber tut nichts, um der zweiten Spalte. Es löscht tatsächlich den Inhalt.

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

Könnten Sie bitte mir helfen herauszufinden, wohin ich gehe falsch gemacht? Danke!

Josh

  • Bitte posten Sie Ihre grid-Ansicht-markup.
  • Vielen Dank für die Beantwortung. Ich habe gerade das gridview-code.
  • Wo ist dein <EditItemTemplate> Abschnitt in Ihrem <TemplateField> für TextBox1? Auch, wo sind Sie Erklärungen für die Bindung RowEditing Ereignis und RowUpdating Veranstaltung?
  • Ich bin nicht sehr erfahren mit gridview. Ich habe Visual Studio automatisch erstellen des gridview-Steuerelements Bearbeiten. Benötige ich für <EditItemTemplate> <asp:TextBox ID="TextBox1" Width="500 Pixel" TextMode="MultiLine" runat="server"></asp:TextBox> </EditItemTemplate> im <ItemTemplate - > - Abschnitt? Ich habe bereits TextBox1 in diesem Abschnitt. Ich habe die debug-code, und die rowediting und rowupdating Ereignisse ausgelöst wurden. Es würde zu aktualisieren, die rownumber-aber das ist es. Danke nochmal für Eure Hilfe!
  • Das ist seltsam, dass Visual Studio nicht Bearbeiten und aktualisieren von Ereignissen auf dem grid Ansicht-markup selbst, aber in jedem Fall die Ereignisse feuern. Ja, Sie brauchen, um einen EditItemTemplate für Ihre TemplateField. Dies erklärt, warum sind Sie nur immer die RowNumber Wert, weil Sie den anderen regler, den Sie suchen, nicht vorhanden ist, wenn Sie in "Bearbeiten". Ich poste den code, den Sie brauchen für Ihre grid-Ansicht.
Schreibe einen Kommentar