Greetings ,
I follow this article
it works nice, But the values which coming from gridView always is null
Issue #1: when I press the button to add new row , the text which I wrote in the previous row disappears. so I have to write it again.
Issue #2: gridview saved null value in the DB.
here's my code:
<form id="form1" runat="server" >
<asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager>
<fieldset>
<div class="form-group">
<asp:gridview ID="Gridview1" runat="server" ShowFooter="true" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="RowNumber" HeaderText="Row Number" />
<asp:TemplateField HeaderText="Header 1">
<ItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" TextMode="MultiLine" ></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Header 2">
<ItemTemplate>
<asp:TextBox ID="TextBox2" runat="server" TextMode="MultiLine" ></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Header 3">
<ItemTemplate>
<asp:TextBox ID="TextBox3" runat="server" TextMode="MultiLine" ></asp:TextBox>
</ItemTemplate>
<FooterStyle HorizontalAlign="Right" />
<FooterTemplate>
<asp:Button ID="ButtonAdd" runat="server" Text="Add New Row" class="btn btn-success" OnClick="ButtonAdd_Click"/>
</FooterTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</div>
<asp:Button class="btn btn-success" id="btn1" Text="Save" runat="server" ValidationGroup="problem"></asp:Button>
</fieldset>
</form>
Private Sub SetInitialRow()
Dim dt As New DataTable()
Dim dr As DataRow = Nothing
Dim rowNumber As DataColumn = New DataColumn("rowNumber")
rowNumber.DataType = System.Type.GetType("System.String")
dt.Columns.Add(rowNumber)
Dim column1 As DataColumn = New DataColumn("column1")
column1.DataType = System.Type.GetType("System.String")
dt.Columns.Add(column1)
Dim column2 As DataColumn = New DataColumn("column2")
column2.DataType = System.Type.GetType("System.String")
dt.Columns.Add(column2)
Dim column3 As DataColumn = New DataColumn("column3")
column3.DataType = System.Type.GetType("System.String")
dt.Columns.Add(column3)
Dim column4 As DataColumn = New DataColumn("column4")
column4.DataType = System.Type.GetType("System.String")
dt.Columns.Add(column4)
dr = dt.NewRow()
' Set values in the columns:
dr("rowNumber") = 1
dr("column1") = String.Empty
dr("column2") = String.Empty
dr("column3") = String.Empty
dr("column4") = String.Empty
' Add the row to the rows collection.
dt.Rows.Add(dr)
'save the table to viewState
ViewState("currentTable") = dt
'bind the datatable to the gridView
Gridview1.DataSource = dt
Gridview1.DataBind()
End Sub
Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
If Not Me.IsPostBack Then
SetInitialRow()
End If
End Sub
Private Sub AddNewRowToGrid()
Dim rowIndex As Integer = 0
If ViewState("currentTable") IsNot Nothing Then
Dim dtCurrentTable As New DataTable
dtCurrentTable = TryCast(ViewState("currentTable"), DataTable)
Dim drCurrentRow As DataRow
drCurrentRow = Nothing
If dtCurrentTable.Rows.Count > 0 Then
For i As Integer = 1 To dtCurrentTable.Rows.Count
' extract the TextBox values
Dim box1 As TextBox = TryCast(Gridview1.Rows(rowIndex).Cells(1).FindControl("textbox1"), TextBox)
Dim box2 As TextBox = TryCast(Gridview1.Rows(rowIndex).Cells(2).FindControl("textbox2"), TextBox)
Dim box3 As TextBox = TryCast(Gridview1.Rows(rowIndex).Cells(3).FindControl("textbox3"), TextBox)
Dim box4 As TextBox = TryCast(Gridview1.Rows(rowIndex).Cells(4).FindControl("textbox4"), TextBox)
drCurrentRow = dtCurrentTable.NewRow()
drCurrentRow("rowNumber") = i + 1
dtCurrentTable.Rows(i - 1)("column1") = box1.Text
dtCurrentTable.Rows(i - 1)("column2") = box2.Text
dtCurrentTable.Rows(i - 1)("column3") = box3.Text
dtCurrentTable.Rows(i - 1)("column4") = box4.Text
Next
dtCurrentTable.Rows.Add(drCurrentRow)
ViewState("currentTable") = dtCurrentTable
Gridview1.DataSource = dtCurrentTable
Gridview1.DataBind()
Else
Response.Write("ViewState is null")
End If
'Set Previous Data on Postbacks
SetPreviousData()
End If
End Sub
Private Sub SetPreviousData()
Dim rowIndex As Integer = 0
If ViewState("currentTable") IsNot Nothing Then ' edit from <> to isnot --4-3-2019
Dim dt As New DataTable()
dt = TryCast(ViewState("currentTable"), DataTable)
If dt.Rows.Count > 0 Then
For i As Integer = 0 To dt.Rows.Count - 1 'edit add '-1'
Dim box1 As TextBox = TryCast(Gridview1.Rows(rowIndex).Cells(1).FindControl("textbox1"), TextBox)
Dim box2 As TextBox = TryCast(Gridview1.Rows(rowIndex).Cells(2).FindControl("textbox2"), TextBox)
Dim box3 As TextBox = TryCast(Gridview1.Rows(rowIndex).Cells(3).FindControl("textbox3"), TextBox)
Dim box4 As TextBox = TryCast(Gridview1.Rows(rowIndex).Cells(4).FindControl("textbox4"), TextBox)
box1.Text = dt.Rows(i)("column1").ToString()
box2.Text = dt.Rows(i)("column2").ToString()
box3.Text = dt.Rows(i)("column3").ToString()
box4.Text = dt.Rows(i)("column4").ToString()
Next
End If
End If
End Sub
Protected Sub ButtonAdd_Click(sender As Object, e As System.EventArgs)
AddNewRowToGrid()
End Sub
Protected Sub btn1_Click(sender As Object, e As System.EventArgs) Handles btn1.Click
Dim acc1 As New accident()
If ViewState("currentTable") IsNot Nothing Then
Dim dt As New DataTable()
dt = TryCast(ViewState("currentTable"), DataTable)
If dt.Rows.Count > 0 Then
For Each row As GridViewRow In Gridview1.Rows
Dim box1 As String = row.Cells(1).Text
Dim box2 As String = row.Cells(2).Text
Dim box3 As String = row.Cells(3).Text
acc1.save(box1, box2, box3)
success_msg.Text = "your data has been saved"
Next
End If
End If
End Sub
accident is a class has the following function
Public Function save(ByVal p_cont_cd As String, ByRef p_damageDesc As String, ByRef p_proc_taken As String) As String
Dim cmd As New SqlCommand
cmd.Connection = conn
cmd.CommandText = "sp_testInsert" '
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("@p_CntNumber", SqlDbType.VarChar).Value = p_cont_cd
cmd.Parameters.Add("@p_damageDesc", SqlDbType.VarChar).Value = p_damageDesc
cmd.Parameters.Add("@p_proc_taken", SqlDbType.VarChar).Value = p_proc_taken
Try
If conn.State = ConnectionState.Closed Then
conn.Open()
End If
Return cmd.ExecuteNonQuery()
conn.Close()
Catch oErr As Exception
Throw oErr
End Try
End Function
what shoul I do to fix this ?
Thanks in advance, :)