How to convert Gridview to Datatable

I am using GridView

in my application to populate data.

Is there an easy way to copy a gridview to a datatable?

Actually, in my GridView

one of the controls is a textbox.
So I can edit this control at any time ... I need the button to be clicked with all the changes I made in GridView

to copy into one datatable ...

I did it with code,

dt = CType(Session("tempTable"), DataTable) 
i = 0 For Each rows As GridViewRow In Grid1.Rows 
   Dim txt As TextBox 
   txt = CType(rows.FindControl("txt"), TextBox) 
   dt.Rows(i)(1) = txt.Text
   i = i + 1 
Next

      

Here I am looping through the grid using a for each loop.
I'm worried if this is affecting performance?
Can you please put me some other easy way to copy GridView

to datatable

+1


source to share


3 answers


html page looks like,

                            <asp:GridView ID="Grid1" runat="server" AutoGenerateColumns="False" GridLines="None">
                                <Columns>
                                    <asp:TemplateField HeaderText="ID">
                                        <ItemTemplate>
                                            <asp:Label ID="lbl1" runat="server" Text='<%#Bind("ID") %>' CssClass="rowHeader"></asp:Label>
                                        </ItemTemplate>
                                        <FooterTemplate>
                                            <asp:TextBox ID="txt1" runat="server" Text='<%#Bind("ID") %>'></asp:TextBox>
                                        </FooterTemplate>
                                    </asp:TemplateField>
                                    <asp:TemplateField HeaderText="Description">
                                        <ItemTemplate>
                                            <asp:TextBox ID="txt" runat="server" Text='<%#Bind("Description") %>'></asp:TextBox>
                                        </ItemTemplate>
                                        <FooterTemplate>
                                            <asp:TextBox ID="txt2" runat="server" Text='<%#Bind("Description") %>'></asp:TextBox>
                                        </FooterTemplate>
                                    </asp:TemplateField>
                                    <asp:TemplateField HeaderText="Comments">
                                        <ItemTemplate>
                                            <asp:Label ID="Comments" runat="server" Text='<%#Bind("Comments") %>'></asp:Label>
                                        </ItemTemplate>
                                        <FooterTemplate>
                                            <asp:DropDownList ID="Drop1" runat="server">
                                                <asp:ListItem>v1</asp:ListItem>
                                                <asp:ListItem>v2</asp:ListItem>
                                            </asp:DropDownList>
                                        </FooterTemplate>
                                    </asp:TemplateField>
                                </Columns>
                            </asp:GridView>

                            <asp:Button ID="btnAdd" runat="server" Text="Add" />
                            <asp:Button ID="btnSave" runat="server" Text="Save" />

      

on page load,

conn = New OleDb.OleDbConnection ("Provider = Microsoft.Jet.OLEDB.4.0; Data Source = D: \ GDD_Work \ Employee.mdb")

    If Not Page.IsPostBack Then

        ViewState("intCount") = 0
        Session("blnFlag") = False

        Dim Cmd As New OleDb.OleDbDataAdapter("Select * from Emp", conn)
        Cmd.Fill(ds, "Employee")

        Grid1.DataSource = ds.Tables("Employee")
        Grid1.DataBind()

        Session("intOldCount") = ds.Tables("Employee").Rows.Count
        Session("tempTable") = ds.Tables("Employee")

      

click the "Add" button,

If Session ("blnFlag") = False Then Session ("blnFlag") = True else getFooter () End If



    Grid1.FooterRow.Visible = True

      

click the "Save" button,

