none
gridview内のデータを一括更新する RRS feed

  • 質問

  • いつもいつもお世話になっております。

    http://social.msdn.microsoft.com/Forums/ja-JP/vwdexpressja/thread/635a2282-7366-47c5-9dce-4d229d7a4c0f
    上記質問をした者です。

    ネットで検索し、以下のサイトが自分のやりたいことに近いような気がして
    まねしてコードを作成してみましたがうまく動作しません。
    EmployeeIDとTitleOfCourtesyの一覧表を作成し、griviewで表示しています。

    「GridView Web サーバー コントロールにバインドされた行の一括更新を実行する」
    http://msdn.microsoft.com/ja-jp/library/aa992036%28v=vs.80%29.aspx

    データを編集して「UpdateButton」をクリックしても何の変化もありません。
    vbのコードの書き方に問題があるとは思うのですが
    どのあたりを見直ししたらいいか、ご教授いただけないでしょうか。

    よろしくお願いいたします!

    ■GridView
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="EmployeeID"
            DataSourceID="SqlDataSource1">
            <Columns>
                <asp:BoundField DataField="EmployeeID" HeaderText="EmployeeID"
                    InsertVisible="False" ReadOnly="True" SortExpression="EmployeeID" />
                <asp:TemplateField HeaderText="TitleOfCourtesy"
                    SortExpression="TitleOfCourtesy">
                    <EditItemTemplate>
                        <asp:TextBox ID="TitleOfCourtesyTextBox" runat="server" Text='<%# Bind("TitleOfCourtesy") %>'></asp:TextBox>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:TextBox ID="TitleOfCourtesyTextBox" runat="server" Text='<%# Bind("TitleOfCourtesy") %>'></asp:TextBox>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>

    ■SqlDataSource
           <asp:SqlDataSource ID="SqlDataSource1" runat="server"
                ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString1 %>"
               
                SelectCommand="略"
                DeleteCommand="略"
                InsertCommand="略"
                UpdateCommand=""略">
                <DeleteParameters>
                    "略"
                </DeleteParameters>
                <InsertParameters>
                    "略"
                </InsertParameters>
                <UpdateParameters>
                    "略"
                </UpdateParameters>
            </asp:SqlDataSource>

    vbのコードは以下のように記載しました。

    ■Private tableCopied As Boolean = False
    ■Private originalDataTable As System.Data.DataTable

    ■Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
            If e.Row.RowType = DataControlRowType.DataRow Then
                If Not tableCopied Then
                    originalDataTable = CType(e.Row.DataItem, System.Data.DataRowView).Row.Table.Copy()
                    ViewState("originalValuesDataTable") = originalDataTable
                    tableCopied = True
                End If
            End If
        End Sub


    ■Protected Sub UpdateButton_Click(ByVal sender As Object, ByVal e As EventArgs)
            originalDataTable = CType(ViewState("originalValuesDataTable"), System.Data.DataTable)

            For Each r As GridViewRow In GridView1.Rows
                If IsRowModified(r) Then GridView1.UpdateRow(r.RowIndex, False)
            Next

            ' Rebind the Grid to repopulate the original values table.
            tableCopied = False
            GridView1.DataBind()
        End Sub

    ■Protected Function IsRowModified(ByVal r As GridViewRow) As Boolean
            Dim currentID As Integer
            Dim currentTitleOfCourtesy As String

            currentID = Convert.ToInt32(GridView1.DataKeys(0).Value)
            currentTitleOfCourtesy = CType(r.FindControl("TitleOfCourtesyTextBox"), TextBox).Text

            Dim row As System.Data.DataRow = _
                originalDataTable.Select(String.Format("EmployeeID = {0}", currentID))(0)

            If Not currentTitleOfCourtesy.Equals(row("TitleOfCourtesy").ToString()) Then Return True


            Return False
        End Function


    • 編集済み masunona 2011年12月9日 8:21
    2011年12月9日 8:19

回答


  • このフォーラムでも時々そのサンプルが出てきますが、以下のコー
    ドが間違っているようです。

    currentID = Convert.ToInt32(GridView1.DataKeys(0).Value)

    ただし、masunona さんのケースでうまくいかない原因かこれかど
    うかはわかりませんが。


    今やりたいことは、先のスレッドにあった Button1 クリックで、現
    在GridView に表示されている全レコードの【Check】列を true に
    更新するということではなかったのですか?

    であれば、CheckBox にチェックを入れるという余計な操作は飛ばし
    て、Button1 の Click イベントのハンドラで、GridView に表示さ
    れている【ID】(主キーですよね?)をすべて取得し、その【ID】
    を持つレコードの【Check】列を true に UPDATE してはいかがです
    か。その方が簡単だと思いますが。

     

    • 回答としてマーク masunona 2011年12月12日 6:44
    2011年12月9日 12:37
  • Protected Sub UpdateButton_Click(ByVal sender As Object, ByVal e As EventArgs) Handles UpdateButton.Click
    'Handles UpdateButton.Clickを付ける
             originalDataTable = CType(ViewState("originalValuesDataTable"), System.Data.DataTable)
     
            For Each r As GridViewRow In GridView1.Rows
                 If IsRowModified(r) Then GridView1.UpdateRow(r.RowIndex, False)
             Next
     
            ' Rebind the Grid to repopulate the original values table.
             tableCopied = False
             GridView1.DataBind()
         End Sub
     
    

     

     

    Protected Function IsRowModified(ByVal r As GridViewRow) As Boolean
            Dim currentID As Integer
            Dim currentTitleOfCourtesy As String
          
            'できれば、DataKeys(0)もDataKeys(r.RowIndex)に変更する
            currentID = Convert.ToInt32(GridView1.DataKeys(r.RowIndex).Value)
    
            currentTitleOfCourtesy = CType(r.FindControl("TitleOfCourtesyTextBox"), TextBox).Text
         
    
            Dim row As System.Data.DataRow = _
                originalDataTable.Select(String.Format("EmployeeID = {0}", currentID))(0)
    
            If Not currentTitleOfCourtesy.Equals(row("TitleOfCourtesy").ToString()) Then Return True
         
    
            Return False
        End Function

     



     


    Shadowと愉快なコード達

    • 編集済み Shadow .Net 2011年12月11日 17:28
    • 回答としてマーク masunona 2011年12月12日 6:44
    2011年12月11日 17:16
  • > この方法のほうが簡単ならばぜひやってみたい・・・!!

    ADO.NET の基本のライブラリだけで簡単にできると思います。主キー
    は DataKeys から取得できますし。

    例えば、以下のページの「リスト3 接続型データアクセスの更新系サ
    ンプル」のように。

    DB 設計者のための明解 ADO.NET 第 1 回
    http://msdn.microsoft.com/ja-jp/events/dd231281.aspx

    • 回答としてマーク masunona 2011年12月13日 2:44
    2011年12月12日 12:00

