ASP.NET 徹底活用術のホームへ戻る

DataGridに追加機能を組み込む ~dg3.aspx

 

DataGridのフッターに[新規登録]ボタンを追加してレコードの追加機能を組み込みます。DataGridのフッターにボタンを表示するには、連結列をテンプレート列に変換します。

 

デザイナに表示されているDataGridの右クリックから[プロパティビルダ]を選択します。「DataGrid1プロパティビルダ」が表示されたら、左側の[全般]が選択されていることを確認します。「ヘッダーおよびフッター」から「フッターの表示」をクリックしてチェックマークを付けます。左側から[]をクリックしたら、「選択された列」から[ID]の連結列を選択して「この列をテンプレート列に変換する」のリンクをクリックします。「ID」がテンプレート列に変換されたら、[OK]ボタンをクリックしてプロパティビルダを閉じます。

 

 

7: DataGridの「ID」をテンプレート列に変換

 

 

DataGridの右クリックから[テンプレートの編集][Columns[0]-ID]を選択します。「テンプレート列の編集」が表示されたら、ツールボックスから[Button]をドラッグしてFooterTemplateにドロップします。FooterTemplateButtonが作成されます。デザイナの最下位から[HTML]のタブをクリックしてHTMLビューに切り替えたら、Buttonコントロールを次のように書き換えます。

 

<FooterTemplate>

  <asp:Button id="btnAddRow" runat="server"

    onclick="btnAddRow_Click"

    Text="新規登録" Width="100%">

  </asp:Button>

</FooterTemplate>

 

8: 「テンプレート列の編集」からFooterTemplateButtonを作成

 

 

9: DataGridのフッターに[新規登録]ボタンが表示された

 

HTMLビューの右クリックから[コードの表示]をクリックしてコードビューに切り替えます。コードビューが表示されたら、クラスの先頭に[新規登録]ボタンのWithEventsを追加します。

 

Protected WithEvents btnAddRow As System.Web.UI.WebControls.Button

 

ページクラスにリスト3,4,5を追加したら、DataGridUpdateCommandイベントハンドラを、次のように書き換えます。DataGridのフッターから[新規登録]ボタンをクリックすると、Webページがポストバックされて[新規登録]ボタンのクリック時のイベントハンドラが実行されます(リスト3)。このイベントハンドラでは、DataTableに空のレコードを追加して編集行として表示します。DataGridから[更新]ボタンをクリックすると、WebページがポストバックされてUpdateCommandイベントハンドラが実行されます。このイベントハンドラでは、新規登録または既存レコードの更新かを調べます。新規登録ならInsertRecordメソッドを実行します。

 

 

Private Sub DataGrid1_UpdateCommand(...) Handles DataGrid1.UpdateCommand

  ・・・

  If Me.AddingNew Then

    InsertRecord(strCompanyName, strContactName, strPhone)

  Else

    Dim intCustomerID As Integer = DataGrid1.DataKeys(e.Item.ItemIndex)

    UpdateRecord(strCompanyName, strContactName, strPhone, intCustomerID)

  End If

  Me.AddingNew = False

  DataGrid1.ShowFooter = True

  DataGrid1.EditItemIndex = -1

  BindDataGrid()

End Sub

 

InsertRecordメソッドは、DataTableに追加した空レコードにフィールドの値を設定して更新したら、DataAdapterUpdateメソッドを実行してデータベースに反映します。Updateメソッドは、CommandBuilderが作成したレコード追加用のSQLを使用してデータベースにレコードを追加します(リスト4)

 

リスト3: [新規登録]ボタンのクリック時のイベントハンドラ

Public Sub btnAddRow_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _

  Handles btnAddRow.Click

  CheckIsEditing("AddRow")

  If IsEditing Then

    Exit Sub

  End If

  Dim dr As DataRow = mdt.NewRow

  mdt.Rows.Add(dr)

  Me.AddingNew = True

  Session(conSessionKey) = mdt

  DataGrid1.ShowFooter = False

  DataGrid1.EditItemIndex = DataGrid1.Items.Count

  BindDataGrid()

End Sub

 

リスト4: DataTableに新規レコードを追加してデータベースに反映する

Private Function InsertRecord(ByVal strCompanyName As String, _

  ByVal strContactName As String, _

  ByVal strPhone As String) As Integer

  Dim intRetValue As Integer = 0

  Dim dr As DataRow = mdt.Rows(mdt.Rows.Count - 1)

  dr("CompanyName") = strCompanyName

  dr("ContactName") = strContactName

  dr("Phone") = strPhone

  Try

    mda.Update(mdt)

    intRetValue = 1

  Catch ex As Exception

    Response.Write(ex.Message.ToString)

  Finally

    mdt = Nothing

  End Try

  Return intRetValue

End Function

 

リスト5: ページクラスにAddingNewプロパティを追加

Public Property AddingNew() As Boolean

  Get

    Dim obj As Object = ViewState("AddingNew")

    If obj Is Nothing Then

      Return False

    End If

    Return CType(obj, Boolean)

  End Get

  Set(ByVal Value As Boolean)

    ViewState("AddingNew") = Value

  End Set

End Property

 

 

Tip 楽観的ロックを高速化する ~dg3tips.aspx

CommandBuilderが自動生成したSQLは性能上あまり効率がよくないのでレコードを更新、削除するSQLは独自に用意することをお勧めします。DataAdapterUpdateメソッドで独自に用意したSQLを使用するには、DataAdapterInsertCommandUpdateCommandDeleteCommandを書き換えます。

 

ASP.NET 徹底活用術のホームへ戻る