none
データグリッドが編集モードにならない RRS feed

  • 質問

  • オラクル上のテーブルをグリッドに表示して
    特定項目のみ、編集可能な状態にして
    データを更新する。

    いろんなサンプルを参考にして
    グリッドの標準機能を使ってやろうとしてますが
    うまくいきません。どうしたらいいでしょうか?

    分からない点

    (1)編集ボタンを押した時にどうやって特定の項目(今回は項目D)のみ
     編集可能な状態に設定するのか? (KEY項目から項目C は読取専用)


    (2) DataGrid1_EditCommand() にどうゆう記述をすればいいのか?
     

      抽出データは以下のようになってます。

      KEY項目,項目A, 項目B, 項目C, 項目D
     
        001,  SONY,  VAIO , NOTE ,150000                               
        002,  NEC ,  VALUE, NOTE ,200000                              
        003,  IBM ,  THINK, NOTE ,180000 

    現在の記述

    '***初期設定***
    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

         
            If IsPostBack Then Exit Sub

            Call TABLE表示()

    End Sub

    '***編集モード***
    Private Sub DataGrid1_EditCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles DataGrid1.EditCommand

            DataGrid1.EditItemIndex = e.Item.ItemIndex
            Call TABLE表示()

    End Sub
                                
    '***テーブル表示***
    Function TABLE表示()

            Dim SQL文
         
            SQL文 = "SELECT * FROM TABLE名"
          
            Dim 接続文字 As String = "Data Source= ORA_SERV;user ID=SUKIMA;PASSWORD=PWD;"

            Dim 接続処理 As New OracleConnection(接続文字)
            接続処理.Open()

            Dim 指令 As New OracleCommand(SQL文, 接続処理)

            Dim 結果 As OracleDataReader = 指令.ExecuteReader()

            DataGrid1.DataSource = 結果
            DataGrid1.DataBind()

            結果.Close()
            接続処理.Close()

    End  function  

     

    開発機
       Win2000pro SP4
        Visual Basic.net 2003
         Oracle9i Client Release 2
         ODP_NET 9_2_0_2_102

    Oracleサ-バ
       Windows2000server
        Oracle8i R8.1.6.3.0

    Webサ-バ
       Win2000pro SP4  

     

    2006年7月8日 3:55

