Usando dados temporários no ASP.NET GridView
Crie uma página de teste com um Gridview usando apenas dados temporários no ASP.NET
Autor
Então, você pode ter se encontrado com a necessidade de usar um DataGrid, mas não queria atualizar continuamente seu banco de dados com todas as alterações feitas.
Felizmente, você pode armazenar todos esses dados na sessão adicionar / remover linhas e passá-lo entre o Cliente e o Servidor sem tocar no banco de dados.
Eu não aprofundarei muito na ciência, há artigos no MSDN para coisas assim.Antes de tudo, carregue um novo formulário web e você precisará adicionar um DropDownList, GridView e dois botões, um como um upload fino para DB e outro para adicionar o usuário ao nosso GridView.
Eu executei tudo isso no meu sistema, então o código deve copiar e colar diretamente, tente adicionar cada seção para que você possa ver como você o constrói.
HTML
<div>
<asp:DropDownList ID="UserAvailable" runat="server" Width="200px">
<asp:ListItem Text="Gavin Clayton" Value="1"><asp:ListItem>
<asp:ListItem Text="Sai Gangu" Value="2"><asp:ListItem>
<asp:ListItem Text="Mervin Pereira" Value="3"><asp:ListItem>
<asp:DropDownList>
<asp:Button ID="AddUser" runat="server" Text="Add User" />
<div>
<div>
<asp:GridView ID="UsersForSignOffList" runat="server" AutoGenerateColumns="False" DataKeyNames="ID" GridLines="None" BorderStyle="None" CssClass="DocsGrid">
<AlternatingRowStyle CssClass="alt" />
<Columns>
<asp:BoundField DataField="UserName" HeaderText="Name" SortExpression="UserName" />
<asp:CommandField ShowDeleteButton="True">
<ItemStyle Width="125px" />
<asp:CommandField>
<Columns>
<HeaderStyle BackColor="#CCCCCC" />
<RowStyle CssClass="Grid" />
<asp:GridView>
<div>
<div>
<asp:Button ID="UploadTable" runat="server" Text="Upload" />
<div>
<asp:DropDownList ID="UserAvailable" runat="server" Width="200px">
<asp:ListItem Text="Gavin Clayton" Value="1"><asp:ListItem>
<asp:ListItem Text="Sai Gangu" Value="2"><asp:ListItem>
<asp:ListItem Text="Mervin Pereira" Value="3"><asp:ListItem>
<asp:DropDownList>
<asp:Button ID="AddUser" runat="server" Text="Add User" />
<div>
<div>
<asp:GridView ID="UsersForSignOffList" runat="server" AutoGenerateColumns="False" DataKeyNames="ID" GridLines="None" BorderStyle="None" CssClass="DocsGrid">
<AlternatingRowStyle CssClass="alt" />
<Columns>
<asp:BoundField DataField="UserName" HeaderText="Name" SortExpression="UserName" />
<asp:CommandField ShowDeleteButton="True">
<ItemStyle Width="125px" />
<asp:CommandField>
<Columns>
<HeaderStyle BackColor="#CCCCCC" />
<RowStyle CssClass="Grid" />
<asp:GridView>
<div>
<div>
<asp:Button ID="UploadTable" runat="server" Text="Upload" />
<div>
Autor
Primeiro, declaramos a tabela, chamaremos isso de carga na página
VB
Private Function CreateTable() As DataTable
'Add a user column
Dim dt As DataTable = New DataTable
Dim column As DataColumn
column = New DataColumn()
column.DataType = System.Type.GetType("System.Int32")
column.ColumnName = "UserID"
column.ReadOnly = False
column.Unique = True
dt.Columns.Add(column)
'add a user name column
column = New DataColumn()
column.DataType = System.Type.GetType("System.String")
column.ColumnName = "UserName"
column.ReadOnly = False
column.Unique = False
dt.Columns.Add(column)
'Add a unique column with its own unique id (for delete function)
column = New DataColumn()
column.DataType = System.Type.GetType("System.Int32")
column.ColumnName = "ID"
column.ReadOnly = False
column.Unique = True
column.AutoIncrement = True
column.AutoIncrementSeed = 1
dt.Columns.Add(column)
'add primary key (first key) on column ID
Dim PrimaryKeyColumns(0) As DataColumn
PrimaryKeyColumns(0) = dt.Columns("ID")
dt.PrimaryKey = PrimaryKeyColumns
Return dt
End Function
'Add a user column
Dim dt As DataTable = New DataTable
Dim column As DataColumn
column = New DataColumn()
column.DataType = System.Type.GetType("System.Int32")
column.ColumnName = "UserID"
column.ReadOnly = False
column.Unique = True
dt.Columns.Add(column)
'add a user name column
column = New DataColumn()
column.DataType = System.Type.GetType("System.String")
column.ColumnName = "UserName"
column.ReadOnly = False
column.Unique = False
dt.Columns.Add(column)
'Add a unique column with its own unique id (for delete function)
column = New DataColumn()
column.DataType = System.Type.GetType("System.Int32")
column.ColumnName = "ID"
column.ReadOnly = False
column.Unique = True
column.AutoIncrement = True
column.AutoIncrementSeed = 1
dt.Columns.Add(column)
'add primary key (first key) on column ID
Dim PrimaryKeyColumns(0) As DataColumn
PrimaryKeyColumns(0) = dt.Columns("ID")
dt.PrimaryKey = PrimaryKeyColumns
Return dt
End Function
Autor
Agora, adicionamos uma função para adicionar novos valores à nossa tabela temporária e devolvê-la
VB
Private Function AddDataToTable(ByVal UserID As Int32, ByVal UserName As String, ByVal myTable As DataTable) As DataTable
Try
Dim row As DataRow
row = myTable.NewRow()
row("UserID") = UserID
row("UserName") = UserName
myTable.Rows.Add(row)
Return myTable
Catch
Return myTable
End Try
End Function
Try
Dim row As DataRow
row = myTable.NewRow()
row("UserID") = UserID
row("UserName") = UserName
myTable.Rows.Add(row)
Return myTable
Catch
Return myTable
End Try
End Function
Autor
Em seguida, temos um sub para lidar com o clique do AddUser, que chamará a função acima e retornará a tabela temporária à sessão e bing os dados para a nossa tabela novamente.
VB
Protected Sub Add_Click(sender As Object, e As System.EventArgs) Handles AddUser.Click
AddDataToTable(UserAvailable.Items.FindByValue(UserAvailable.SelectedValue).Value, UserAvailable.Items.FindByValue(UserAvailable.SelectedValue).Text.ToString, CType(Session("myDatatable"),DataTable))
UserTable.DataSource = (CType(Session("myDatatable"), DataTable)).DefaultView
UserTable.DataBind()
End
AddDataToTable(UserAvailable.Items.FindByValue(UserAvailable.SelectedValue).Value, UserAvailable.Items.FindByValue(UserAvailable.SelectedValue).Text.ToString, CType(Session("myDatatable"),DataTable))
UserTable.DataSource = (CType(Session("myDatatable"), DataTable)).DefaultView
UserTable.DataBind()
End
Autor
Adicionamos a capacidade dos usuários de excluir linhas, por isso precisamos adicionar esta função, que removerá a linha necessária e retornará a tabela.
VB
Private Function DelDataFromTable(ByVal RowID As Int32, ByVal myTable As DataTable) As DataTable
Dim r As DataRow = myTable.Rows.Find(RowID)
myTable.Rows.Remove(r)
Return myTable
End Function
Dim r As DataRow = myTable.Rows.Find(RowID)
myTable.Rows.Remove(r)
Return myTable
End Function
Autor
Agora, precisamos de um Sub ligado ao comando RowDeleting no UserTable, que chamará a função Delete e re-bind nossos dados.
VB
Protected Sub UsersForSignOffList_RowDeleting(sender As Object, e AsSystem.Web.UI.WebControls.GridViewDeleteEventArgs) Handles UserTable.RowDeleting
Dim Id As Integer = e.Keys(0).ToString
DelDataFromTable(Id, CType(Session("myDatatable"), DataTable))
UserTable.DataSource = (CType(Session("myDatatable"), DataTable)).DefaultView
UserTable.DataBind()
End Sub
Dim Id As Integer = e.Keys(0).ToString
DelDataFromTable(Id, CType(Session("myDatatable"), DataTable))
UserTable.DataSource = (CType(Session("myDatatable"), DataTable)).DefaultView
UserTable.DataBind()
End Sub
Autor
Assim, colocamos as funções e os processos para atualizar a tabela da entrada do usuário e devolvê-los, então agora precisamos lidar com a entrada e saída final da nossa tabela. Para fazer isso, vamos vincular um sub ao evento Pre-Render da página e chamar algumas das funções acima, e outro que irá processar os usuários neste caso uma tabela fofa.
VB
'Dim UserID As String 'If adding a default user
'Dim UserName As String 'If adding a default user
'Dim con As New SqlConnection({yourconnection}) 'Handle our SQL Connection here
Private Sub Page_Load() Handles Me.PreRender
If Not IsPostBack Then
GetUsers()
Dim mydt = New DataTable()
mydt = CreateTable()
Session("myDatatable") = mydt
'AddDataToTable(UserID, UserName, CType(Session("myDatatable"), DataTable)) ' If adding a default user
UsersForSignOffList.DataSource = (CType(Session("myDatatable"), DataTable)).DefaultView
UsersForSignOffList.DataBind()
End If
End Sub
Private Sub AddUsersToTable() Handles UploadTable.Click
Dim AddUser As New SqlCommand
'AddUser.Connection = con 'You will also need to open and close your connection in here
Dim dt As DataTable = CType(Session("myDatatable"), DataTable)
Dim dr As DataRow
For i = 0 To dt.Rows.Count - 1
dr = dt.Rows(i)
AddUser.CommandText = "INSERT INTO LinkedUsers(UserID) " & _
"SELECT " & dr.Item(0).ToString() & ""
AddUser.ExecuteNonQuery()
Next
End Sub
'Dim UserName As String 'If adding a default user
'Dim con As New SqlConnection({yourconnection}) 'Handle our SQL Connection here
Private Sub Page_Load() Handles Me.PreRender
If Not IsPostBack Then
GetUsers()
Dim mydt = New DataTable()
mydt = CreateTable()
Session("myDatatable") = mydt
'AddDataToTable(UserID, UserName, CType(Session("myDatatable"), DataTable)) ' If adding a default user
UsersForSignOffList.DataSource = (CType(Session("myDatatable"), DataTable)).DefaultView
UsersForSignOffList.DataBind()
End If
End Sub
Private Sub AddUsersToTable() Handles UploadTable.Click
Dim AddUser As New SqlCommand
'AddUser.Connection = con 'You will also need to open and close your connection in here
Dim dt As DataTable = CType(Session("myDatatable"), DataTable)
Dim dr As DataRow
For i = 0 To dt.Rows.Count - 1
dr = dt.Rows(i)
AddUser.CommandText = "INSERT INTO LinkedUsers(UserID) " & _
"SELECT " & dr.Item(0).ToString() & ""
AddUser.ExecuteNonQuery()
Next
End Sub
Autor
A única parte perdida acima é a facilidade de vincular o menu suspenso UsuáriosAventáveis a um banco de dados (o fizemos manualmente), usando um comando SQL falso eu mostrei isso abaixo, no entanto, para a página comentou.
VB
Private Sub GetUsers()
'Dim com As New SqlCommand("SELECT * FROM Users", con)
'Dim tr = com.ExecuteReader
'UserAvailable.DataSource = tr
'UserAvailable.DataTextField = "UserName"
'UserAvailable.DataValueField = "UserID"
'UserAvailable.DataBind()
'tr.Close()
End Sub
'Dim com As New SqlCommand("SELECT * FROM Users", con)
'Dim tr = com.ExecuteReader
'UserAvailable.DataSource = tr
'UserAvailable.DataTextField = "UserName"
'UserAvailable.DataValueField = "UserID"
'UserAvailable.DataBind()
'tr.Close()
End Sub
Autor
Eu sempre achei que era mais fácil aprender simplesmente fazendo uma peça, então experimente as suas máquinas e veja o quanto você pode levá-lo. A única coisa a lembrar aqui é que, se houver uma enorme quantidade de dados, pode ser mais fácil apenas se ligar ao banco de dados, pois isso deve reduzir o tamanho da sua página e usar menos memória no servidor.