Dim intOldCount As Integer Dim intNewCount As Integer Dim dt As New DataTable Dim strQuery As String intOldCount = CType (session ("intOldCount"), integer) If Session ("blnFlag") = True Then

        getFooter()
        dt = CType(Session("tempTable"), DataTable)
        intNewCount = dt.Rows.Count

        If intOldCount = intNewCount Then
            Dim tx1 As TextBox
            Dim tx2 As TextBox
            Dim drp As DropDownList
            tx1 = CType(Grid1.FooterRow.FindControl("txt1"), TextBox)
            tx2 = CType(Grid1.FooterRow.FindControl("txt2"), TextBox)
            drp = CType(Grid1.FooterRow.FindControl("Drop1"), DropDownList)

            strQuery = "INSERT INTO Emp (ID,Description,Comments) values ('" + tx1.Text + "','" + tx2.Text + "','" + drp.SelectedValue + "')"
            Dim Cmd As New OleDb.OleDbCommand(strQuery, conn)
            conn.Open()
            Cmd.ExecuteNonQuery()
            conn.Close()

        Else
            For i = intOldCount To intNewCount - 1
                Dim strId As String
                Dim strDesc As String
                Dim strComm As String
                strId = dt.Rows(i)(0).ToString()
                strDesc = dt.Rows(i)(1).ToString()
                strComm = dt.Rows(i)(2).ToString()

                strQuery = "INSERT INTO Emp (ID,Description,Comments) values ('" + strId + "','" + strDesc + "','" + strComm + "')"
                Dim Cmd As New OleDb.OleDbCommand(strQuery, conn)
                conn.Open()
                Cmd.ExecuteNonQuery()
                conn.Close()
            Next
        End If

        For i = 0 To intOldCount - 1
            Dim strId As String
            Dim strDesc As String
            strId = dt.Rows(i)(0).ToString()
            strDesc = dt.Rows(i)(1).ToString()
            strQuery = "update Emp set Description = '" + strDesc + "' where ID = '" + strId + "'"

            Dim Cmd1 As New OleDb.OleDbCommand(strQuery, conn)
            conn.Open()
            Cmd1.ExecuteNonQuery()
            conn.Close()
        Next

        ds = New DataSet()
        Dim CmdData As New OleDb.OleDbDataAdapter("Select * from Emp", conn)
        CmdData.Fill(ds, "Employee")
        Grid1.DataSource = ds.Tables("Employee").DefaultView
        Grid1.DataBind()

        Session("blnFlag") = False
    Else
        dt = CType(Session("tempTable"), DataTable)
        i = 0
        For Each rows As GridViewRow In Grid1.Rows
            Dim txt As TextBox
            txt = CType(rows.FindControl("txt"), TextBox)
            dt.Rows(i)(1) = txt.Text
            i = i + 1
        Next
        Session("tempTable") = dt

        For i = 0 To intOldCount - 1
            Dim strId As String
            Dim strDesc As String
            strId = dt.Rows(i)(0).ToString()
            strDesc = dt.Rows(i)(1).ToString()
            strQuery = "update Emp set Description = '" + strDesc + "' where ID = '" + strId + "'"

            Dim Cmd1 As New OleDb.OleDbCommand(strQuery, conn)
            conn.Open()
            Cmd1.ExecuteNonQuery()
            conn.Close()
        Next

        Grid1.DataSource = dt.DefaultView
        Grid1.DataBind()

    End If

      

im using one function like

Public Function getFooter () Dim tx1 As TextBox Dim tx2 As TextBox Dim drp As DropDownList tx1 = CType (Grid1.FooterRow.FindControl ("txt1"), TextBox) tx2 = CType (Grid1.FooterRow.FindControl) ("txt2 ) drp = CType (Grid1.FooterRow.FindControl ("Drop1"), DropDownList)

    Dim dr As DataRow
    Dim dt As DataTable
    dt = CType(Session("tempTable"), DataTable)

    dr = dt.NewRow()
    dr("ID") = tx1.Text
    dr("Description") = tx2.Text
    dr("Comments") = drp.SelectedValue
    dt.Rows.Add(dr)

    i = 0
    For Each rows As GridViewRow In Grid1.Rows
        Dim txt As TextBox
        txt = CType(rows.FindControl("txt"), TextBox)
        dt.Rows(i)(1) = txt.Text
        i = i + 1
    Next

    Grid1.DataSource = dt.DefaultView
    Grid1.DataBind()

    Session("tempTable") = dt
End Function

      

0


source


The preferred way would be to use data binding. If you can manage to bind bidirectional data binding to work, your DataTable will be updated automatically.



Efficient, you will probably get the most speed from a dynamically created table where your textboxes have an ID that can be easily interpreted on postback and save changes without having a GridView to use the ViewState or restore state and trigger all events.

+1


source


how to edit data on gridview using dataset and data without datasource

+1


source







All Articles