none
GridViewについて RRS feed

  • 質問

  • 最近ASP.NETという言葉を知ったばかりの初心者です。

    現在、GridViewで遊んでいるのですが、編集をしたいと思っています。
    ここで、編集ボタンを追加させるにあたって、プロパティの
    [AutoGenarateEditButton] を [True] にさせました。

    しかし、編集ボタンを押し「更新」を押したと同時にエラーになってしまいます。
    この場合、プログラムを追加する必要があると思うのですが、
    Protected Sub GridView1_RowEditing~
    のあとに書いていいコントロール(テキストボックスのID)が分からず苦戦しています。

    どなかた詳しい方がいましたら、よろしくお願いします。

    また、DBはXMLになります。

    2009年6月18日 6:31

回答


  • ノブヒデさんは、
    Protected Sub GridView1_RowUpdated~
    のイベント文をどのようにお書きになったのでしょうか?

    また、後述のチェックボタンについてですが、チェックできない状態になっていました。

    いろいろお手数をかけすいません。

    ワカRUN様

    >Protected Sub GridView1_RowUpdated~のイベント文をどのようにお書きになったのでしょうか?
    今回は、.vbにコードを書かずに実装しました。

    手順は以下の通りです。

    ①ダウンロードしたサンプルのaspxにGridViewコントロール(GridView1)をドラッグ&ドロップ。
    ②Gridview1の右上?から"GridViewタスク"の[データソースの選択:]ドロップダウンリスト内の[<新しいデータソース...>]を選択。
    ③データベース構成ウィザード-[データソースの種類を選びます。]にて"データベース"を選択し[OK]。
    ④[データ接続の選択]にて接続を選び、[次へ]。
    ⑤[Selectステートメントの構成]にてテーブル及び列を選択し、[詳細設定]。
    ⑥[INSERT、UPDATE・・・ステートメントの生成]にチェックし、[OK]。
    ⑦[次へ]→[完了]。
    ⑧Gridview1の右上?から"GridViewタスク"の[編集を有効にする]チェックボックスをオンにする。

    後は、ビルドしてDB更新できる事を確認しました。

    小野様からありましたがテーブルに主キーが存在していないとチェックできないのかもしれませんね。
    MCITP(Database Developer/Database Administrator) MCPD(Web Developer) MCTS(SQL Server 2005/Web Applications/Windows Applications)
    • 回答としてマーク ワカRUN 2009年6月19日 5:48
    2009年6月19日 3:55

