views:

14902

answers:

3

Hi all

I am using GridView in my application for populating datas.

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

Actually, in my GridView one of the control is textbox.
So I can edit that control at any time... What I need is on the button click whatever changes I made in GridView has to copy in one datatable...

I did this using the 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 traversing through grid with the help of "for each" loop.
I am worrying whether it effects performance?
Can you please tel me any other simple method to copy a GridView to a datatable

+1  A: 

The preferable way would be to use data binding. If you manage to get bidirectional data binding to work, your DataTable is updated automatically.

Performance wise, you would probably get best speed out of a dynamically generated table where your textboxes have an Id that you can interpret easily on the postback and save your changes, without having the GridView to use ViewState or restore it's state and trigger all events.

Sergiu Damian
Hi Sergiu Damian i understood what you said...but i dont know how to to get data in a bidirectional way...can you please tell me with an example?
sona
You can Bind data to a GridView, you can edit one record at a time. Basically, after each row is edited, it has to be saved before being able to edit another row.A good starting point: http://msdn.microsoft.com/en-us/magazine/cc163933.aspx
Sergiu Damian
hi...Actualy in my table im having 3 rows..of that 1st column is a textbox ,so i can edit all the three rows before save button click... the link that you send is only for editing one row at a time... thanks for your time... i fixed this by using two sessions...
sona
What do you mean by using two sessions?
Sergiu Damian
on page load i have saved the original grid values to a session.and then on the click of save button, i have read the grid again and saved in another session, after that i compared the new session with old session. if any modification occured,then only that value will get saved in database.
sona
Hi did you have an example?
Angel Escobedo
i have sent one example to do this
sona
A: 

html page look 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")

on add button click,

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

    Grid1.FooterRow.Visible = True

on save button click,

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"), TextBox) 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
sona
+1  A: 

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

i have given the program above...check the previous answer...we can edit the gridview with the help of sessions
sona