- - PR -
Dataコントロールをネストさせた場合の子のコントロールの値の取得方法について
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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を用いております。 |
|
投稿日時: 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で間違いないですか? |
|
投稿日時: 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変数ように、「処理目的の行」がどこなのか内部にて理解されていないんだと思います。 その点をつついてみようと考えております。 当方、まだまだ初心者であるため、どんなお知恵でもまたご拝借できればと思いますので、よろしくお願い申し上げます。 |
|
投稿日時: 2005-02-13 20:55
私の方法はちと可読性が悪くなるのですが、紹介しておきます。
HTMLビューにて <asp:DataGrid id="Datagrid1" の次にOnItemCommand="Datagrid1_ItemCommand" のように追加します。 Dim DataGrid1 の行は削除します。 Datagrid1_ItemCommandのプロシージャをPublicにし、 Handles以下を削除します。 これで、受け取れませんか? ところで、 ItemTemplate内のコントロールの定義ってできるのでしょうか?>皆様 (Dim宣言) 私も以前やったことあるのですが、もりぞうさんと同じくエラーで おこられました。 |
|
投稿日時: 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さん本当にありがとうございました。これで納期に間に合いそうです。 |
|
投稿日時: 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サンプル集 |
|
投稿日時: 2005-02-14 11:22
AddHandlerする方法が正攻法かもしれません。
Dim宣言できないか、とは、ページの先頭にという意味です。 行ごとにいくつもできるから、無理っぽいですね。 |
1