すべての返信

  • 最近ASP.NETという言葉を知ったばかりの初心者です。

    現在、GridViewで遊んでいるのですが、編集をしたいと思っています。
    ここで、編集ボタンを追加させるにあたって、プロパティの
    [AutoGenarateEditButton] を [True] にさせました。

    しかし、編集ボタンを押し「更新」を押したと同時にエラーになってしまいます。
    この場合、プログラムを追加する必要があると思うのですが、
    Protected Sub GridView1_RowEditing~
    のあとに書いていいコントロール(テキストボックスのID)が分からず苦戦しています。

    どなかた詳しい方がいましたら、よろしくお願いします。

    また、DBはXMLになります。


    GridViewのカラムにTemplateFieldを追加して、テンプレート列の編集からEditItemTemplateを選択後、
    そこにコントロールID:TextBox1のテキストボックスを貼り付けたという仮定のもとであれば、以下でテキストボックスに入力した内容が取れるかと思います。
    動作確認はしておりません。

    protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
            {
                string test = ((TextBox)(GridView1.Rows[e.NewEditIndex].FindControl("TextBox1"))).Text;
            }
    MCITP(Database Developer/Database Administrator) MCPD(Web Developer) MCTS(SQL Server 2005/Web Applications/Windows Applications)
    2009年6月18日 7:45
  • RowUpdatingイベントに対してプログラムを記述することになるんじゃないかな?
    その場合であれば、渡される引数(GridViewUpdateEventArgs)に更新しようとするデータの値とかはいってくると思います。
    あおい情報システム株式会社 小野修司(どっとねっとふぁん)
    2009年6月18日 8:21
  • RowUpdatingイベントに対してプログラムを記述することになるんじゃないかな?
    その場合であれば、渡される引数(GridViewUpdateEventArgs)に更新しようとするデータの値とかはいってくると思います。
    あおい情報システム株式会社 小野修司(どっとねっとふぁん)

    小野修司さま
    ありがとうございます。

    ワカRUNさま
    もうしわけございません。

    こちらでしたかね。。
    protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
            {
                string test = ((TextBox)(GridView1.Rows[e.RowIndex].FindControl("TextBox1"))).Text;
            }


    MCITP(Database Developer/Database Administrator) MCPD(Web Developer) MCTS(SQL Server 2005/Web Applications/Windows Applications)
    2009年6月18日 8:39
  • 皆さん。あrがとうございます。

    いろいろやってみましたが、無理でした。
    残念です。というより僕の知識不足です。

    最初に編集ボタンを押すと、「更新ボタン」と「キャンセル」ボタンの二つが現れるのですが、
    その右側に既に、テキストボックスが、カラム数分用意してあり、その中でデータが入っている
    形で表されます。

    ノブヒデさんのアドバイスでテキストボックスを追加したのですが、そうするとテキストボックスが
    違うカラムの部分に出現してしまいます。

    小野さんの、GridViewUpdateEventArgsですが、どのように使えばいいのでしょうか?

    2009年6月18日 8:44
  • 最初に編集ボタンを押すと、「更新ボタン」と「キャンセル」ボタンの二つが現れるのですが、
    その右側に既に、テキストボックスが、カラム数分用意してあり、その中でデータが入っている
    形で表されます。

    ノブヒデさんのアドバイスでテキストボックスを追加したのですが、そうするとテキストボックスが
    違うカラムの部分に出現してしまいます。

    ワカRUNさん

    早速の返信ありがとうございます。
    説明不足でもうしわけございません。

    テキストボックスの追加の箇所は無視して頂いて、FindControlに既存のテキストボックスのコントロールIDを指定すれば良いかと思います。
    FindControl("既存のテキストボックスのID")

    MCITP(Database Developer/Database Administrator) MCPD(Web Developer) MCTS(SQL Server 2005/Web Applications/Windows Applications)
    2009年6月18日 9:18
  • すいません。

    VBで書きますとどのようになるのでしょうか?
    Protected Sub GridView1_RowUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs)

            Dim test As String = ((TextBox)(GridView1.Rows(e.RowIndex).FindControl("TextBox1"))).Text

    だとエラーになってしまいます。

    できたらで結構です。
    2009年6月18日 9:23
  • すいません。

    VBで書きますとどのようになるのでしょうか?
    Protected Sub GridView1_RowUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs)

            Dim test As String = ((TextBox)(GridView1.Rows(e.RowIndex).FindControl("TextBox1"))).Text

    だとエラーになってしまいます。

    できたらで結構です。

    エラーとはビルドエラーでしょうか?実行時のエラーでしょうか?
    VBは詳しくありませんが、下記記述がWeb上にありました。
    ------ 記 -------
    Dim row As GridViewRow = GridView1.Rows(e.RowIndex)
    Dim txtBox As TextBox = DirectCast(row.FindControl("txtB"), TextBox)
    ---------------

    正しくビルド?実行?出来るかは未確認です。
    参考まで。

    MCITP(Database Developer/Database Administrator) MCPD(Web Developer) MCTS(SQL Server 2005/Web Applications/Windows Applications)
    2009年6月18日 9:36
  • いろいろあrがとうございます。

    もう少し基礎から勉強したいと思います。

    根本的にプログラムのミスがあるのかもしれません。
    GridViewのコントロールが、編集用に、
    自動的にカラム数の「TextBox」を用意してくれるのであるのに、
    このあとの「更新」ボタンのイベントを書かないといけないというのには
    すこし疑問を感じます。

    2009年6月18日 9:37
  • コンパイルはできていますが、
    Ctrl+F5後
    「更新」ボタンを押すと、

    「このメゾットはサポートしていません。」

    と出てしまいます。
    左下にjavasprictと出ているのが気になります。
    2009年6月18日 9:47
  • コンパイルはできていますが、
    Ctrl+F5後
    「更新」ボタンを押すと、

    「このメゾットはサポートしていません。」

    と出てしまいます。
    左下にjavasprictと出ているのが気になります。

    ワカRUN様

    早速の返信ありがとうございます。

    なんとなく実現したいことはわかってきましたが、

    可能であれば、ソースを公開(aspx および aspx.vb)して頂けると助かります。

    詳しい方からもたくさんのアドバイスを頂けると思います。


    MCITP(Database Developer/Database Administrator) MCPD(Web Developer) MCTS(SQL Server 2005/Web Applications/Windows Applications)
    2009年6月18日 10:25
  • GridViewのコントロールが、編集用に、
    自動的にカラム数の「TextBox」を用意してくれるのであるのに、
    このあとの「更新」ボタンのイベントを書かないといけないというのには
    すこし疑問を感じます。

    SqlDataSource等を使っている場合は自動的に更新とかまでできるようにウィザードで設定できたりします。
    フレームワークが用意しているコントロールは、そんな感じである特定のパターンで最も使い勝手がいいようになってますから、それをはずれると自分でいろいろやる必要がでてきます。
    あおい情報システム株式会社 小野修司(どっとねっとふぁん)
    2009年6月18日 10:35
  • しかし、編集ボタンを押し「更新」を押したと同時にエラーになってしまいます。
    どのようなエラーメッセージが出ているのでしょうか?

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年6月18日 15:36
    モデレータ
  • 皆さん昨日はいろいろありがとうございました。
    そして途中から、質問者である私が帰宅してしまいました。すいません。

    ノブヒデさんへ
    現在作成中のプログラムは、もともとWEB上からダウンロードしたものであります。
    http://www.microsoft.com/Japan/msdn/archive/student/challengev2/default.aspx
    の4章など。

    先ほどダウンロードをしなおし、「編集」ボタンを追加してみたところ、やはり同じ結果になりました。

    ここで、小野さんの書き込みを見てみますと、DBが「SQL」で対応可能と書いてありましたので、
    現在修正を加えている最中でございます。
    (DBを「SQL」に変更)

    これで成功すれば「XML」は対応できてないコントロールということが証明できます。
    (但し、前述のように私は初心者なのでソースを変更させるのに多量の時間を費やす可能性もあります)

    本職はプログラム関係ではありませんので、回答は急いでおりませんが、
    何か情報をいただけるとうれしい限りです。

    またエラーの詳細は以下のとおりです。

     説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。

    例外の詳細: System.NotSupportedException: 指定されたメソッドはサポートされていません。

    ソース エラー:

    現在の Web 要求の実行中にハンドルされていない例外が生成されました。障害の原因および発生場所に関する情報については、下の例外スタック トレースを使って確認できます。

    スタック トレース:

    [NotSupportedException: 指定されたメソッドはサポートされていません。]
       System.Web.UI.DataSourceView.ExecuteUpdate(IDictionary keys, IDictionary values, IDictionary oldValues) +29
       System.Web.UI.DataSourceView.Update(IDictionary keys, IDictionary values, IDictionary oldValues, DataSourceViewOperationCallback callback) +92
       System.Web.UI.WebControls.GridView.HandleUpdate(GridViewRow row, Int32 rowIndex, Boolean causesValidation) +907
       System.Web.UI.WebControls.GridView.HandleEvent(EventArgs e, Boolean causesValidation, String validationGroup) +704
       System.Web.UI.WebControls.GridView.OnBubbleEvent(Object source, EventArgs e) +95
       System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
       System.Web.UI.WebControls.GridViewRow.OnBubbleEvent(Object source, EventArgs e) +123
       System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
       System.Web.UI.WebControls.LinkButton.OnCommand(CommandEventArgs e) +118
       System.Web.UI.WebControls.LinkButton.RaisePostBackEvent(String eventArgument) +135
       System.Web.UI.WebControls.LinkButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
       System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
       System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +175
       System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565
    

    '/WebSite8' アプリケーションでサーバー エラーが発生しました。

    指定されたメソッドはサポートされていません。

     

    2009年6月19日 1:26
  • http://www.microsoft.com/Japan/msdn/archive/student/challengev2/default.aspx

    先ほどダウンロードをしなおし、「編集」ボタンを追加してみたところ、やはり同じ結果になりました。

    ここで、小野さんの書き込みを見てみますと、DBが「SQL」で対応可能と書いてありましたので、
    現在修正を加えている最中でございます。
    (DBを「SQL」に変更)

    これで成功すれば「XML」は対応できてないコントロールということが証明できます。
    (但し、前述のように私は初心者なのでソースを変更させるのに多量の時間を費やす可能性もあります)

    ”指定されたメソッドはサポートされていません。”
    こちらでも再現しました。XmlDataSourceコントロールではサポートされていませんね。
    小野さまからもあるように、SqlDataSourceコントロールであれば更新可能ですね。
    一番簡単なのは、データソースの構成ウィザードの"Selectステートメントの構成"画面の[詳細設定]ボタン押下後、
    "INSERT,UPDATE・・・ステートメントの生成"チェックボックスをオンにする事でしょうか。
    MCITP(Database Developer/Database Administrator) MCPD(Web Developer) MCTS(SQL Server 2005/Web Applications/Windows Applications)
    2009年6月19日 2:23
  • XmlDataSource コントロールは読み取り専用で使うのが通常の使い方で、データを編集するには特殊な処理をしないといけません。

     XmlDataSource クラス (System.Web.UI.WebControls)
     http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.xmldatasource(VS.80).aspx

    この説明の中に XmlDataSource コントロールの編集機能の制限が書かれています。
    また次の記事の最後には「また、XmlDataSource コントロールは、読み取り専用データ ソースです。このため、編集可能な GridView コントロールに対して、XmlDataSource を使用することはできません。」という一文が。

     ASP.NET 2.0 GridView サンプル - DataSource コントロールによるデータ アクセス
     http://msdn.microsoft.com/ja-jp/library/aa479341.aspx
    2009年6月19日 3:00

  • 早速の返信ありがとうございます。
    しかし残念ながらこちらではDBを「SQL」にした場合でも、

    UpdateCommand が指定されない限り、更新操作はデータ ソース 'SqlDataSource1' によってサポートされません。

    というエラーが返ってきてしまいます。(XMLとエラー文が違います)
    ノブヒデさんは、
    Protected Sub GridView1_RowUpdated~
    のイベント文をどのようにお書きになったのでしょうか?

    また、後述のチェックボタンについてですが、チェックできない状態になっていました。

    いろいろお手数をかけすいません。

    2009年6月19日 3:04
  • > また、後述のチェックボタンについてですが、チェックできない状態になっていました。

    もしかして、テーブルに主キーが存在してないんじゃないでしょうか。
    確かその状態だとチェックできなかった気がします。

    ここのチェックができると、UpdateCommandを自動的に生成してくれるはずです。
    あおい情報システム株式会社 小野修司(どっとねっとふぁん)
    2009年6月19日 3:33
  • エラーの文字通り、SqlDataSource に UpdateCommand が指定されていないのではないでしょうか。
    AutoGenerateEditButton プロパティを true にする場合には、UpdateCommand の指定が必須になります。
    詳しくは次の記事をご覧ください。

     ASP.NET 2.0 GridView サンプル - GridView での基本データの編集
     http://msdn.microsoft.com/ja-jp/library/ms972948.aspx

    編集処理をカスタマイズするには、CommandField や TemplateField を使用します。

     GridView Web サーバー コントロール内のデータの変更
     http://msdn.microsoft.com/ja-jp/library/c4245bb4(VS.80).aspx

     
    2009年6月19日 3:35

  • ノブヒデさんは、
    Protected Sub GridView1_RowUpdated~
    のイベント文をどのようにお書きになったのでしょうか?

    また、後述のチェックボタンについてですが、チェックできない状態になっていました。

    いろいろお手数をかけすいません。

    ワカRUN様

    >Protected Sub GridView1_RowUpdated~のイベント文をどのようにお書きになったのでしょうか?
    今回は、.vbにコードを書かずに実装しました。

    手順は以下の通りです。

    ①ダウンロードしたサンプルのaspxにGridViewコントロール(GridView1)をドラッグ&ドロップ。
    ②Gridview1の右上?から"GridViewタスク"の[データソースの選択:]ドロップダウンリスト内の[<新しいデータソース...>]を選択。
    ③データベース構成ウィザード-[データソースの種類を選びます。]にて"データベース"を選択し[OK]。
    ④[データ接続の選択]にて接続を選び、[次へ]。
    ⑤[Selectステートメントの構成]にてテーブル及び列を選択し、[詳細設定]。
    ⑥[INSERT、UPDATE・・・ステートメントの生成]にチェックし、[OK]。
    ⑦[次へ]→[完了]。
    ⑧Gridview1の右上?から"GridViewタスク"の[編集を有効にする]チェックボックスをオンにする。

    後は、ビルドしてDB更新できる事を確認しました。

    小野様からありましたがテーブルに主キーが存在していないとチェックできないのかもしれませんね。
    MCITP(Database Developer/Database Administrator) MCPD(Web Developer) MCTS(SQL Server 2005/Web Applications/Windows Applications)
    • 回答としてマーク ワカRUN 2009年6月19日 5:48
    2009年6月19日 3:55

  • 無事解決いたしました。

    主キーを付け加えたところ、チェック可能になり、
    これにより、自動で編集、選択、削除が可能になりました。

    この場合、特にイベントのソースを加えなくても編集可能にすることができました。
    大切な昼休みの時間を削ってまで返信ありがとうございます。

    GridViewの操作も始めたばかりで、何も分からない中であったので、
    軽く混乱状態ですが、

    1、GridViewのデータベースはSQLが好ましい。(XMLでは一部対応していない)
    2、編集、選択、削除の操作を行う場合には、データベースに主キーを登録し、接続時の詳細設定を行う必要がある。

    のふたつを、頭に叩き込んでおきたいと思います。

    ノブヒデさん、小野さん、連日に渡りありがとうございました。
    今後も宜しくお願い致します。
    2009年6月19日 4:14
  • 少し補足します。

    > 1、GridViewのデータベースはSQLが好ましい。(XMLでは一部対応していない)

    GridViewにDataSourceを結びつけるとコーディングを少なくして動くものを実装できます。

    #DataSourceを使わない方法もありますがいろいろと自分で記述するコーディング量が増えます。

    その中でも、データベースにSQL Serverを利用している場合は、SqlDataSourceを利用するとウィザードで設定するだけでとりあえず表示/編集/削除を行うことができるようになります。
    DataSourceがいろいろ用意されているのは、それぞれ長所短所があるからなので、どういうときに何を利用するのがよいのかは調べてみるといいと思います。

    なお、XMLのようなテキストファイルをASP.NETで利用してしかも書き込みが必要になる場合、実行ユーザの権限とかを気にする必要がでてきますので、そのあたりきちんと理解できるまではテキストファイルを利用しないようにしたほうがいいでしょう。

    > 2、編集、選択、削除の操作を行う場合には、データベースに主キーを登録し、接続時の詳細設定を行う必要がある。

    これはデータベースの使い方を勉強していくとわかると思いますが、テーブルに主キーを設定しないほうがまれです。
    書き込みだけしてたまに参照する程度の、たとえばログをいれておくテーブルなら主キーがなくてもいいかもしれませんが、更新/削除が必要な場合は必須だと思ったほうがいいです。

    以上、蛇足かもしれませんが。


    あおい情報システム株式会社 小野修司(どっとねっとふぁん)
    2009年6月19日 8:31

  • 補足説明ありがとうございます。

    現在SQLデータについて勉強しようと思い、
    ここにあるSQL関連の掲示板を2時間ほど見ていたのですが、
    正直何をいっているのかさっぱりです。

    恐らく根となる基礎知識が無いからだと思います。

    これに懲りて、今から本屋にでも行こうと思っています。
    正直、データベースの種類が複数あるとこ自体に疑問を感じるほどです。

    それではお先に失礼します。

    2009年6月19日 9:16
  • すでに解決されたようなので、いまさらながらのレスですが・・・

    > 1、GridViewのデータベースはSQLが好ましい。(XMLでは一部対応していない)

    「一部対応していない」という意味が、「XmlDataSource コントロールにはレコードの編集機能はない」と
    いうことならその通りですが、編集する手段はあります。

    だたし、それには XML ファイルを操作するクラスを自分で実装しなければなりませんので、少々敷居が高い
    かもしれませんが。

    以下のページにその例が出ています。

    GridView で XML ファイルをデータ ソースとして使いレコードを編集する方法
    http://msdn.microsoft.com/ja-jp/library/cc719241.aspx

    ここの ASP.NET フォーラムにもその話題があります。

    GridViewからのパラメータがnullになってしまいます
    http://social.msdn.microsoft.com/Forums/ja-JP/aspnetja/thread/af69e313-6640-4304-8679-47f59c3c5678

    2009年6月21日 1:49
  • すいません。
    いつもお世話になっています。

    GridViewの編集ボタンを追加する機能はご存知だと思いますが、
    「編集」を押した後に表示される、列の数だけある
    テキストボックスは改行が不可能なのでしょうか?

    先ほどから色々やっていますが、できそうにないので残念です。


    やはり、もともとあるGridViewコントロールで、編集や削除、選択
    といった機能を使うのは、どうも小回りが利かず使いずらいですね。

    それにコントロール名の分からないものが自動で出されるというのは
    困ったものです。
    2009年7月1日 9:32
  • > 「編集」を押した後に表示される、列の数だけある
    > テキストボックスは改行が不可能なのでしょうか?

    HTMLのタグのレベルで考えてみてください。
    改行できなくて当然、ということが理解できるかと思います。

    各列についてテンプレート化し、それぞれのテキストボックスのTextModeプロパティを変更すればTextAreaにすることは可能です。

    > どうも小回りが利かず使いずらいですね。

    どこまでできるかまだ十分に理解されてないからでしょうね。


    あおい情報システム株式会社 小野修司(どっとねっとふぁん)
    2009年7月1日 10:11