locked
リスト内のアイテムが20件を超えるとコンボボックスの動きがおかしい RRS feed

  • 質問

  • こんにちは。

    SharePoint 2010で
    カスタムリスト内のアイテムを元に、ある画面でコンボボックス(参照列として使用)の選択候補にしようとしています。
    しかし、リスト内のアイテムが20件を超えるとコンボボックスの動きがなぜか変わってしまいます。

    ・リスト内が20件以下→コンボボックス内のトップ項目が初期表示される。
    ・リスト内が21件以上→初期表示されずブランクとなってしまう。コンボボックスの見た目もちょっと変わっている。

    SharePoint 2007では、リストのアイテムが21件以上の場合も20件以下の場合と同じ動きになるようなサンプルコード(JavaScript)があったのですがSharePoint 2010同じ方法が通用しないようです。

    SharePoint 2010でリストアイテムが20件を超えた場合の簡単な対応方法はありますでしょうか?
    それとも大規模なコーディング or 開発などが必要になってくるのでしょうか?

    ご存知の方、返信お願いします。

    2012年6月6日 4:08

回答

  • 細かなご説明、ありがとうございます。

    で、とりあえず私の2010環境で実験してみました。

    やはり20件でボックスが変わるのは間違いないのですが、どちらもデフォルト値は「(なし)」ですね…

    ただ、私の環境は素のSP2010なので、SPやCUの影響は否定できません。

    yo_tecさんの環境のリビジョンは如何でしょう?

    さて、規定値はさておき、「20件未満」と「20件以上」のソースを見てみると、

    規定値の持ち方が全く違うので、Javascript側でこれを勘案してやれば置換できると思います。

    前者はINPUT配下のOPTIONですが

    <option selected="selected" value="0">(なし)</option>

    後者は inputそのものに指定していますね

    <input name="ctl00$m$g_0eb178a9_5b7d_4a61_9f48_a52280d2aa19$ctl00$ctl05$ctl03$ctl00$ctl00$ctl04$ctl00$ctl01" type="text" value="(なし)" id="ctl00_m_g_0eb178a9_5b7d_4a61_9f48_a52280d2aa19_ctl00_ctl05_ctl03_ctl00_ctl00_ctl04_ctl00_ctl01" class="ms-lookuptypeintextbox" onfocusout="CoreInvoke('HandleLoseFocus')" opt="_Select" title="te" optHid="SPte_Hidden" onkeypress="CoreInvoke('HandleChar')" onkeydown="CoreInvoke('HandleKey')" match="" choices="(なし)|0|1|1|10|10|11|11|12|12|13|13|14|14|15|15|16|16|17|17|18|18|19|19|2|2|20|20|21|21|22|22|23|23|24|24|3|3|4|4|5|5|6|6|7|7|8|8|9|9" onchange="CoreInvoke('HandleChange')" />


    SharePoint/Office365導入検討・運用・活用支援: http://simplesso.jp BLOG: http://sharepointmaniacs.com/

    • 回答としてマーク 山本春海 2012年6月19日 8:45
    2012年6月9日 11:00
  • これは申し訳ないです。確かに「必須」指定したところ、既定値の挙動がご指摘の

    通りになりました。

    で、JS側での勘案方法なのですが…これはもう、どれくらいきちんと作るかによると思います。

    元のスクリプトを知らないので判りませんが、汎用性を考えないので良いのであれば、

    INPUT タグの ID が判っている訳ですから、DOMでその中身を見て、21件以上の

    書式になっていたら VALUE アトリビュートと既定値を書いてやれば良いのではないかと

    思います(試していませんが…)


    SharePoint/Office365導入検討・運用・活用支援: http://simplesso.jp BLOG: http://sharepointmaniacs.com/

    • 回答としてマーク 山本春海 2012年6月19日 8:45
    2012年6月11日 21:24
  • こんにちは、小松です。

    参照列にはこんな機能があったんですね。

    勉強になりました。

    ご所望のスクリプトですが、たとえば、こんな感じのコードで規定値を設定することができます。

    // どうにかして目的の列の要素を取ってくる
    var lookup = GetLookupField();
    
    // 規定値を設定
    var choices = lookup.choices.split('|');
    lookup.value = choices[0];
    CoreInvoke('ShowDropdown', lookup.id);

    詳しくは、こちらに書きましたのでご興味があればどうぞ。

    http://k408.wordpress.com/2012/06/12/sharepoint-2010-%e3%81%ae%e5%8f%82%e7%85%a7%e5%88%97%e3%81%ab%e3%81%af%e3%80%81%e9%81%b8%e6%8a%9e%e9%a0%85%e7%9b%ae%e3%82%92%e3%83%95%e3%82%a3%e3%83%ab%e3%82%bf%e3%81%99%e3%82%8b%e6%a9%9f%e8%83%bd/


    • 編集済み 小松 真也 2012年6月12日 8:56 typo
    • 回答としてマーク yo_tec 2012年6月15日 6:01
    • 回答としてマークされていない yo_tec 2012年6月15日 6:02
    • 回答としてマーク 山本春海 2012年6月19日 8:45
    2012年6月12日 6:41

