質問者
データグリッドが編集モードにならない

質問
-
オラクル上のテーブルをグリッドに表示して
特定項目のみ、編集可能な状態にして
データを更新する。いろんなサンプルを参考にして
グリッドの標準機能を使ってやろうとしてますが
うまくいきません。どうしたらいいでしょうか?分からない点
(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 SubCall TABLE表示()
End Sub
'***編集モード***
Private Sub DataGrid1_EditCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles DataGrid1.EditCommandDataGrid1.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_102Oracleサ-バ
Windows2000server
Oracle8i R8.1.6.3.0Webサ-バ
Win2000pro SP4
すべての返信
-
手順としては以下のようになります。
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ということなんですね・・・
-
プロパティビルダの全般で、データソースを指定されていないのですね。指定すればデータフィールドが出てきます。プロパティビルダやテンプレート列の編集で作成する場合は、.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> -
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).TextPARA3.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
が読めなくなりました。
更新ボタン を クリックした時に
変更行の全データが取得出来れば、この問題は、ほぼ解決です。
-
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
-
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).TextPARA1.Text = CType(e.Item.FindControl("Label4"), Label).Text()
第2パラメタの書き方が悪いんですかね?
-