none
DropDownListにデータバインドしてComboBoxにする場合 RRS feed

  • 質問

  • VS2010 SQLserver2008 VB

    上記タイトルの実装を行ったのですが、

    参照は以下ページ その3(jquery combobox)

    http://karuakun.wordpress.com/2012/02/17/jqueryui%E3%81%AEautocomplete%E3%81%A8asp-net%E3%81%AE%E9%80%A3%E6%90%BA/

    上記は新規空ページで作成しました。動作も確認済み

    やりたいこと

    ・上記の応用でMasterPageを使用したFormView内でjqueryを使用する際のDropDownListIDの拾い方(aspx)

        <script type="text/javascript">
            $(function () {
                $("#<%= DropDownList1.ClientID %>").combobox();
            });
        </script>
    太字部分の取得方法

    ・FormView InsertItemTemplete内に実装するためのDropDownList(ComboBox)のコントロール値取得および、データソースの指定方法(VB)

    Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
            If Not IsPostBack Then
                DropDownList1.DataSource = SqlDataSource1()
                DropDownList1.DataBind()
            End If
        End Sub
    太字部分の取得方法

    以上ご教授お願いいたします

    2012年4月10日 23:57

回答

  • FormViewの中にあるコントロールをどうこうするなら、FindControlするしかなわけで、こうなるかな。

        <asp:FormView runat="server" ID="FormView1">
            <ItemTemplate>
                <fieldset>
                    <legend>ASP.NETのTextBoxをAutoCompleteにする。</legend>
                    <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Item") %>' />
                    <script type="text/javascript">
                        $(function () {
                            var dataSource = ["かるあ", "かるあくん", "かるい", "かるかん", "かるすぎる"];
                            $('#<%= FormView1.FindControl("TextBox1").ClientID %>').autocomplete({ source: dataSource });
                        });
                    </script>
                </fieldset>
            </ItemTemplate>
        </asp:FormView>

    DropDownListに対するデータのバインドも同様です。

    FindControlして、出てきたDropDownListにデータバインドしてください。


    • 編集済み かるあ 2012年4月11日 1:37
    • 回答としてマーク kazukazu2002 2012年4月13日 2:55
    2012年4月11日 1:29
  • ComboBoxではなく、ajax autocompleteextenderを使用することにしました。

    よって、この質問自体と異なる為、閉じさせていただきます。

    勉強になりました。ありがとうございます。

    • 回答としてマーク kazukazu2002 2012年4月13日 2:54
    2012年4月13日 2:54

