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ürTextBox1
? Auch, wo sind Sie Erklärungen für die BindungRowEditing
Ereignis undRowUpdating
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 IhreTemplateField
. Dies erklärt, warum sind Sie nur immer dieRowNumber
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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist das markup erstellen Sie einen
EditItemTemplate
innerhalb IhrerTemplateField
:Nun im code-behind, wo Sie aktualisieren Ihre Daten-Tabelle:
Hinweis: In Ihrem
<ItemTemplate>
möchten Sie vielleicht zu prüfen, wenn das Steuerelement schreibgeschützt, so dass die Benutzer wissen, Sie können den Wert nicht ändern, in der Regel, wenn ein Benutzer sieht ein text-box, die Sie denken, Sie können die Inhalte zu Bearbeiten, sondern es ganz sinnvoll ist, ein editierbares Textfeld im Bearbeitungsmodus Ihrer grid-Ansicht. Ändern der<ItemTemplate>
Textfeld zu Lesen-nur, fügen Sie einfachReadOnly="True"
wie diese:Je nach browser, wird das Steuerelement haben eine leichte graue Tönung, um es. Die Benutzer werden in der Lage, klicken Sie auf den text, aber nicht in der Lage, den text zu ändern.