トップ回答者
aspxファイル内でDatarowをカラム名で参照できない

質問
-
<asp:Label ID="Label1" runat="server" Text="Label" CssClass="lblTextTitle">氏名/会社名:</asp:Label><asp:TextBox ID="CpName" runat="server" Columns="45" Text="<%#dtDefault.Columns.IndexOf("CpName") %>" ></asp:TextBox>
上記のText="<%#dtDefault.rows(0).item("CompName")%>" のようにカラム名で指定すると「サーバータグが正しく形成されていません。」とコンパイルエラーとなってしまいますが、Text="<%#dtDefault.rows(0).item(0)%>" のようにインデックスで指定すると正しく表示されます。
aspx.vbファイルでは使用できてaspxファイルでは使用できないような関数の制限等があるのでしょうか?
どうか詳しい方ご教授ください。どうぞよろしくお願いいたします。
回答
-
いろいろ経緯がありそうですが、将来、このスレッドを検索してきた人の役に立つように、質問に回答を付けていくこともこのフォーラムの目的ですので、回答を続けます。
以下のようなことではないでしょうか?
ASP.NETでダブルクォーテーションのエスケープ(パーサーエラー :サーバー タグが正しく形成されていません。)
http://aoki1210.hatenablog.jp/entry/20110105/p1つまり、データバインド式全体をダブルクォートではなくシングルクォートでくくります。ダブルクォートでくくると、データバインド式の中にあるダブルクォートと干渉してしまいます。
★良い回答には質問者は回答済みマークを、閲覧者は投票を!
- 編集済み trapemiyaModerator 2018年10月25日 7:58 参照先のページが見れなくなった場合でも回答がわかるように回答を追記
- 回答としてマーク nac1234 2018年10月25日 12:05
-
そのメッセージの通りです。DataTableに既定のプロパティの定義が無いからです。既定のプロパティについては以下などを参照して下さい。
VB.NETで「既定のプロパティ」を使用する方法
https://dobon.net/vb/dotnet/beginner/defaultproperty.html上記のページを受けての少し余談になります。
VBは引数付きプロパティを作成することができますが、C#ではできません。しかし、VBの既定の引数付きプロパティ(これが今回問題になっているもの)に相当するものはC#でも作れて、インデクサと呼びます。なお、C#で引数付きプロパティを作成できないはわざとで、メソッドで代用できるからでしょう。★良い回答には質問者は回答済みマークを、閲覧者は投票を!
- 回答としてマーク nac1234 2018年10月26日 1:57
すべての返信
-
マルチポストのようですので、他のポスト先の URL を貼っておきます。
https://teratail.com/questions/154039
質問者さん>
マルチポストの意味が分からなければ、それをキーワードにググってヒットする記事を 2, 3 読んでください。いろいろ意見はあるようですが、まず歓迎されることはなさそうです。それに、このスレッドでは管理者の方から遠慮いただくようにとのお願いも出ています。 -
いろいろ経緯がありそうですが、将来、このスレッドを検索してきた人の役に立つように、質問に回答を付けていくこともこのフォーラムの目的ですので、回答を続けます。
以下のようなことではないでしょうか?
ASP.NETでダブルクォーテーションのエスケープ(パーサーエラー :サーバー タグが正しく形成されていません。)
http://aoki1210.hatenablog.jp/entry/20110105/p1つまり、データバインド式全体をダブルクォートではなくシングルクォートでくくります。ダブルクォートでくくると、データバインド式の中にあるダブルクォートと干渉してしまいます。
★良い回答には質問者は回答済みマークを、閲覧者は投票を!
- 編集済み trapemiyaModerator 2018年10月25日 7:58 参照先のページが見れなくなった場合でも回答がわかるように回答を追記
- 回答としてマーク nac1234 2018年10月25日 12:05
-
できました!!!
ありがとうございます!本当に助かりました!
教えてもらった通りシングルクオテーションにして次のようにしたらできました。
<asp:TextBox ID="CpName" runat="server" Columns="45" Text='<%#dtDefault.rows(0)("CompName") %>'
ついでで申し訳ございませんが、aspx.vbでは可能なように、下記のようにrows(0)ではなく直接データテーブルにインデックス指定した場合、「クラスdatatableには既定のプロパティはないためインデックスの処理は実行できません」とコンパイルエラーになってしまいました。どうしてかご存じないでしょうか?すいませんがよろしくお願いいたします。
Text='<%#dtDefault(0)("CompName") %>'
-
そのメッセージの通りです。DataTableに既定のプロパティの定義が無いからです。既定のプロパティについては以下などを参照して下さい。
VB.NETで「既定のプロパティ」を使用する方法
https://dobon.net/vb/dotnet/beginner/defaultproperty.html上記のページを受けての少し余談になります。
VBは引数付きプロパティを作成することができますが、C#ではできません。しかし、VBの既定の引数付きプロパティ(これが今回問題になっているもの)に相当するものはC#でも作れて、インデクサと呼びます。なお、C#で引数付きプロパティを作成できないはわざとで、メソッドで代用できるからでしょう。★良い回答には質問者は回答済みマークを、閲覧者は投票を!
- 回答としてマーク nac1234 2018年10月26日 1:57
-
既定のプロパティはクラスに対して定義しますから、どこからそのクラスを使おうと同じことになります。aspx.vbの方、つまりコードビハインド側ではできているということでよろしいでしょうか? おそらくできていなくて、失礼ながらnac1234さんの勘違いではなかろうかと思います。コードビハインドのコードを見せていただけませんでしょうか?
ちなみに、dtDefault(0)と書けば、既定のプロパティになりますし、dtDefault.Rows(0)と書けばdtDefaultデータテーブルにおける行のコレクションの1行目ということになります。
★良い回答には質問者は回答済みマークを、閲覧者は投票を!
-
ご回答ありがとうございます。
短いコードですが、以下のようにしてもビルドもできますし、値も取得できます。
同じクラス参照しているのに不思議ですね。
---------------------------------------------------------------------------------------
Private Sub Shopping_Load(sender As Object, e As EventArgs) Handles Me.Load
Dim dtDefault As DataTable = GetDt("Select * from SalesInfo")
Dim strCompName As String = dtDefault(0)("CompName")
Page.DataBind()End Sub