2008-11-27 112 views
1

我在我的應用程序中使用GridView來填充數據。如何將Gridview轉換爲Datatable

有沒有簡單的方法將gridview複製到數據表?

其實,在我的GridView其中一個控件是文本框。
這樣我就可以隨時編輯控制...我需要的是在按鈕上點擊任何改變我GridView取得了在一個數據表複製......

我這樣做是使用代碼,

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 

在這裏,我通過「每個」循環遍歷網格。
我很擔心它是否會影響性能?
您可以請給我電話任何其他簡單的方法將GridView複製到數據表

回答

0

HTML頁面的樣子,

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

在頁面加載,

康恩=新OleDb.OleDbConnection(「供應商= Microsoft.Jet.OLEDB.4.0;數據源= 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") 

添加按鈕點擊,

如果會議(」 blnFlag「)= false,那麼 會議( 「blnFlag」)= TRUE 否則 getFooter() 結束如果

Grid1.FooterRow.Visible = True 

上保存按鈕點擊,

昏暗intOldCount作爲整數 昏暗intNewCount作爲整數 昏暗DT作爲新的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 

使用一個函數等,

公共功能getFooter() 昏暗TX1作爲文本框 昏暗TX2作爲文本框 昏暗DRP IM作爲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

最好的方法是使用數據綁定。如果您設法讓雙向數據綁定起作用,那麼您的DataTable會自動更新。性能明智,你可能會獲得動態生成表格的最佳速度,其中你的文本框有一個Id,你可以在回發中輕鬆地解釋並保存更改,而不需要GridView使用ViewState或恢復它的狀態和觸發所有事件。

+0

喜的Sergiu達米安 我明白你說...但我不知道如何來以雙向方式獲取數據... 請問您可以舉個例子嗎? – sona 2008-12-01 10:11:01

+0

您可以將數據綁定到GridView,您可以一次編輯一條記錄。基本上,在編輯每行之後,必須先保存才能編輯另一行。 一個很好的起點:http://msdn.microsoft.com/en-us/magazine/cc163933.aspx – 2008-12-02 13:54:39

1

如何在不修改數據源使用DataSet和DataTable的GridView的數據