すべての返信

  • EditItemTemplateで、項目Dはテキストボックス、他の項目はラベルで表示すれば良いのではないでしょうか?
    2006年7月8日 4:14
    モデレータ
  • >EditItemTemplateで、項目Dはテキストボックス、他の項目はラベルで表示すれば良いのではないでしょうか?

           テンプレートは未だ、学習してないのですが

           グリッド作成時に初期設定とか出来ないのでしょうか?

            現在は、グリッド - プロパティービルダ - 列を選ぶと

                      実行時に自動的に列を作成する に 

                        チェックが付いてます。

    ちょっと気になる事が1点    

            trapemiya さんのパソコンの時刻は、ずれてないですか?

     

     

     

    2006年7月8日 5:18
  • 手順としては以下のようになります。

    1.「実行時に自動的に列を作成する」のチェックを外してください。
    2.データフィールドから全ての列を選択された列へ持っていってください。
    3.「この列をテンプレート列に変換する」を全ての列について実行して下さい。(下の方に下線付きの青字で表示されています)
    4.プロパティビルダを閉じ、データグリッドのプロパティより「テンプレートの編集」を選択します。
    5.列D以外について、以下を行います。EditItemTemplateにあるテキストボックスを削除し、ツールボックスよりラベルをドラッグ&ドロップして配置します。そのラベルのプロパティで、「連結可能プロパティ」はTextを選択し、Textの連結は、単純連結で、Container ->DataItemより表示するデータを選択します。

    以上のことはプロパティビルダを使わずに、.aspxのHTML側で直接書いてもOKです。慣れてくるとこちらの方が速いです。今回、プロパティビルダを使って、どのようなソースが生成されているか、.aspxのHTMLタブを切り替えて見てみてください。勉強になると思います。

    >trapemiya さんのパソコンの時刻は、ずれてないですか?

    最終投稿日時をUTCからJSTに変更できませんか?
    http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=227057&SiteID=7

    ということなんですね・・・

    2006年7月8日 5:51
    モデレータ
  • >2.データフィールドから全ての列を選択された列へ持っていってください。

          
         画面左に " 使用可能な列(L)"    があってその中に
      連結列、ボタン列、ハイパーリンク列、テンプレート列
      の4つが書いてます。


      この4つを 選択された列(S) に移動って事ですか?
      データフィールド が 何を指すのか、分かりません。


     

    2006年7月8日 7:19
  • プロパティビルダの全般で、データソースを指定されていないのですね。指定すればデータフィールドが出てきます。プロパティビルダやテンプレート列の編集で作成する場合は、.aspxのHTML表示の画面で、テーブルを含んだデータセットが作成されていないければなりません。
    どのように開発されているのかわかりませんので、プロパティビルダを使わず、aspxのHTML表示画面で、 次のように手動で書いてみて下さい。ただし、プロパティビルだで、「実行時に自動的に列を作成する」のチェックは外しておいてください。TEST1が列D、TEST2がその他の列のイメージです。

       <asp:DataGrid id="DataGrid1" style="Z-INDEX: 101; LEFT: 280px; POSITION: absolute; TOP: 48px"
        runat="server" AutoGenerateColumns="False" DataSource="<%# dataSet31 %>">
        <Columns>
            <asp:TemplateColumn HeaderText="TEST1">
                <ItemTemplate>
                    <asp:Label runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.TEST1") %>'>
                    </asp:Label>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:TextBox runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.TEST1") %>'>
                    </asp:TextBox>
                </EditItemTemplate>
            </asp:TemplateColumn>
            <asp:TemplateColumn HeaderText="TEST2">
                <ItemTemplate>
                    <asp:Label id=Label1 runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.TEST2") %>'>
                    </asp:Label>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:Label id=Label2 runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.TEST2") %>'>
                    </asp:Label>
                </EditItemTemplate>
            </asp:TemplateColumn>
        </Columns>
    </asp:DataGrid>

    2006年7月8日 8:53
    モデレータ
  •  trapemiya  さんのサンプルの <Columns> から </Columns> までをアレンジして書いてみました。

    変更項目だjけを書き換えられるようになったのですが、副作用も出てきました。

    DataGrid1_UpdateCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles DataGrid1.UpdateCommand

    の中の 

    PARA1.Text = e.Item.Cells(1).Text
    PARA2.Text = e.Item.Cells(2).Text

    PARA3.Text = e.Item.Cells(n).Text

    上記の変更行(全部)のデータ取得が出来なくなってしまいました。

    trapemiya  さんのサンプルがアップする前に自分で工夫してみました。

    <asp:BoundColumn DataField="読取枠"  HeaderText="読取枠"></asp:BoundColumn>
    <asp:BoundColumn DataField="変更枠"  ReadOnly="True" HeaderText="変更枠"></asp:BoundColumn>

    この場合は最後の変更枠

    PARA3.Text = e.Item.Cells(n).Text

    が読めなくなりました。

    更新ボタン を クリックした時に

    変更行の全データが取得出来れば、この問題は、ほぼ解決です。

     

     


     

    2006年7月8日 10:17
  • CType(e.Item.Cells(3).Controls(1), Label).Text のような形になります。なぜControlsのインデックスが1かというと、Labelの前後には自動的にLiteralコントロールが作成されるからです。このLiteralコントロールは、改行やタブなんかを表現しています。これは何かというと、<EditItemTemplate>から<asp:Label・・・で始まるところまでの空白やタブ、改行を表しています。同様に、もう一つのLiteralコントロールは、・・・/asp:Label>から</EditItemTemplate>までの空白やタブ、改行を表しています。つまり、セルの中は、
    Literalコントロール、Labelコントロール、Literalコントロールの順に並んでいることになります。

    また、Controls(1)ではなく、FindControlを使う方法もあります。

    CType(e.Item.FindControl("Label2"), Label).Text

    2006年7月8日 12:48
    モデレータ
  • trapemiya さんのサンプル を アレンジして張り付けたら
     以下のようになりました。


    <asp:TemplateColumn HeaderText="品名">
      <ItemTemplate>
          <asp:Label id="Label3" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.品名") %>'>
          </asp:Label>
      </ItemTemplate>
      <EditItemTemplate>
          <asp:Label id="Label4" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.品名") %>'>
          </asp:Label>
      </EditItemTemplate>
    </asp:TemplateColumn>
    <asp:TemplateColumn HeaderText="数量">
       <ItemTemplate>
          <asp:Label id="Label5" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.数量") %>'>
           </asp:Label>
       </ItemTemplate>
       <EditItemTemplate>
           <asp:Label id="Label6" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.数量") %>'>
           </asp:Label>
       </EditItemTemplate>
           </asp:TemplateColumn>
    <asp:TemplateColumn HeaderText="単価">
        <ItemTemplate>
            <asp:Label runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.単価") %>' ID="Label7">
            </asp:Label>
        </ItemTemplate>
        <EditItemTemplate>
            <asp:TextBox runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.単価") %>' ID="Textbox2">
            </asp:TextBox>
        </EditItemTemplate>
    </asp:TemplateColumn>

     

     以下の記述の第2パラメタ(Label)で型定義がされてないとエラーが出ました。 

       PARA1.Text = CType(e.Item.Cells(1).Controls(1), label).text
       PARA2.Text = CType(e.Item.Cells(2).Controls(1), Label).Text
       PARA3.Text = CType(e.Item.Cells(3).Controls(1), Label).Text

      PARA1.Text = CType(e.Item.FindControl("Label4"), Label).Text()

      
       第2パラメタの書き方が悪いんですかね?
     
          

    2006年7月8日 23:19
  • コードビハインドなら、
    import System.Web.UI.WebControls
    インラインコードなら、
    <%@ Import Namespace="System.Web.UI.WebControls" %>
    の記述が無いんじゃないでしょうか?

    #ありそうな気もしますが・・・。ところで型定義されていないというエラーはコンパイル時ですか?

    2006年7月9日 0:39
    モデレータ
  • Imports System.Web.UI.WebControls

    を 記述して

    PARA1.Text = CType(e.Item.FindControl("Label4"), Label).Text
    PARA2.Text = CType(e.Item.FindControl("Label6"), Label).Text
    PARA3.Text = CType(e.Item.FindControl("Textbox2"), TextBox).Text

    と書いたら更新行の全データが取得出来ました。
    これで何とかなりそうです。

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

     

    2006年7月9日 4:29