« [VB.NET|SQLServer] レコードの削除・挿入・更新(トランザクション有) | メイン | [VB.NET] クラス・構造体・モジュール »

2005年11月08日

[ASP.NET] DataGrid に編集ボタンをつける

<asp:DataGrid id="DataGrid1" runat="server"></asp:DataGrid>

    ▼ ▼ ▼ 下記に変更 ▼ ▼ ▼

■最小限の設定
<asp:DataGrid
id="DataGrid1"
OnEditCommand="DataGrid1_Edit"
OnCancelCommand="DataGrid1_Cancel"
OnUpdateCommand="DataGrid1_Update"
runat="server">

<Columns>
<asp:EditCommandColumn
EditText="編集" CancelText="中止" UpdateText="更新" ButtonType="PushButton" HeaderText="編集用" />
</Columns>
</asp:DataGrid>


■セルをHTMLで指定している場合
<asp:DataGrid
id="DataGrid1"
OnEditCommand="DataGrid1_Edit"
OnCancelCommand="DataGrid1_Cancel"
OnUpdateCommand="DataGrid1_Update"
AutoGenerateColumns="false"
runat="server">

<Columns>
<!-- 編集させたくない列には ReadOnly="true" を設定する -->
<asp:BoundColumn ItemStyle-Width="80" DataField="ID" HeaderText="ID" ReadOnly="true" />
<asp:BoundColumn ItemStyle-Width="200" DataField="Name" HeaderText="商品名" />
<asp:BoundColumn ItemStyle-Width="100" DataField="Quantity" HeaderText="数量" />
<asp:EditCommandColumn
EditText="編集" CancelText="中止" UpdateText="更新" ButtonType="PushButton" HeaderText="編集用" />
</Columns>
</asp:DataGrid>

    '--- 宣言
    'DataTableCtrlクラスのインスタンスを作成(DataTableCtrlクラスをインスタンス化)
    Private clsDataTableCtrl As New DataTableCtrl


'---------------------------------------------------------------
' Page_Load
'---------------------------------------------------------------
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If IsPostBack = False Then
'DataTableCtrlクラスで作成したテーブルをセッションに格納
Session("UserTable") = DataTableCtrl.CreateTable
BindDataGrid1()
Else
'セッションに格納されているテーブルをDataTableCtrlクラスのテーブルにセット
clsDataTableCtrl.MyTable = CType(Session("UserTable"), DataTable)
End If
End Sub

'---------------------------------------------------------------
' DataGrid 表示
'---------------------------------------------------------------
Sub BindDataGrid1()
'DataTableCtrlクラスのテーブルをDataSourceにセット
DataGrid1.DataSource = clsDataTableCtrl.MyTable
DataGrid1.DataBind()
End Sub

'---------------------------------------------------------------
' [編集]ボタン クリック
'---------------------------------------------------------------
Sub DataGrid1_Edit(ByVal sender As Object, ByVal e As DataGridCommandEventArgs)
'編集状態にする
DataGrid1.EditItemIndex = e.Item.ItemIndex
BindDataGrid1()
End Sub

'---------------------------------------------------------------
' [中止]ボタン クリック
'---------------------------------------------------------------
Sub DataGrid1_Cancel(ByVal sender As Object, ByVal e As DataGridCommandEventArgs)
'編集状態のキャンセル
DataGrid1.EditItemIndex = -1
BindDataGrid1()
End Sub

'---------------------------------------------------------------
' [更新]ボタン クリック
'---------------------------------------------------------------
Sub DataGrid1_Update(ByVal sender As Object, ByVal e As DataGridCommandEventArgs)
Dim TB1 As TextBox = CType(e.Item.Cells(1).Controls(0), TextBox) '商品名テキストボックス
Dim TB2 As TextBox = CType(e.Item.Cells(2).Controls(0), TextBox) '数量テキストボックス

'編集行のIDセルの内容を取得
Dim ID As Integer = CInt(DataGrid1.Items(DataGrid1.EditItemIndex).Cells(0).Text)
DataTableCtrl.Update(ID, TB1.Text, CInt(TB2.Text))

'編集状態のキャンセル
DataGrid1.EditItemIndex = -1
BindDataGrid1()
End Sub

'***************************************************************
' DataTable 操作用クラス(Sharedで静的に)
'***************************************************************
Public Class DataTableCtrl
    '--- 宣言
    Private Shared _DT As DataTable

'---------------------------------------------------------------
' DataTable のプロパティ
'---------------------------------------------------------------
Public Shared Property MyTable() As DataTable
Get
Return _DT
End Get
Set(ByVal Value As DataTable)
_DT = Value
End Set
End Property

'---------------------------------------------------------------
' DataTable の作成
'---------------------------------------------------------------
Public Shared Function CreateTable() As DataTable
'データテーブルの作成
_DT = New DataTable
_DT.Columns.Add(New DataColumn("ID", System.Type.GetType("System.Int16")))
_DT.Columns.Add(New DataColumn("Name", System.Type.GetType("System.String")))
_DT.Columns.Add(New DataColumn("Quantity", System.Type.GetType("System.Int16")))

'初期データの登録
Insert(1, "リンゴ", 5)
Insert(2, "みかん", 10)
Insert(3, "さくらんぼ", 3)
Insert(4, "バナナ", 20)

Return _DT
End Function

'---------------------------------------------------------------
' DataTable にレコード追加
'---------------------------------------------------------------
Public Shared Sub Insert(ByVal ID As Integer, ByVal Name As String, ByVal Num As Integer)
Dim DR As DataRow = _DT.NewRow
DR("ID") = ID : DR("Name") = Name : DR("Quantity") = Num
_DT.Rows.Add(DR)
End Sub

'---------------------------------------------------------------
' DataTable のレコード更新
'---------------------------------------------------------------
Public Shared Sub Update(ByVal ID As Integer, ByVal Name As String, ByVal Num As Integer)
Dim DR As DataRow = _DT.Select("ID=" + CStr(ID))(0)
DR("Name") = Name : DR("Quantity") = Num
End Sub

End Class

2005 / 11 / 08