none
aspxファイル内でDatarowをカラム名で参照できない RRS feed

  • 質問

  • <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ファイルでは使用できないような関数の制限等があるのでしょうか?
    どうか詳しい方ご教授ください。どうぞよろしくお願いいたします。

    2018年10月25日 1:31

回答

  • いろいろ経緯がありそうですが、将来、このスレッドを検索してきた人の役に立つように、質問に回答を付けていくこともこのフォーラムの目的ですので、回答を続けます。

    以下のようなことではないでしょうか?

    ASP.NETでダブルクォーテーションのエスケープ(パーサーエラー :サーバー タグが正しく形成されていません。)
    http://aoki1210.hatenablog.jp/entry/20110105/p1

    つまり、データバインド式全体をダブルクォートではなくシングルクォートでくくります。ダブルクォートでくくると、データバインド式の中にあるダブルクォートと干渉してしまいます。


    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    • 編集済み trapemiyaModerator 2018年10月25日 7:58 参照先のページが見れなくなった場合でも回答がわかるように回答を追記
    • 回答としてマーク nac1234 2018年10月25日 12:05
    2018年10月25日 7:40
    モデレータ
  • そのメッセージの通りです。DataTableに既定のプロパティの定義が無いからです。既定のプロパティについては以下などを参照して下さい。

    VB.NETで「既定のプロパティ」を使用する方法
    https://dobon.net/vb/dotnet/beginner/defaultproperty.html

    上記のページを受けての少し余談になります。
    VBは引数付きプロパティを作成することができますが、C#ではできません。しかし、VBの既定の引数付きプロパティ(これが今回問題になっているもの)に相当するものはC#でも作れて、インデクサと呼びます。なお、C#で引数付きプロパティを作成できないはわざとで、メソッドで代用できるからでしょう。


    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    • 回答としてマーク nac1234 2018年10月26日 1:57
    2018年10月26日 1:17
    モデレータ
  • 私の方でも確認してみましたが、nac1234さんと同じ結果になりました。
    データバインドという処理を行うデータバインド式では、このような制限があるのでしょうね。
    文献を探してみましたが、見つけることができませんでした。すみません。

    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    • 回答としてマーク nac1234 2018年10月30日 1:14
    2018年10月29日 8:56
    モデレータ

すべての返信

  • マルチポストのようですので、他のポスト先の URL を貼っておきます。

    https://teratail.com/questions/154039

    質問者さん>
    マルチポストの意味が分からなければ、それをキーワードにググってヒットする記事を 2, 3 読んでください。いろいろ意見はあるようですが、まず歓迎されることはなさそうです。それに、このスレッドでは管理者の方から遠慮いただくようにとのお願いも出ています。

    2018年10月25日 2:23
  • いろいろ経緯がありそうですが、将来、このスレッドを検索してきた人の役に立つように、質問に回答を付けていくこともこのフォーラムの目的ですので、回答を続けます。

    以下のようなことではないでしょうか?

    ASP.NETでダブルクォーテーションのエスケープ(パーサーエラー :サーバー タグが正しく形成されていません。)
    http://aoki1210.hatenablog.jp/entry/20110105/p1

    つまり、データバインド式全体をダブルクォートではなくシングルクォートでくくります。ダブルクォートでくくると、データバインド式の中にあるダブルクォートと干渉してしまいます。


    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    • 編集済み trapemiyaModerator 2018年10月25日 7:58 参照先のページが見れなくなった場合でも回答がわかるように回答を追記
    • 回答としてマーク nac1234 2018年10月25日 12:05
    2018年10月25日 7:40
    モデレータ
  • できました!!!

    ありがとうございます!本当に助かりました!

    教えてもらった通りシングルクオテーションにして次のようにしたらできました。

    <asp:TextBox ID="CpName" runat="server" Columns="45"  Text='<%#dtDefault.rows(0)("CompName") %>'

    ついでで申し訳ございませんが、aspx.vbでは可能なように、下記のようにrows(0)ではなく直接データテーブルにインデックス指定した場合、「クラスdatatableには既定のプロパティはないためインデックスの処理は実行できません」とコンパイルエラーになってしまいました。どうしてかご存じないでしょうか?すいませんがよろしくお願いいたします。

      Text='<%#dtDefault(0)("CompName") %>'

    2018年10月25日 11:37
  • そのメッセージの通りです。DataTableに既定のプロパティの定義が無いからです。既定のプロパティについては以下などを参照して下さい。

    VB.NETで「既定のプロパティ」を使用する方法
    https://dobon.net/vb/dotnet/beginner/defaultproperty.html

    上記のページを受けての少し余談になります。
    VBは引数付きプロパティを作成することができますが、C#ではできません。しかし、VBの既定の引数付きプロパティ(これが今回問題になっているもの)に相当するものはC#でも作れて、インデクサと呼びます。なお、C#で引数付きプロパティを作成できないはわざとで、メソッドで代用できるからでしょう。


    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    • 回答としてマーク nac1234 2018年10月26日 1:57
    2018年10月26日 1:17
    モデレータ
  • trapemiyaさん、

    たびたびありがとうございます。目から鱗です。いろんなクラスでも出てくるItem要素の意味がようやく分かりました!これでよりプログラミンしやすくなります。本当に感謝です。ところでaspx.vbの方ではは既定のプロパティになっていて(インデックス参照ができるので)、aspxファイルのほうでは既定のプロパティになっていないということでしょうか?同じクラスを参照していると思うのでそこが大変不思議です。何度も何度もすいませんが、もしよろしかったらこちらも教えて頂けませんでしょうか?

    2018年10月26日 1:56
  • 既定のプロパティはクラスに対して定義しますから、どこからそのクラスを使おうと同じことになります。aspx.vbの方、つまりコードビハインド側ではできているということでよろしいでしょうか? おそらくできていなくて、失礼ながらnac1234さんの勘違いではなかろうかと思います。コードビハインドのコードを見せていただけませんでしょうか?

    ちなみに、dtDefault(0)と書けば、既定のプロパティになりますし、dtDefault.Rows(0)と書けばdtDefaultデータテーブルにおける行のコレクションの1行目ということになります。


    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    2018年10月26日 6:02
    モデレータ
  • ご回答ありがとうございます。

    短いコードですが、以下のようにしてもビルドもできますし、値も取得できます。

    同じクラス参照しているのに不思議ですね。

    ---------------------------------------------------------------------------------------

        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

    2018年10月29日 5:35
  • 私の方でも確認してみましたが、nac1234さんと同じ結果になりました。
    データバインドという処理を行うデータバインド式では、このような制限があるのでしょうね。
    文献を探してみましたが、見つけることができませんでした。すみません。

    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    • 回答としてマーク nac1234 2018年10月30日 1:14
    2018年10月29日 8:56
    モデレータ
  • 御親切に色々ありがとうございました!大変勉強になりました m(_ _)m
    2018年10月30日 1:15