- PR -

Dataコントロールをネストさせた場合の子のコントロールの値の取得方法について

1
投稿者投稿内容
もりぞう
会議室デビュー日: 2004/04/01
投稿数: 15
投稿日時: 2005-02-13 01:37
こんばんは。いつもお世話になっております。
ちょっと悩んでおりますので、どなたかご教授いただけると幸いです。

DataListのItemTemplate中に、それに関連するレコードを表示させる子となるDataGridを表示させています。
この子DataGridのItemTemplate内にTextBoxなどを配置し、ダイレクトにデータを触れるようにしたいというのが、私の目的です。
親DataListが表示されたときに、子DataGridのコントロール内にデータベースの値を表示させるのは、例えばそれがTextBoxであればそのTextプロパティに
DataBinder.Eval(Container, "DataItem.フィールド名")
を記述すればできるのですが、もしこのTextBoxの値が変更された場合、何らかのイベントを受けてその値を変数に入れるということができません。

Protected WithEvents DataGrid1 As System.Web.UI.WebControls.DataGrid
で子DataGridの存在を宣言し(このときwebフォームデザイナで「コントロールの作成エラー(ID重複)」が出るのも気になるのですが)、DataGrid1のItemTemplateの中にTextBox(ID="Moji")と「更新(CommandName="Koshin")」を埋め込み、
Private Sub DataGrid1_ItemCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles DataGrid1.ItemCommand
if e.commandname="Koshin" then
dim a as string = ctype(e.item.findcontorol("Moji"),textbox).text
end if
End Sub
として、「更新」ボタンを押しても変数aに文字列が入った形跡がありません。
また別の方法で、
Private Sub DataList1_ItemCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataListCommandEventArgs) Handles DataList1.ItemCommand
Dim dg As DataGrid = CType(e.Item.FindControl("DataGrid1"), DataGrid)
Dim bt As Button = CType(dg.SelectedItem.FindControl("Koshin"), Button)
If dg.SelectCommandName = "BtnDataAdd" Then
Dim aaa As String = CType(dg.SelectedItem.FindControl("Moji"), TextBox).Text
End If
End Sub
のように、「選択された親DataListの中のさらに選択された子DataGridの中のTextBoxの値を取得する」ということがしたいとすると、dim bt〜の箇所でインスタンスエラーが出てしまいます。ここで、行き詰まりました。
どうか、よろしくお願い申し上げます。

VS.NET2003でVBを用いております。
Lin
ベテラン
会議室デビュー日: 2004/11/08
投稿数: 50
投稿日時: 2005-02-13 17:54
>dim a as string = ctype(e.item.findcontorol("Moji"),textbox).text
>end if
>End Sub
>として、「更新」ボタンを押しても変数aに文字列が入った形跡がありません。

このプロシージャの中に処理は入ってきてますか?

>dim bt〜の箇所でインスタンスエラーが出てしまいます。

dg(データグリッド)がFindできていないのではないでしょうか。
DataGrid1で間違いないですか?
もりぞう
会議室デビュー日: 2004/04/01
投稿数: 15
投稿日時: 2005-02-13 20:20
Linさん、ご返答ありがとうございます。

>このプロシージャの中に処理は入ってきてますか?

ご指摘の通りです。このMojiという名のTextBoxをわざと、
dim a as string = ctype(e.item.findcontorol("Moja"),textbox).text
などとして、宣言されていないコントロール名にしても、本来ならインスタンスエラーが出るはずなのに、何も出ません(「更新」ボタンを押してもただポストバックされるだけです)。ということは、ここに処理が渡っていないということですよね。
ネストされたDataコントロールのイベントコマンドをどうやって渡せばよいのか、というのが一つの課題です。そもそもHandleに子Dataコントロールを定義すべきではないのでしょうか。

>dg(データグリッド)がFindできていないのではないでしょうか。
>DataGrid1で間違いないですか?

変数dgにDataGrid1が入っていることは確認できました。
ここでの誤りは、おそらく
Dim bt As Button = CType(dg.SelectedItem.FindControl("Koshin"), Button)
の、SelectedItemなんだと思います。
DataGridの予約プロシージャのe変数ように、「処理目的の行」がどこなのか内部にて理解されていないんだと思います。
その点をつついてみようと考えております。
当方、まだまだ初心者であるため、どんなお知恵でもまたご拝借できればと思いますので、よろしくお願い申し上げます。
Lin
ベテラン
会議室デビュー日: 2004/11/08
投稿数: 50
投稿日時: 2005-02-13 20:55
私の方法はちと可読性が悪くなるのですが、紹介しておきます。
HTMLビューにて
<asp:DataGrid id="Datagrid1"
の次にOnItemCommand="Datagrid1_ItemCommand"
のように追加します。
Dim DataGrid1 の行は削除します。
Datagrid1_ItemCommandのプロシージャをPublicにし、
Handles以下を削除します。
これで、受け取れませんか?

ところで、
ItemTemplate内のコントロールの定義ってできるのでしょうか?>皆様
(Dim宣言)
私も以前やったことあるのですが、もりぞうさんと同じくエラーで
おこられました。
もりぞう
会議室デビュー日: 2004/04/01
投稿数: 15
投稿日時: 2005-02-14 00:16
Linさんありがとうございました。
イベントは、ボタンだけで発生させるものではないのですね。
盲点でした。本当にありがとうございます。

>ItemTemplate内のコントロールの定義ってできるのでしょうか?>皆様

一階層のDataコントロールであれば、ItemDataBoundプロシージャなどで
If e.Item.ItemType = ListItemType.AlternatingItem Or e.Item.ItemType = ListItemType.Item Then
Dim AAA As TextBox = CType(DataGrid1.FindControl("TextBox1"), TextBox)
End If
で、コントロール自体を宣言することができました(If文が抜けると怒られてしまいます)。

おっしゃるご意図とは違っていますでしょうか…。

何はともあれ、Linさん本当にありがとうございました。これで納期に間に合いそうです。
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2005-02-14 06:22
ご質問と直接関係ありませんがDataコントロールをネストさせる
サンプルを作成しました。よろしければ参考にしてください。

DataListにDataGridをネスト
http://www.friendlysw.com/samples/articles/deny/030529-3.aspx

DataListにDataListをネスト
http://www.friendlysw.com/samples/articles/deny/030606-1.aspx

DataListに複数のDataGridをネスト
http://www.friendlysw.com/samples/articles/deny/030704-1.aspx

DataListに受注集計/明細を表示
http://www.friendlysw.com/samples/articles/deny/030729-1.aspx

得意先/受注/受注明細をネストさせる
http://www.friendlysw.com/samples/articles/allow/030905-3.aspx

DataコントロールをネストさせてTreeView風に表示
http://www.friendlysw.com/samples/articles/deny/030828-1.aspx

_________________
ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集
Lin
ベテラン
会議室デビュー日: 2004/11/08
投稿数: 50
投稿日時: 2005-02-14 11:22
AddHandlerする方法が正攻法かもしれません。

Dim宣言できないか、とは、ページの先頭にという意味です。
行ごとにいくつもできるから、無理っぽいですね。
1

スキルアップ/キャリアアップ(JOB@IT)