Web アプリケーション (ASP.NET) でDBを更新してみよう(VS2003 DataAdapter 編)

Web アプリケーション (ASP.NET) でDBのデータを表示しよう(VS2003 DataAdapter 編) で表示した項目を編集できるようにしてみましょう。
※今回は、プロジェクト名を MyWebDBApp04 としました。
※解説に用いた Visual Studio 2003 Professional Edition です。
サンプルのダウンロード

このカテゴリーの先頭へ このページの先頭へ

■プロジェクトの作成 〜 データアダプタの作成

Web アプリケーション (ASP.NET) でDBのデータを表示しよう(VS2003 DataAdapter 編)にて行った事と全く同じ事をします。
プロジェクトの作成
データ接続の作成
データセット(型付データセット)の作成
データアダプタの作成

このカテゴリーの先頭へ このページの先頭へ

■Web Form に データセット と データグリッド を配置する

ツールボックス(表示されていない場合は、メニューバーの[表示]→[ツールボックス]をクリックして表示させてくださいね)の
[データ]タブの中にある、DataSet を クリックし、そのままの状態で、デザイナ上の Web Form をクリックします。
ツールボックス→DataSet

データセットの追加画面が表示されます。
ここでは、先に作成した Customers データセットを選択しました。
データセットの追加 ダイアログ

再びデザイナに戻ったら、ツールボックスから DataGrid を選択して Web Form に配置します。
DataGrid 配置

DataGrid を選択して、プロパティ ウィンドウ(表示されていない場合は、メニューバーの[表示]→[プロパティ ウィンドウ]をクリックして表示させてくださいね)の
AutoGenerateColumns の値を False にします。

Web Page 上に配置されている DataGrid を右クリックして、プロパティ ビルダを起動します。
[全般]タブを選択して、データ ソースに 先に作成済みの DataSet の名前を入力し、
データ メンバに Customers を選択します。
データ キー フィールドに該当テーブル(この場合は Customers)の主キー項目を設定します。
DataGrid プロパティグリッド 全般

[列]タブを選択して、[使用可能な列] から データフィールド → (すべてのフィールド) または 任意の列 を選択し、[>]ボタンを押下して [選択された列] に追加します。
選択された列の内、データ キー フィールド 以外の列を一つ一つをクリックし、プロパティ グリッド の下のほうにある [この列をテンプレート列に変換する] というリンクをクリックします。
データ キー フィールド を編集させたくない場合は、データ キー フィールド の列を選択し、読み取り専用にチェックを入れます。
同様に、ボタン列 → [編集、更新、キャンセル] と [削除] を [選択された列] に追加します。
[OK]ボタンを押下し、プロパティ グリッドを閉じます。
DataGrid プロパティグリッド 列

このカテゴリーの先頭へ このページの先頭へ

■コードを入力

ソリューション エクスプローラ(表示されていない場合は、メニューバーの[表示]→[ソリューション エクスプローラ]をクリックして表示させてくださいね)の
WebForm を 右クリックして、コードエディタを表示させて、以下のコードを入力します。

WebForm1.aspx.vb
Public Class WebForm1
    Inherits System.Web.UI.Page