すべての返信

  • 見てみようと思ったのですが、ご指摘の現象を確認できず…

    参照列の場合、どちらも「(なし)」がデフォルト値になりませんか?

    [ある画面でコンボボックス(参照列として使用)の選択候補にしようとして]とは、どのような

    状況でしょうか?


    SharePoint/Office365導入検討・運用・活用支援: http://simplesso.jp BLOG: http://sharepointmaniacs.com/

    2012年6月6日 11:16
  • 返信ありがとうございます。

    以下にSharePoint 2010での再現手順を書きました。

    ■下ごしらえ
    1.サイトのトップページから『すべてのサイトコンテンツ』をクリック。
    2.『作成』をクリックしカスタムリストを選択。
    3."MST_LIST"という名前でカスタムリストを作成。
    4.『新しいアイテムの追加』をクリックし、タイトルに"1", "2".....など入力していき、適当に20個のアイテムを追加する。
    5.『すべてのサイトコンテンツ』をクリック。
    6.『作成』をクリックしカスタムリストを選択。
    7."DATA_LIST"という名前でカスタムリストを作成。
    8.DATA_LISTの『リストの設定』をクリック。
    9.『列の作成』をクリック。
    10.列名:に"マスター"と入力し、この列の情報の種類:で"参照 (このサイトにある既存の情報)"を選択。
    11.この列への情報の入力を必須にする:を"はい"にする。
    12.情報の取得先:で"MST_LIST"を選択する。
    13.この列:で"タイトル"を選択する。
    14.OKボタンを押下。

    ■操作
    1."DATA_LIST"リストを開く。
    2.『新しいアイテムの追加』をクリック。→"マスター"はコンボボックス形式になっており、"MST_LIST"内のトップアイテムが初期表示されている。(正常動作)
    3."MST_LIST"に21個目のアイテムを追加する。
    4."DATA_LIST"リストを開く。
    5.『新しいアイテムの追加』をクリック。→"マスター"コンボボックスは初期状態でブランクになっており、見た目も何か変わっている。。。(異常動作?)


    データが21件を超えると動作が変わってしまうという現象で非常に困っております。
    何か解決手段は無いものでしょうか。

    よろしくお願いします!

    2012年6月7日 6:54
  • 細かなご説明、ありがとうございます。

    で、とりあえず私の2010環境で実験してみました。

    やはり20件でボックスが変わるのは間違いないのですが、どちらもデフォルト値は「(なし)」ですね…

    ただ、私の環境は素のSP2010なので、SPやCUの影響は否定できません。

    yo_tecさんの環境のリビジョンは如何でしょう?

    さて、規定値はさておき、「20件未満」と「20件以上」のソースを見てみると、

    規定値の持ち方が全く違うので、Javascript側でこれを勘案してやれば置換できると思います。

    前者はINPUT配下のOPTIONですが

    <option selected="selected" value="0">(なし)</option>

    後者は inputそのものに指定していますね

    <input name="ctl00$m$g_0eb178a9_5b7d_4a61_9f48_a52280d2aa19$ctl00$ctl05$ctl03$ctl00$ctl00$ctl04$ctl00$ctl01" type="text" value="(なし)" id="ctl00_m_g_0eb178a9_5b7d_4a61_9f48_a52280d2aa19_ctl00_ctl05_ctl03_ctl00_ctl00_ctl04_ctl00_ctl01" class="ms-lookuptypeintextbox" onfocusout="CoreInvoke('HandleLoseFocus')" opt="_Select" title="te" optHid="SPte_Hidden" onkeypress="CoreInvoke('HandleChar')" onkeydown="CoreInvoke('HandleKey')" match="" choices="(なし)|0|1|1|10|10|11|11|12|12|13|13|14|14|15|15|16|16|17|17|18|18|19|19|2|2|20|20|21|21|22|22|23|23|24|24|3|3|4|4|5|5|6|6|7|7|8|8|9|9" onchange="CoreInvoke('HandleChange')" />


    SharePoint/Office365導入検討・運用・活用支援: http://simplesso.jp BLOG: http://sharepointmaniacs.com/

    • 回答としてマーク 山本春海 2012年6月19日 8:45
    2012年6月9日 11:00
  • 返信ありがとうございます。

    >やはり20件でボックスが変わるのは間違いないのですが、どちらもデフォルト値は「(なし)」ですね…
    作成いただいた参照列は「必須」設定にする必要があります。
    「必須」設定にしないとデフォルト値は「(なし)」となってしまいます。
    お手数おかけしますが、参照列が「必須」設定になっているかご確認いただけませんか?

    >ただ、私の環境は素のSP2010なので、SPやCUの影響は否定できません。
    >yo_tecさんの環境のリビジョンは如何でしょう?
    14.0.6114.5001になります。

    >規定値の持ち方が全く違うので、Javascript側でこれを勘案してやれば置換できると思います。
    SharePoint 2007では、リストのアイテムが21件以上の場合も20件以下の場合と同じ動きになるような
    サンプルコード(JavaScript)があったのですがSharePoint 2010だと同じ方法が通用しないようです。

    Javascript側での勘案の具体策がありましたら、ご提示いただけないでしょうか?

    たびたびで申し訳ありませんが、よろしくお願いします。

    2012年6月11日 6:17
  • これは申し訳ないです。確かに「必須」指定したところ、既定値の挙動がご指摘の

    通りになりました。

    で、JS側での勘案方法なのですが…これはもう、どれくらいきちんと作るかによると思います。

    元のスクリプトを知らないので判りませんが、汎用性を考えないので良いのであれば、

    INPUT タグの ID が判っている訳ですから、DOMでその中身を見て、21件以上の

    書式になっていたら VALUE アトリビュートと既定値を書いてやれば良いのではないかと

    思います(試していませんが…)


    SharePoint/Office365導入検討・運用・活用支援: http://simplesso.jp BLOG: http://sharepointmaniacs.com/

    • 回答としてマーク 山本春海 2012年6月19日 8:45
    2012年6月11日 21:24
  • こんにちは、小松です。

    参照列にはこんな機能があったんですね。

    勉強になりました。

    ご所望のスクリプトですが、たとえば、こんな感じのコードで規定値を設定することができます。

    // どうにかして目的の列の要素を取ってくる
    var lookup = GetLookupField();
    
    // 規定値を設定
    var choices = lookup.choices.split('|');
    lookup.value = choices[0];
    CoreInvoke('ShowDropdown', lookup.id);

    詳しくは、こちらに書きましたのでご興味があればどうぞ。

    http://k408.wordpress.com/2012/06/12/sharepoint-2010-%e3%81%ae%e5%8f%82%e7%85%a7%e5%88%97%e3%81%ab%e3%81%af%e3%80%81%e9%81%b8%e6%8a%9e%e9%a0%85%e7%9b%ae%e3%82%92%e3%83%95%e3%82%a3%e3%83%ab%e3%82%bf%e3%81%99%e3%82%8b%e6%a9%9f%e8%83%bd/


    • 編集済み 小松 真也 2012年6月12日 8:56 typo
    • 回答としてマーク yo_tec 2012年6月15日 6:01
    • 回答としてマークされていない yo_tec 2012年6月15日 6:02
    • 回答としてマーク 山本春海 2012年6月19日 8:45
    2012年6月12日 6:41
  • ご提示ありがとうござます。

    ご提示いただいスクリプトで解決いたしました。

    大変たすかりました。本当にありがとうございました。

    お二方とも時間を割いていただきありがとうございました。

    また、何かありましたらよろしくお願いします。

    2012年6月15日 7:19