Použití dočasných dat v ASP.NET GridView
Vytvořte zkušební stránku s zobrazením Grid pomocí pouze dočasných dat v ASP.NET
Autor
Takže možná jste narazili na potřebu použití DataGrid, ale nechtěli jste neustále aktualizovat databázi s každou provedenou změnou.
Naštěstí můžete všechna tato data ukládat do relací přidávat / odstraňovat řádky a předávat je mezi klientem a serverem bez dotyku databáze.
Nehodlám se dostat do vědy, tam jsou články o MSDN pro takové věci.Nejprve načtěte nový webový formulář a budete muset přidat DropDownList, GridView a dvě tlačítka, jednu jako předstírání nahrávání do DB a další pro přidání uživatele do našeho GridView.
Spustil jsem to všechno v mém systému, takže kód by měl kopírovat a vkládat přímo, zkuste přidávat jednotlivé sekce, abyste viděli, jak je vytváříte.
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
Nejprve deklarujeme tabulku, budeme ji nazývat na stránce načtení
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
Nyní přidáme funkci přidat nové hodnoty do naší dočasné tabulky a vrátit ji k nám
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
Dále máme díl, který zvládne kliknutí AddUser, které zavolá funkci výše a vrátí dočasnou tabulku do relace a znovu přidá data do tabulky.
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
Přidali jsme uživatelům možnost smazat řádky, takže musíme přidat tuto funkci, která odstraní požadovaný řádek a vrátí tabulku.
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
Nyní potřebujeme Subbound na příkaz RowDeleting na UserTable, který zavolá funkci Delete a znovu naváže naše data.
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
Takže jsme zavedli funkce a procesy, abychom aktualizovali tabulku z uživatelského vstupu a vrátili je, takže teď musíme zpracovat konečný vstup a výstup z naší tabulky. Za tímto účelem budeme vázat dílku na událost Pre-Render stránky a zavolat některé z výše uvedených funkcí a další, které budou uživatelům zpracovávat v tomto případě tabulku.
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
Jedinou chybějící částí je schopnost sdružovat rozbalovací nabídku UsersAvailable na databázi (to jsme provedli ručně) pomocí fiktivního příkazu SQL. Ukázal jsem to níže, nicméně na stránku komentovala.
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
Vždycky jsem se cítil nejsnadněji učit tím, že prostě hrajete, tak zkuste to na vašich strojích a zjistěte, jak daleko to můžete vzít. Jediná věc, na kterou je třeba si uvědomit, je, že pokud bude velké množství dat, může být jednodušší pouze vázat na databázi, protože by to mělo mít menší velikost stránky a méně paměti na serveru.