ASP.NET GridView での一時データの使用
チュートリアル: ASP.NET アプリケーションで一時データのみを使用する GridView を使用してテスト ページを作成する方法
If you want to run through this walkthrough, please follow the guide on setting up our test environment.
Experience Level - Intermediate
著者
したがって、DataGrid を使用する必要性に出くわしたかもしれませんが、変更が行われるたびにデータベースを継続的に更新したくありません。
幸いなことに、このすべてのデータをセッションの追加/削除行に保存し、データベースに触れることなくクライアントとサーバーの間で渡すことができます。
科学について深く掘り下げるつもりはありません。MSDN にはそのような記事があります。まず、新しい Web フォームをロードします。DropDownList、GridView、および 2 つのボタンを追加する必要があります。
上記のリンクから ClaytabaseAcademy アプリを使用している場合は、Visual Studio のソリューション エクスプローラーでClaytabaseAcademyアイテムを右クリックして Pages という新しいフォルダーを追加し、TemporaryData.aspx というページを追加します。
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="Chester Copperpot" 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>
役に立った?
最初にテーブルを宣言し、ページの読み込み時にこれを呼び出します
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
役に立った?
次に、一時テーブルに新しい値を追加して返す関数を追加します。
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
役に立った?
次に、AddUser クリックを処理するサブルーチンがあります。これにより、上記の関数が呼び出され、一時テーブルがセッションに返され、データが再びテーブルに bing されます。
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)) UsersForSignOffList.DataSource = (CType(Session("myDatatable"), DataTable)).DefaultView UsersForSignOffList.DataBind() End Sub
役に立った?
ユーザーが行を削除する機能を追加したので、必要な行を削除してテーブルを返すこの関数を追加する必要があります。
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
役に立った?
ここで、UserTable の RowDeleting コマンドにバインドされた Sub が必要です。これにより、Delete 関数が呼び出され、データが再バインドされます。
VB
Protected Sub UsersForSignOffList_RowDeleting(sender As Object, e As System.Web.UI.WebControls.GridViewDeleteEventArgs) Handles UsersForSignOffList.RowDeleting Dim Id As Integer = e.Keys(0).ToString DelDataFromTable(Id, CType(Session("myDatatable"), DataTable)) UsersForSignOffList.DataSource = (CType(Session("myDatatable"), DataTable)).DefaultView UsersForSignOffList.DataBind() End Sub
役に立った?
そのため、ユーザー入力からテーブルを更新して返す関数とプロセスを配置したので、テーブルからの最終的な入力と出力を処理する必要があります。これを行うには、サブをページの Pre-Render イベントにバインドし、上記の関数のいくつかと、この場合はダミー テーブルにユーザーを処理する別の関数を呼び出します。
VB
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
役に立った?
上記に欠けている唯一の部分は、UsersAvailable ドロップダウンをデータベースにバインドする機能です (これは手動で行いました)。以下に示すダミーの SQL コマンドを使用しますが、ページではコメントアウトされています。
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
役に立った?
単純に遊んでみるのが一番簡単だといつも思っていたので、自分のマシンで試してみて、どこまでやれるか試してみてください。ここで覚えておくべき唯一のことは、膨大な量のデータがある場合は、データベースにバインドする方が簡単な場合があるということです。これにより、ページのサイズが小さく保たれ、サーバーのメモリ使用量が少なくなります。
Claytabaseによるウェブサイトのデザイン
これは、当社の Web サイト デザイン サービスの一部である、市場で最も高速で最適化されたシステムの 1 つである Ousia コンテンツ管理システム コードから変更されたコードのセクションです。