すべての返信


  • このフォーラムでも時々そのサンプルが出てきますが、以下のコー
    ドが間違っているようです。

    currentID = Convert.ToInt32(GridView1.DataKeys(0).Value)

    ただし、masunona さんのケースでうまくいかない原因かこれかど
    うかはわかりませんが。


    今やりたいことは、先のスレッドにあった Button1 クリックで、現
    在GridView に表示されている全レコードの【Check】列を true に
    更新するということではなかったのですか?

    であれば、CheckBox にチェックを入れるという余計な操作は飛ばし
    て、Button1 の Click イベントのハンドラで、GridView に表示さ
    れている【ID】(主キーですよね?)をすべて取得し、その【ID】
    を持つレコードの【Check】列を true に UPDATE してはいかがです
    か。その方が簡単だと思いますが。

     

    • 回答としてマーク masunona 2011年12月12日 6:44
    2011年12月9日 12:37
  • Protected Sub UpdateButton_Click(ByVal sender As Object, ByVal e As EventArgs) Handles UpdateButton.Click
    'Handles UpdateButton.Clickを付ける
             originalDataTable = CType(ViewState("originalValuesDataTable"), System.Data.DataTable)
     
            For Each r As GridViewRow In GridView1.Rows
                 If IsRowModified(r) Then GridView1.UpdateRow(r.RowIndex, False)
             Next
     
            ' Rebind the Grid to repopulate the original values table.
             tableCopied = False
             GridView1.DataBind()
         End Sub
     
    

     

     

    Protected Function IsRowModified(ByVal r As GridViewRow) As Boolean
            Dim currentID As Integer
            Dim currentTitleOfCourtesy As String
          
            'できれば、DataKeys(0)もDataKeys(r.RowIndex)に変更する
            currentID = Convert.ToInt32(GridView1.DataKeys(r.RowIndex).Value)
    
            currentTitleOfCourtesy = CType(r.FindControl("TitleOfCourtesyTextBox"), TextBox).Text
         
    
            Dim row As System.Data.DataRow = _
                originalDataTable.Select(String.Format("EmployeeID = {0}", currentID))(0)
    
            If Not currentTitleOfCourtesy.Equals(row("TitleOfCourtesy").ToString()) Then Return True
         
    
            Return False
        End Function

     



     


    Shadowと愉快なコード達

    • 編集済み Shadow .Net 2011年12月11日 17:28
    • 回答としてマーク masunona 2011年12月12日 6:44
    2011年12月11日 17:16
  • SurferOnWww

    ご回答ありがとうございます!
    自分には難しすぎて色々迷走しております。
    ご指摘部分のコードをもう一度確認してみます!

    >Button1 の Click イベントのハンドラで、GridView に表示さ
    >れている【ID】(主キーですよね?)をすべて取得し、その【ID】
    >を持つレコードの【Check】列を true に UPDATE してはいかがです
    >か。

    この方法のほうが簡単ならばぜひやってみたい・・・!!

    まだやりたいことを思い浮かべても
    すぐにコードを記述できるほどの知識がないので
    時間がかかるかもしれませんが
    ちょっと挑戦してみようと思います。

    ありがとうございました!

    2011年12月12日 6:43
  • Shadow And Happy Code

    ご回答ありがとうございます!

    いただいたコードを参考に
    早速今から自分のコードを見直ししてみたいと思います。

    ありがとうございました!

    2011年12月12日 6:44
  • Shadow And Happy Code

    無事に更新できるようになりました!ありがとうございます!!!

    2011年12月12日 6:54
  • > この方法のほうが簡単ならばぜひやってみたい・・・!!

    ADO.NET の基本のライブラリだけで簡単にできると思います。主キー
    は DataKeys から取得できますし。

    例えば、以下のページの「リスト3 接続型データアクセスの更新系サ
    ンプル」のように。

    DB 設計者のための明解 ADO.NET 第 1 回
    http://msdn.microsoft.com/ja-jp/events/dd231281.aspx

    • 回答としてマーク masunona 2011年12月13日 2:44
    2011年12月12日 12:00
  • SurferOnWww

    ご回答ありがとうございます!
    早速拝見しましたがどうやら未知の世界の様子なので
    じっくり時間をかけて見てみたいと思います!

    ありがとうございました!

    2011年12月13日 2:44