すべての返信

  • FormViewの中にあるコントロールをどうこうするなら、FindControlするしかなわけで、こうなるかな。

        <asp:FormView runat="server" ID="FormView1">
            <ItemTemplate>
                <fieldset>
                    <legend>ASP.NETのTextBoxをAutoCompleteにする。</legend>
                    <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Item") %>' />
                    <script type="text/javascript">
                        $(function () {
                            var dataSource = ["かるあ", "かるあくん", "かるい", "かるかん", "かるすぎる"];
                            $('#<%= FormView1.FindControl("TextBox1").ClientID %>').autocomplete({ source: dataSource });
                        });
                    </script>
                </fieldset>
            </ItemTemplate>
        </asp:FormView>

    DropDownListに対するデータのバインドも同様です。

    FindControlして、出てきたDropDownListにデータバインドしてください。


    • 編集済み かるあ 2012年4月11日 1:37
    • 回答としてマーク kazukazu2002 2012年4月13日 2:55
    2012年4月11日 1:29
  • かるあさん御返答ありがとうございます。

    FindControlについては、私も勉強の中で存じ上げているのですが、MasterPageを使用した状態だと、見つけてくれないんです。

    また、パーサー エラー メッセージ: System.Web.UI.WebControls.ListItemCollection には 'System.Web.UI.WebControls.ListItem' 型の項目を指定しなければなりません。'script' の型は 'System.Web.UI.HtmlControls.HtmlGenericControl' です。

    が出てしまい、FormViewの表示もできない状態です。

    またVBの取得方法も判らずじまいです。どうか助けてください

    2012年4月11日 1:42
  • 単純にFormView中のDropDownListにデータバインドしたいなら、わざわざコードで引っ張り出して上げる必要は無いですよ。

    ASPX側でこんなふうに定義されているなら

        <asp:FormView runat="server" ID="FormView1">
            <ItemTemplate>
                <asp:DropDownList runat="server" ID="DropDownList1" 
                                  DataSource='<%# Eval("DropDownBoxDataSource") %>'
                                  DataTextField="Text"
                                  DataValueField="Value"
                                  SelectedValue='<%# Eval("DropDownSelectedValue") %>'/>
            </ItemTemplate>
        </asp:FormView>

    VB側では、FormViewにこんな感じにバインドすればいい

            Dim dataSource = New With {
                .DropDownBoxDataSource = {
                        New With {.Text = "あいうえお", .Value = "1"},
                        New With {.Text = "12345", .Value = "2"}
                    },
                .DropDownSelectedValue = "2"
            }
            FormView1.DataSource = {dataSource}
            FormView1.DataBind()

    2012年4月11日 1:46
  • FindControlについては、私も勉強の中で存じ上げているのですが、MasterPageを使用した状態だと、見つけてくれないんです。

    そんなことはないはずです。

    もしかしたらkazukazu2002さんのプロジェクトは、作っていく中でいろんな問題をはらんでいるかもしれません。

    まずは新規で単純な構成のWebプロジェクトを作って試すことから確認を初めてはどうでしょう。


    また、パーサー エラー メッセージ: System.Web.UI.WebControls.ListItemCollection には 'System.Web.UI.WebControls.ListItem' 型の項目を指定しなければなりません。'script' の型は 'System.Web.UI.HtmlControls.HtmlGenericControl' です。

    これは、head要素ないにScriptを書いているからじゃないですか?

    2012年4月11日 1:55
  • かるあ様 御返答ありがとうございます。

    パーサーエラーは解決いたしました。ありがとうございます。

    以下最初に頂いたものからの流用

    aspx

    <fieldset>
    <asp:DropDownList ID="DropDownList_machineID" runat="server" 
    DataSourceID="SqlDataSource14" DataTextField="machine_name" 
    DataValueField="machineID" AutoPostBack="True" >
    </asp:DropDownList>
    <script type="text/javascript">
            $(function () {
                $("#<%= FormView_shop_machine.FindControl("DropDownList_machineID").ClientID %>").combobox();
            });
    </script>
    </fieldset>

    VB

        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            If Not IsPostBack Then
                Dim ddl As DropDownList = CType(FormView_shop_machine.FindControl("DropDownList_machineID"), DropDownList).DataSource = GetDataSource()
                FormView_shop_machine.FindControl("DropDownList_machineID").DataBind() End If End Sub

    コンパイル エラー メッセージ: BC30456: 'DataSource' は 'System.Web.UI.Control' のメンバーではありません。

    この状態で動きません。なぜでしょうか?



    2012年4月11日 4:49
  • コンパイル エラー メッセージ: BC30456: 'DataSource' は 'System.Web.UI.Control' のメンバーではありません。

    エラーメッセージのとおりです。

    FindControlメソッドについて調べてください。

    2012年4月11日 5:52
  • すみません。調べたのですが解りませんので、お教えいただけないでしょうか?
    空ページから、かるあさんの提示していたcombobox(こちらのデータベース)は動かせたのに、できないのがなぜなのでしょう

    2012年4月11日 6:56
  • タイトルを適切に付けられませんか? この内容ですと「ClientID を取
    得してクライアントスクリプトに設定する方法」というようなタイトルに
    なると思いますが。


    > $("#<%= FormView_shop_machine.FindControl("DropDownList_machineID").ClientID %>").combobox

    この部分、かるあさんのコードとどこが違うか良く見てみましょう。

    > DataSourceID="SqlDataSource14"

    これがあれば、Page_Load メソッドのコードは一切必要ないはずです。

    2012年4月11日 12:33
  • VB

        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            If Not IsPostBack Then
                Dim ddl As DropDownList = CType(FormView_shop_machine.FindControl("DropDownList_machineID"), DropDownList).DataSource = GetDataSource()
                FormView_shop_machine.FindControl("DropDownList_machineID").DataBind() End If End Sub

    コンパイル エラー メッセージ: BC30456: 'DataSource' は 'System.Web.UI.Control' のメンバーではありません。

    この状態で動きません。なぜでしょうか?

    直に修正されたためか、意味の分からないコードになってしまっています。

    kazukazu2002さんがどこまで理解しているのかわからないので、回答するのが難しいのですが、FindControlメソッドで返却されるのはControlですよねDataSourceプロパティーを参照するなら、DropDownListにキャストしてあげればいいんじゃないですか?

    修正済みのコードだとCTypeしてるんですよね。まぁこれだと、。コンパイルエラーなわけですが。ただ、なぜかDataBindの時はもう一度FindControlしたものに対してDataBindメソッドを呼び出しているという。。。うーん。

    2012年4月12日 0:27
  • SurferOnWww様

    御返答ありがとうございます。

    以下で試したところ(Page_Load メソッドは削除しました)

    <script type="text/javascript">
    $(function () {
    $("#<%=FormView_shop_machine.FindControl("DropDownList_machineID").ClientID %>").combobox({DataSourceID="SqlDataSource14" });
    });
    </script>

    ビルドエラーで型'WebService'を作成できませんでした

    WebServiceを作成とありますが、そもそもなぜ作成するのでしょうか?



    2012年4月12日 2:12
  • かるあ様

    御返答ありがとうございます。

    正直、自分が勉強できているのかどうかもわからなくなりました。

    どういうコードになるのかお教えいただけると助かります。

    動いた後になぜ動くのかを知りたいです。

    2012年4月12日 2:15
  • 僕の返信に対して、どこがわかりませんでしたか?

    FindControlメソッドで返却されるのはControlですよねDataSourceプロパティーを参照するなら、DropDownListにキャストしてあげればいいんじゃないですか?

    修正済みのコードだとCTypeしてるんですよね。まぁこれだと、。コンパイルエラーなわけですが。ただ、なぜかDataBindの時はもう一度FindControlしたものに対してDataBindメソッドを呼び出しているという。。。うーん。

    • キャストという概念はわかりますか?
    • FindControlした結果のインスタンスのままでは、DataSourceプロパティーにアクセスできない理由はわかりますか?
    • DropDownListクラスとControlクラスの継承関係は理解していますか?

    kazukazu2002さんの質問スレッドが毎回伸びてしまうのは、回答する側がkazukazu2002がどこまで理解できているかを測りかねているからではないでしょうか。このあたりを解決しようとする気はありますか?

    2012年4月12日 2:33
  • 解決をしたいです。また、理解もしたいです。

    >キャストという概念はわかりますか?

    >FindControlした結果のインスタンスのままでは、DataSourceプロパティーにアクセスできない理由はわかりますか?

    >DropDownListクラスとControlクラスの継承関係は理解していますか?

    正直現段階で、VS2010を本を見ながら、ないし、WEBからの情報をもとに組み立てているだけで、根本的な知識はほぼ無いに等しいです。

    今まで教えていただいたものは、その都度コードが何を示しているか調べて理解していると思うのですが、言葉のやり取りではよくわからない事が多いです。

    2012年4月12日 2:41
  • 正直現段階で、VS2010を本を見ながら、ないし、WEBからの情報をもとに組み立てているだけで、根本的な知識はほぼ無いに等しいです。

    今まで教えていただいたものは、その都度コードが何を示しているか調べて理解していると思うのですが、言葉のやり取りではよくわからない事が多いです。

    Web関連の技術は、単純なことでも覚える範囲が多くて大変ですよね。

    1. キャストという概念はわかりますか?キャストとは何ですか?

    2. FindControlが返却する型は何ですか?FindControlが返すインスタンスのままでは、DataSourceプロパティーにアクセスできない理由はわかりますか?

    3. DropDownListクラスとControlクラスの継承関係は理解していますか?ControlクラスのインスタンスをDropDownListクラスにキャストするとどうなりますか?

    上の質問についてはどうですか?番号ごとに質問について回答してみてください。

    2012年4月12日 3:51
  • 1は型変換のことですよね。以前DropDownListに設置したDateSourceから選択した値をFormViewのDateSourceにInsertする値にするというものをしたときに覚えました。

    2私の場合はFindControlでFormView内のDropDownListのコントロールIDを見つけるんですよね。

    >FindControlが返すインスタンスのままでは、DataSourceプロパティーにアクセスできない理由はわかりますか?

    解りません。インスタンスのままという意味がわからないです。

    >3DropDownListクラスとControlクラスの継承関係は理解していますか?ControlクラスのインスタンスをDropDownListクラスにキャストするとどうなりますか?

    上記同様解りません。
    2012年4月12日 4:09
  • なんかもう、タイトルと内容が全く違うものになって来ましたね。

    1は型変換のことですよね。以前DropDownListに設置したDateSourceから選択した値をFormViewのDateSourceにInsertする値にするというものをしたときに覚えました。

    そうです。今回も同様の問題です。というか、ここがわかっているなら、「コンパイル エラー メッセージ: BC30456: 'DataSource' は 'System.Web.UI.Control' のメンバーではありません。」ってエラーメッセージの解決方法は自分でわかるんじゃないかと思うんですが。。。

    2私の場合はFindControlでFormView内のDropDownListのコントロールIDを見つけるんですよね。

    >FindControlが返すインスタンスのままでは、DataSourceプロパティーにアクセスできない理由はわかりますか?

    解りません。インスタンスのままという意味がわからないです。

    FindControlメソッドの結果はControlクラスのインスタンスです。ControlクラスにはDataSourceなんてプロパティーはないのでコンパイルエラーになります。

    DropDownListクラスとして扱うには、ControlクラスからDropDownListクラスにキャストする必要があります。

    >3DropDownListクラスとControlクラスの継承関係は理解していますか?ControlクラスのインスタンスをDropDownListクラスにキャストするとどうなりますか?

    上記同様解りません。

    なぜControlクラスを異なる型であるDropDownListクラスに変換できるのでしょうか。これはDropDownListがControlを継承しているからです。

    なんとなく他の人にも言われたことがあるのかもしれませんが、ここまで来るとVS2010とかASP.NETとかではなくてその前段階の話しなので、オブジェクト指向の基礎的な入門書を一度読んだほうが、今後の開発がスムーズに進むと思いますよ。

    2012年4月12日 11:23
  • ComboBoxではなく、ajax autocompleteextenderを使用することにしました。

    よって、この質問自体と異なる為、閉じさせていただきます。

    勉強になりました。ありがとうございます。

    • 回答としてマーク kazukazu2002 2012年4月13日 2:54
    2012年4月13日 2:54