#Region " Web フォーム デザイナで生成されたコード "

    'この呼び出しは Web フォーム デザイナで必要です。
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.SqlDataAdapter1 = New System.Data.SqlClient.SqlDataAdapter
        Me.SqlDeleteCommand1 = New System.Data.SqlClient.SqlCommand
        Me.SqlConnection1 = New System.Data.SqlClient.SqlConnection
        Me.SqlInsertCommand1 = New System.Data.SqlClient.SqlCommand
        Me.SqlSelectCommand1 = New System.Data.SqlClient.SqlCommand
        Me.SqlUpdateCommand1 = New System.Data.SqlClient.SqlCommand
        Me.Customers1 = New MyWebDBApp04.Customers
        CType(Me.Customers1, System.ComponentModel.ISupportInitialize).BeginInit()
        '
        'SqlDataAdapter1
        '
        Me.SqlDataAdapter1.DeleteCommand = Me.SqlDeleteCommand1
        Me.SqlDataAdapter1.InsertCommand = Me.SqlInsertCommand1
        Me.SqlDataAdapter1.SelectCommand = Me.SqlSelectCommand1
        Me.SqlDataAdapter1.TableMappings.AddRange(New System.Data.Common.DataTableMapping() { _
        New System.Data.Common.DataTableMapping("Table", "Customers", _
        New System.Data.Common.DataColumnMapping() { _
        New System.Data.Common.DataColumnMapping("CustomerID", "CustomerID"), _
        New System.Data.Common.DataColumnMapping("CompanyName", "CompanyName"), _
        New System.Data.Common.DataColumnMapping("ContactName", "ContactName"), _
        New System.Data.Common.DataColumnMapping("ContactTitle", "ContactTitle"), _
        New System.Data.Common.DataColumnMapping("Address", "Address"), _
        New System.Data.Common.DataColumnMapping("City", "City"), _
        New System.Data.Common.DataColumnMapping("Region", "Region"), _
        New System.Data.Common.DataColumnMapping("PostalCode", "PostalCode"), _
        New System.Data.Common.DataColumnMapping("Country", "Country"), _
        New System.Data.Common.DataColumnMapping("Phone", "Phone"), _
        New System.Data.Common.DataColumnMapping("Fax", "Fax")})})
        Me.SqlDataAdapter1.UpdateCommand = Me.SqlUpdateCommand1
        '
        'SqlDeleteCommand1
        '
        Me.SqlDeleteCommand1.CommandText = "DELETE FROM Customers WHERE (CustomerID = @Original_CustomerID) AND (Address = @O" & _
        "riginal_Address OR @Original_Address IS NULL AND Address IS NULL) AND (City = @O" & _
        "riginal_City OR @Original_City IS NULL AND City IS NULL) AND (CompanyName = @Ori" & _
        "ginal_CompanyName) AND (ContactName = @Original_ContactName OR @Original_Contact" & _
        "Name IS NULL AND ContactName IS NULL) AND (ContactTitle = @Original_ContactTitle" & _
        " OR @Original_ContactTitle IS NULL AND ContactTitle IS NULL) AND (Country = @Ori" & _
        "ginal_Country OR @Original_Country IS NULL AND Country IS NULL) AND (Fax = @Orig" & _
        "inal_Fax OR @Original_Fax IS NULL AND Fax IS NULL) AND (Phone = @Original_Phone " & _
        "OR @Original_Phone IS NULL AND Phone IS NULL) AND (PostalCode = @Original_Postal" & _
        "Code OR @Original_PostalCode IS NULL AND PostalCode IS NULL) AND (Region = @Orig" & _
        "inal_Region OR @Original_Region IS NULL AND Region IS NULL)"
        Me.SqlDeleteCommand1.Connection = Me.SqlConnection1
        Me.SqlDeleteCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Original_CustomerID", System.Data.SqlDbType.NVarChar, 5, _
        System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "CustomerID", System.Data.DataRowVersion.Original, Nothing))
        Me.SqlDeleteCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Original_Address", System.Data.SqlDbType.NVarChar, 60, _
        System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "Address", System.Data.DataRowVersion.Original, Nothing))
        Me.SqlDeleteCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Original_City", System.Data.SqlDbType.NVarChar, 15, _
        System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "City", System.Data.DataRowVersion.Original, Nothing))
        Me.SqlDeleteCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Original_CompanyName", System.Data.SqlDbType.NVarChar, 40, _
        System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "CompanyName", System.Data.DataRowVersion.Original, Nothing))
        Me.SqlDeleteCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Original_ContactName", System.Data.SqlDbType.NVarChar, 30, _
        System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "ContactName", System.Data.DataRowVersion.Original, Nothing))
        Me.SqlDeleteCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Original_ContactTitle", System.Data.SqlDbType.NVarChar, 30, _
        System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "ContactTitle", System.Data.DataRowVersion.Original, Nothing))
        Me.SqlDeleteCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Original_Country", System.Data.SqlDbType.NVarChar, 15, _
        System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "Country", System.Data.DataRowVersion.Original, Nothing))
        Me.SqlDeleteCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Original_Fax", System.Data.SqlDbType.NVarChar, 24, _
        System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "Fax", System.Data.DataRowVersion.Original, Nothing))
        Me.SqlDeleteCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Original_Phone", System.Data.SqlDbType.NVarChar, 24, _
        System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "Phone", System.Data.DataRowVersion.Original, Nothing))
        Me.SqlDeleteCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Original_PostalCode", System.Data.SqlDbType.NVarChar, 10, _
        System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "PostalCode", System.Data.DataRowVersion.Original, Nothing))
        Me.SqlDeleteCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Original_Region", System.Data.SqlDbType.NVarChar, 15, _
        System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "Region", System.Data.DataRowVersion.Original, Nothing))
        '
        'SqlConnection1
        '
        Me.SqlConnection1.ConnectionString = "workstation id=DELLPC;packet size=4096;integrated security=SSPI;data source=""(loc" & _
        "al)"";persist security info=False;initial catalog=Northwind"
        '
        'SqlInsertCommand1
        '
        Me.SqlInsertCommand1.CommandText = "INSERT INTO Customers(CustomerID, CompanyName, ContactName, ContactTitle, Address" & _
        ", City, Region, PostalCode, Country, Phone, Fax) VALUES (@CustomerID, @CompanyNa" & _
        "me, @ContactName, @ContactTitle, @Address, @City, @Region, @PostalCode, @Country" & _
        ", @Phone, @Fax); SELECT CustomerID, CompanyName, ContactName, ContactTitle, Addr" & _
        "ess, City, Region, PostalCode, Country, Phone, Fax FROM Customers WHERE (Custome" & _
        "rID = @CustomerID)"
        Me.SqlInsertCommand1.Connection = Me.SqlConnection1
        Me.SqlInsertCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@CustomerID", System.Data.SqlDbType.NVarChar, 5, "CustomerID"))
        Me.SqlInsertCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@CompanyName", System.Data.SqlDbType.NVarChar, 40, "CompanyName"))
        Me.SqlInsertCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@ContactName", System.Data.SqlDbType.NVarChar, 30, "ContactName"))
        Me.SqlInsertCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@ContactTitle", System.Data.SqlDbType.NVarChar, 30, "ContactTitle"))
        Me.SqlInsertCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Address", System.Data.SqlDbType.NVarChar, 60, "Address"))
        Me.SqlInsertCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@City", System.Data.SqlDbType.NVarChar, 15, "City"))
        Me.SqlInsertCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Region", System.Data.SqlDbType.NVarChar, 15, "Region"))
        Me.SqlInsertCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@PostalCode", System.Data.SqlDbType.NVarChar, 10, "PostalCode"))
        Me.SqlInsertCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Country", System.Data.SqlDbType.NVarChar, 15, "Country"))
        Me.SqlInsertCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Phone", System.Data.SqlDbType.NVarChar, 24, "Phone"))
        Me.SqlInsertCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Fax", System.Data.SqlDbType.NVarChar, 24, "Fax"))
        '
        'SqlSelectCommand1
        '
        Me.SqlSelectCommand1.CommandText = "SELECT CustomerID, CompanyName, ContactName, ContactTitle, Address, City, Region," & _
        " PostalCode, Country, Phone, Fax FROM Customers"
        Me.SqlSelectCommand1.Connection = Me.SqlConnection1
        '
        'SqlUpdateCommand1
        '
        Me.SqlUpdateCommand1.CommandText = "UPDATE Customers SET CustomerID = @CustomerID, CompanyName = @CompanyName, Contac" & _
        "tName = @ContactName, ContactTitle = @ContactTitle, Address = @Address, City = @" & _
        "City, Region = @Region, PostalCode = @PostalCode, Country = @Country, Phone = @P" & _
        "hone, Fax = @Fax WHERE (CustomerID = @Original_CustomerID) AND (Address = @Origi" & _
        "nal_Address OR @Original_Address IS NULL AND Address IS NULL) AND (City = @Origi" & _
        "nal_City OR @Original_City IS NULL AND City IS NULL) AND (CompanyName = @Origina" & _
        "l_CompanyName) AND (ContactName = @Original_ContactName OR @Original_ContactName" & _
        " IS NULL AND ContactName IS NULL) AND (ContactTitle = @Original_ContactTitle OR " & _
        "@Original_ContactTitle IS NULL AND ContactTitle IS NULL) AND (Country = @Origina" & _
        "l_Country OR @Original_Country IS NULL AND Country IS NULL) AND (Fax = @Original" & _
        "_Fax OR @Original_Fax IS NULL AND Fax IS NULL) AND (Phone = @Original_Phone OR @" & _
        "Original_Phone IS NULL AND Phone IS NULL) AND (PostalCode = @Original_PostalCode" & _
        " OR @Original_PostalCode IS NULL AND PostalCode IS NULL) AND (Region = @Original" & _
        "_Region OR @Original_Region IS NULL AND Region IS NULL); SELECT CustomerID, Comp" & _
        "anyName, ContactName, ContactTitle, Address, City, Region, PostalCode, Country, " & _
        "Phone, Fax FROM Customers WHERE (CustomerID = @CustomerID)"
        Me.SqlUpdateCommand1.Connection = Me.SqlConnection1
        Me.SqlUpdateCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@CustomerID", System.Data.SqlDbType.NVarChar, 5, "CustomerID"))
        Me.SqlUpdateCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@CompanyName", System.Data.SqlDbType.NVarChar, 40, "CompanyName"))
        Me.SqlUpdateCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@ContactName", System.Data.SqlDbType.NVarChar, 30, "ContactName"))
        Me.SqlUpdateCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@ContactTitle", System.Data.SqlDbType.NVarChar, 30, "ContactTitle"))
        Me.SqlUpdateCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Address", System.Data.SqlDbType.NVarChar, 60, "Address"))
        Me.SqlUpdateCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@City", System.Data.SqlDbType.NVarChar, 15, "City"))
        Me.SqlUpdateCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Region", System.Data.SqlDbType.NVarChar, 15, "Region"))
        Me.SqlUpdateCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@PostalCode", System.Data.SqlDbType.NVarChar, 10, "PostalCode"))
        Me.SqlUpdateCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Country", System.Data.SqlDbType.NVarChar, 15, "Country"))
        Me.SqlUpdateCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Phone", System.Data.SqlDbType.NVarChar, 24, "Phone"))
        Me.SqlUpdateCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Fax", System.Data.SqlDbType.NVarChar, 24, "Fax"))
        Me.SqlUpdateCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Original_CustomerID", System.Data.SqlDbType.NVarChar, 5, _
        System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "CustomerID", System.Data.DataRowVersion.Original, Nothing))
        Me.SqlUpdateCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Original_Address", System.Data.SqlDbType.NVarChar, 60, _
        System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "Address", System.Data.DataRowVersion.Original, Nothing))
        Me.SqlUpdateCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Original_City", System.Data.SqlDbType.NVarChar, 15, _
        System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "City", System.Data.DataRowVersion.Original, Nothing))
        Me.SqlUpdateCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Original_CompanyName", System.Data.SqlDbType.NVarChar, 40, _
        System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "CompanyName", System.Data.DataRowVersion.Original, Nothing))
        Me.SqlUpdateCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Original_ContactName", System.Data.SqlDbType.NVarChar, 30, _
        System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "ContactName", System.Data.DataRowVersion.Original, Nothing))
        Me.SqlUpdateCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Original_ContactTitle", System.Data.SqlDbType.NVarChar, 30, _
        System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "ContactTitle", System.Data.DataRowVersion.Original, Nothing))
        Me.SqlUpdateCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Original_Country", System.Data.SqlDbType.NVarChar, 15, _
        System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "Country", System.Data.DataRowVersion.Original, Nothing))
        Me.SqlUpdateCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Original_Fax", System.Data.SqlDbType.NVarChar, 24, _
        System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "Fax", System.Data.DataRowVersion.Original, Nothing))
        Me.SqlUpdateCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Original_Phone", System.Data.SqlDbType.NVarChar, 24, _
        System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "Phone", System.Data.DataRowVersion.Original, Nothing))
        Me.SqlUpdateCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Original_PostalCode", System.Data.SqlDbType.NVarChar, 10, _
        System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "PostalCode", System.Data.DataRowVersion.Original, Nothing))
        Me.SqlUpdateCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Original_Region", System.Data.SqlDbType.NVarChar, 15, _
        System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "Region", System.Data.DataRowVersion.Original, Nothing))
        '
        'Customers1
        '
        Me.Customers1.DataSetName = "Customers"
        Me.Customers1.Locale = New System.Globalization.CultureInfo("en-US")
        CType(Me.Customers1, System.ComponentModel.ISupportInitialize).EndInit()

    End Sub
    Protected WithEvents SqlDataAdapter1 As System.Data.SqlClient.SqlDataAdapter
    Protected WithEvents SqlSelectCommand1 As System.Data.SqlClient.SqlCommand
    Protected WithEvents SqlInsertCommand1 As System.Data.SqlClient.SqlCommand
    Protected WithEvents SqlUpdateCommand1 As System.Data.SqlClient.SqlCommand
    Protected WithEvents SqlDeleteCommand1 As System.Data.SqlClient.SqlCommand
    Protected WithEvents SqlConnection1 As System.Data.SqlClient.SqlConnection
    Protected WithEvents Customers1 As MyWebDBApp04.Customers
    Protected WithEvents DataGrid1 As System.Web.UI.WebControls.DataGrid

    'メモ : 次のプレースホルダ宣言は Web フォーム デザイナで必要です。
    '削除および移動しないでください。
    Private designerPlaceholderDeclaration As System.Object

    Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
        ' CODEGEN: このメソッド呼び出しは Web フォーム デザイナで必要です。
        ' コード エディタを使って変更しないでください。
        InitializeComponent()
    End Sub

