Uso de datos temporales en ASP.NET GridView
Generar una página de prueba con un GridView utilizando sólo datos temporales en ASP.NET
Autor
Así que puede haber encontrado la necesidad de utilizar un DataGrid, pero no quería actualizar continuamente su base de datos con cada cambio realizado.
Por suerte, puede almacenar todos estos datos en la sesión agregar / quitar filas, y pasarlo entre el cliente y el servidor sin tocar la base de datos.
No voy a profundizar mucho en la ciencia, hay artículos sobre MSDN para cosas como esa.En primer lugar, cargar un nuevo formulario web y tendrá que agregar un DropDownList, GridView, y dos botones, uno como una carga de farsa a DB y otro para agregar el usuario a nuestro GridView.
He ejecutado todo esto en mi sistema, por lo que el código debe copiar y pegar directamente, intente agregar cada sección para que pueda ver cómo se construye.
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
Primero declaramos la tabla, lo llamaremos en carga de 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
Ahora añadimos una función para agregar nuevos valores a nuestra tabla temporal y devolverla a nosotros
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
A continuación tenemos un sub para manejar el clic de AddUser, que llamará a la función anterior y devolverá la tabla temporal a la sesión y bing los datos a nuestra tabla de nuevo.
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
Hemos añadido la posibilidad de que los usuarios eliminen filas, por lo que necesitamos agregar esta función que eliminará la fila requerida y devolverá la tabla.
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
Ahora necesitamos un Sub vinculado al comando RowDeleting en UserTable, que llamará a la función Delete y volverá a enlazar nuestros datos.
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
Así que hemos puesto en marcha las funciones y procesos para actualizar la tabla de entrada del usuario y devolverlos, por lo que ahora tenemos que manejar la entrada final y la salida de nuestra mesa. Para ello vamos a enlazar un sub del evento Pre-Render de la página y llamar a algunas de las funciones anteriores, y otra que procesará a los usuarios en este caso una tabla ficticia.
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
La única parte que falta de arriba es la facilidad para enlazar el menú desplegable UsersAvailable a una base de datos (lo hemos hecho manualmente), utilizando un comando SQL falso que he mostrado a continuación, sin embargo para la página lo comentó.
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
Siempre he encontrado que es más fácil aprender simplemente con una obra de teatro, así que pruébela en sus máquinas y vea hasta dónde puede llevarla. Lo único que hay que recordar aquí es que si va a haber una gran cantidad de datos, puede ser más fácil simplemente enlazar a la base de datos, ya que esto debe mantener el tamaño de la página más pequeña y usar menos memoria en el servidor.