2008-11-27 8 views
1

J'utilise GridView dans mon application pour remplir les données.comment convertir Gridview à Datatable

Existe-t-il un moyen facile de copier un gridview à datatable?

En fait, dans mon GridView l'un des contrôles est textbox.
Je peux modifier ce contrôle à tout moment ... Ce que je besoin est sur le clic bouton tous les changements que je fait dans GridView a copier dans un datatable ...

Je l'ai fait en utilisant le 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 

Ici, je traverse la grille à l'aide de la boucle "pour chaque".
Je suis inquiet si cela affecte la performance?
Pouvez-vous me tel tout autre méthode simple pour copier un GridView à un datatable

Répondre

0

page HTML ressemblez,

      <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" /> 

sur chargement de la page,

conn = Nouveau 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") 

sur le bouton Ajouter clic,

Si session (" blnFlag ") = False Then session ("blnFlag") = Vrai Else getFooter() End If

Grid1.FooterRow.Visible = True 

sur bouton Enregistrer clic,

Dim intOldCount As Integer Dim intNewCount As Integer Dim dt As New DataTable Dim strQuery As String intOldCount = CType (Session ("intOldCount"), Entier) Si Session ("blnFlag") = Vrai Alors

 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 en utilisant une fonction similaire,

Fonction publique getFooter() Dim TX1 Comme TextBox Dim tx2 Comme TextBox Dim DRP Comme 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 
1

La façon préférable serait d'utiliser de liaison de données. Si vous parvenez à faire fonctionner la liaison de données bidirectionnelle, votre DataTable est automatiquement mis à jour. En termes de performances, vous obtiendrez probablement la meilleure vitesse d'une table générée dynamiquement où vos zones de texte ont un ID que vous pouvez interpréter facilement en postback et enregistrer vos modifications, sans avoir GridView pour utiliser ViewState ou restaurer son état et déclencher tous les événements.

+0

Salut Sergiu Damian je compris ce que vous avez dit ... mais je ne sais pas comment la obtenir des données d'une manière bidirectionnelle ... pouvez-vous me dire s'il vous plaît avec un exemple? – sona

+0

Vous pouvez lier des données à un GridView, vous pouvez modifier un enregistrement à la fois. Fondamentalement, après que chaque ligne a été éditée, elle doit être sauvegardée avant de pouvoir éditer une autre ligne. Un bon point de départ: http://msdn.microsoft.com/en-us/magazine/cc163933.aspx –

+0

salut ... Actuellement dans ma table im ayant 3 lignes .. de cette 1ère colonne est une zone de texte, donc je peux éditer toutes les trois lignes avant que le bouton sauvegarder ne clique ... le lien que vous envoyez est seulement pour éditer une ligne à la fois ... merci pour votre temps ... j'ai corrigé cela en utilisant deux sessions ... – sona

1

comment modifier des données sur l'aide gridview ensemble de données et datatable sans source de données

+0

J'ai donné le programme ci-dessus ... vérifier la réponse précédente ... nous pouvons éditer le gridview avec l'aide de sessions – sona

Questions connexes