#End Region

    Private Const DATASET_SESSION_KEY As String = "CustomersDataset"

    ''' -----------------------------------------------------------------------------
    ''' <summary>
    ''' ページがロードされた時に発生します。
    ''' </summary>
    ''' -----------------------------------------------------------------------------
    Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' ページを初期化するユーザー コードをここに挿入します。
        If Not IsPostBack Then
            Try
                Me.SqlConnection1.Open()
                Me.SqlDataAdapter1.Fill(Me.Customers1)
            Finally
                If Not Me.SqlConnection1 Is Nothing Then Me.SqlConnection1.Close()
            End Try
            Session.Add(DATASET_SESSION_KEY, Me.Customers1)
            Me.DataGrid_DataBind()
        Else
            Me.Customers1 = DirectCast(Session(DATASET_SESSION_KEY), Customers)
        End If
    End Sub

    ''' -----------------------------------------------------------------------------
    ''' <summary>
    ''' 編集 が押下された時に発生します。
    ''' </summary>
    ''' -----------------------------------------------------------------------------
    Private Sub DataGrid1_EditCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles DataGrid1.EditCommand
        Me.DataGrid1.EditItemIndex = e.Item.ItemIndex
        Me.DataGrid_DataBind()
    End Sub

    ''' -----------------------------------------------------------------------------
    ''' <summary>
    ''' 更新 が押下された時に発生します。
    ''' </summary>
    ''' -----------------------------------------------------------------------------
    Private Sub DataGrid1_UpdateCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles DataGrid1.UpdateCommand
        Dim customerId As String = CStr(Me.DataGrid1.DataKeys(e.Item.ItemIndex))
        Dim companyName As String = DirectCast(e.Item.Cells(1).Controls(1), TextBox).Text
        Dim contactName As String = DirectCast(e.Item.Cells(2).Controls(1), TextBox).Text
        Dim phone As String = DirectCast(e.Item.Cells(3).Controls(1), TextBox).Text
        Dim fax As String = DirectCast(e.Item.Cells(4).Controls(1), TextBox).Text

        ' 更新
        Dim row As Customers.CustomersRow = Me.Customers1.Customers(e.Item.ItemIndex)
        With row
            .BeginEdit()
            .CompanyName = companyName
            .ContactName = contactName
            .Phone = phone
            .Fax = fax
            .EndEdit()
        End With

        Me.Update_DataSet()

        ' 元に戻す
        Me.DataGrid1.EditItemIndex = -1
        Me.DataGrid_DataBind()
    End Sub

    ''' -----------------------------------------------------------------------------
    ''' <summary>
    ''' キャンセル が押下された時に発生します。
    ''' </summary>
    ''' -----------------------------------------------------------------------------
    Private Sub DataGrid1_CancelCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles DataGrid1.CancelCommand
        Me.DataGrid1.EditItemIndex = -1
        Me.DataGrid_DataBind()
    End Sub

    ''' -----------------------------------------------------------------------------
    ''' <summary>
    ''' 削除 が押下された時に発生します。
    ''' </summary>
    ''' -----------------------------------------------------------------------------
    Private Sub DataGrid1_DeleteCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles DataGrid1.DeleteCommand
        Dim row As Customers.CustomersRow = Me.Customers1.Customers(e.Item.ItemIndex)
        row.Delete()

        Me.Update_DataSet()
        Me.DataGrid_DataBind()
    End Sub

    Private Sub DataGrid_DataBind()
        Me.DataGrid1.DataSource = Me.Customers1
        Me.DataGrid1.DataBind()
    End Sub

    Private Sub Update_DataSet()
        Try
            Me.SqlConnection1.Open()
            Me.SqlDataAdapter1.Update(Me.Customers1)
        Finally
            If Not Me.SqlConnection1 Is Nothing Then Me.SqlConnection1.Close()
        End Try
    End Sub
End Class
ちなみに、WebForm1.aspx は以下の様になっているはずです。
WebForm1.aspx
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm1.aspx.vb" Inherits="MyWebDBApp04.WebForm1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
    <HEAD>
        <title>WebForm1</title>
        <meta name="GENERATOR" content="Microsoft Visual Studio .NET 7.1">
        <meta name="CODE_LANGUAGE" content="Visual Basic .NET 7.1">
        <meta name="vs_defaultClientScript" content="JavaScript">
        <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
    </HEAD>
    <body MS_POSITIONING="GridLayout">
        <form id="Form1" method="post" runat="server">
            <asp:DataGrid id=DataGrid1
            style="Z-INDEX: 101; LEFT: 8px; POSITION: absolute; TOP: 8px"
            runat="server"
            DataSource='<%# Customers1 %>' DataKeyField="CustomerID" DataMember="Customers" AutoGenerateColumns="False">
                <Columns>
                    <asp:BoundColumn DataField="CustomerID" SortExpression="CustomerID" ReadOnly="True" HeaderText="CustomerID"></asp:BoundColumn>
                    <asp:TemplateColumn HeaderText="CompanyName">
                        <ItemTemplate>
                            <asp:Label runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.CompanyName") %>'>
                            </asp:Label>
                        </ItemTemplate>
                        <EditItemTemplate>
                            <asp:TextBox runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.CompanyName") %>'>
                            </asp:TextBox>
                        </EditItemTemplate>
                    </asp:TemplateColumn>
                    <asp:TemplateColumn HeaderText="ContactName">
                        <ItemTemplate>
                            <asp:Label runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.ContactName") %>'>
                            </asp:Label>
                        </ItemTemplate>
                        <EditItemTemplate>
                            <asp:TextBox runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.ContactName") %>'>
                            </asp:TextBox>
                        </EditItemTemplate>
                    </asp:TemplateColumn>
                    <asp:TemplateColumn HeaderText="Phone">
                        <ItemTemplate>
                            <asp:Label runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.Phone") %>'>
                            </asp:Label>
                        </ItemTemplate>
                        <EditItemTemplate>
                            <asp:TextBox runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.Phone") %>'>
                            </asp:TextBox>
                        </EditItemTemplate>
                    </asp:TemplateColumn>
                    <asp:TemplateColumn HeaderText="Fax">
                        <ItemTemplate>
                            <asp:Label runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.Fax") %>'>
                            </asp:Label>
                        </ItemTemplate>
                        <EditItemTemplate>
                            <asp:TextBox runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.Fax") %>'>
                            </asp:TextBox>
                        </EditItemTemplate>
                    </asp:TemplateColumn>
                    <asp:EditCommandColumn ButtonType="LinkButton" UpdateText="更新" CancelText="キャンセル" EditText="編集"></asp:EditCommandColumn>
                    <asp:ButtonColumn Text="削除" CommandName="Delete"></asp:ButtonColumn>
                </Columns>
            </asp:DataGrid>
        </form>
    </body>
</HTML>

データ接続を作成する際、SQL Server への認証を「Windows 認証」にしました。
ASP.NET の場合は、実行時に SQL Server へログオンするのは、ASPNET ユーザーになります。
その為、SQL Server にログインする権限がないとエラーが発生します。
ASPNET ユーザーに権限を与える方法もありますが、通常は "偽装" と呼ばれるテクニックを使います。
偽装をする為にもっともポピュラーな方法は、web.config ファイルに以下の一文を追記します。

<identity impersonate="true" userName="SQL Server にアクセスできる権限のあるユーザー名" password="userName に記述したユーザーの Windows ログオンパスワード" />
このカテゴリーの先頭へ このページの先頭へ

■デバッグ実行!

コードの入力が終わったら、メニューバーの[デバッグ]→[開始]をクリックしましょう。
実行結果
上のような画面が出現したら、編集→キャンセル・編集→更新・削除と一通りやってみてください。
SQL Server 側の該当テーブルで データの内容が 画面表示と同じになっていれば大成功です。
画面右上の×ボタンをクリックしてプログラムを終了させて下さい。

このカテゴリーの先頭へ このページの先頭へ

■ひとこと

デザイナでちょっといじって、少量のコードを書くだけで実現できますね。

編集になった時のコントロールは、TextBox 以外に変えることができます。
デザイナ上で、DataGrid を右クリックして、テンプレートの編集を選択し、
コントロールを変えたい列を選択します。
EditItemTemplate の中に デフォルトだと TextBox が入っていますが、例えばこれを DropDown にする場合は
もともと入っている TextBox を削除して、DropDown をツールボックスからドラッグしてやります。
DropDown のプロパティ等の編集が終わったら、右クリック→テンプレート編集の終了を選択して、完了です。

このカテゴリーの先頭へ このページの先頭へ