[#PowerApps Tip's]コンボボックスの初期値を操る 2022

およそ2年前に [コンボボックスの初期値を操る、たった2つの方法？](https://qiita.com/yamad365/items/74d44126cb53f5a7fdc1) という記事を書きました。読み返してみて、SharePoint Online（以降、SPO）のカスタムリストにおける「選択肢列」をデータソースに持つコンボボックスのコトしか書いてなかったな、と・・・いまさら気付いたのです。改めてコンボボックスで「配列」をデータソースに持つ場合の初期値について考察してみます。あるいは「たった 2 つの方法じゃなかったです、ごめんなさい」です汗。

# サンプルデータ
以降の説明は、下記の配列を利用しています。
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/d6770d01-99b5-fe8d-7b9c-c68c55386382.png)
コレクションに格納された値を、コンボボックスの Items に指定している状態で解説を続けます。

```
ClearCollect( colWk, ["ああ","い","ううう","えー","おぉ"] );
```
業務アプリで、こんな値を使うコトはまず無いと思いますｗ
おそらく、データ側にステータスみたいに状態を表す列を持っていて、例えば「健康」「微熱」「発熱」みたいな3つ選択肢がある場合に、初期値としていずれかを指定したい、みたいな場面が多いかな、と思います。（サンプルデータをソレにすれば良かった汗）
# コンボボックスの初期値は DefaultSelectedItems
重要なポイントです。コンボボックス コントロールは[DefaultSelectedItems]で指定した値が初期値になります。[Default]プロパティではありません。Docs にも明記されてます。

[Combo Box - 主要なプロパティ](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/controls/control-combo-box?WT.mc_id=BA-MVP-5004053#key-properties)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/7d0a2982-6969-69ab-cb51-d95583655f4d.png)
ここ、勘違いしやすいポイントなので注意です。コンボボックスに限って言えば[Default]プロパティは存在しないモノとして考えると良いと個人的に思っています。非推奨なら、非表示にしちゃってくれてもいいのよ → Power Apps Studio🤔

# コンボボックス 初期値の設定方法 - 配列編
さて、冒頭のサンプルデータを Items に持つコンボボックスコントロールに対して初期値を設定していきます。

## 単一の値を直接指定するパターン
配列で 1 つだけ値を指定すれば初期値として認識されます。固定値の選択肢を提供するような場面であれば、コレで事足りるでしょう。
![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/feba0cb5-d632-0a6f-103f-9174f090b6d0.png)

### n番目を指定するパターン
n番目（配列のインデックス指定）でも同様の効果が得られます。
![画像4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/a4528058-b5ab-a27c-4ff1-7b3bb9524bbf.png)
こちらについて下記の記事でその他テクニックとあわせて紹介されています。

[Power Apps コンボボックスの値をアプリ側から操作してみた](https://ippu-biz.com/development/powerplatform/powerapps/control-combobox/)

なお、上記の記事でもご紹介賜っている当方の記事「Power Apps で配列のn番目を取得する方法」は下記で解説しています。あわせてご確認ください。

[【#PowerApps Tip's】配列のｎ番目を取得する](https://qiita.com/yamad365/items/11e9cece46df161138a0)

## 複数の値を指定するパターン
コンボボックスの複数選択が可になっている（[SelectMultiple]プロパティ = true）場合は、複数の値を初期値として指定できます。
![画像5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/6263ab49-d1bc-1354-c3d3-ae27adb251b2.png)

上記のように[DefaultSelectedItems]へ複数の値を指定している状態で、複数選択を不可にした場合（[SelectMultiple]プロパティ = false）は記事投稿時点ではエラーにならず、先頭の値のみ初期値として表示されます。
![画像6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/42cba132-fb8f-669f-99cf-4db7f807d214.png)

# 注意：存在しない値も初期値にできる
[[PowerApps Tip's]コンボボックスの初期値を操る際の注意点](https://qiita.com/yamad365/items/3709dc64362776e84db6) の記事でも紹介しましたが、Power Apps のコンボボックスでは要素（Items）に存在しない値を初期値として設定できてしまいます。
![画像7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/44ebfbdc-c00d-ef7f-b3fb-b9cf886b58fd.png)
記事投稿時点では上記のように”存在しない値を初期値に指定”した場合でも、Power Apps Studio 上ではエラーになりません。
この”存在しない値”のままデータソースへ反映した場合、意図しない結果になると容易に想像できますよね。アプリ作成時の記入ミスで意図しない値が設定されてしまうと、思わぬバグを作り込む原因になりかねません。ご注意ください。

# [ ] で作った配列は Value を持つテーブル型
参考までに、冒頭のサンプルデータについて少し深掘りしておきましょう。サンプルデータのようにブラケット（[ ]）で囲って作ったデータは、テーブル型として内部的に認識されています。
[Collect](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-clear-collect-clearcollect?WT.mc_id=BA-MVP-5004053#collect) 関数の説明にあるとおり、なんですが…。ちょっと分かりづらいですよね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/3acd2658-af75-5e40-a704-691f409ee6c4.png)
Power Apps Studio の数式バーでデバッグ表示してみましょう。
![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/c8c4d0ff-49e3-696c-6cc6-975513a6b84c.png)
配列（[ ]）で指定した結果が、テーブル型になっています。そして、Key が無くて、Value のみになっています。

詳しい解説は下記の [たく丸](https://twitter.com/taku_ma_ru) サンの記事を参照ください。

[【#PowerApps】Power Apps で配列を作るときは注意が必要！](https://qiita.com/taku_maru/items/609c8adfc93ba6ecd8f8)

コンボボックス コントロールを選択した状態で右ペインにあるプロパティ→フィールドを選択した際に[主要なテキスト]に Value が表示されている理由が上記である、ということでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/d04587fb-94d1-6c79-5b65-6173fc2649a3.png)
ここらへん、Docs にわかりやすく案内されてないので当方の推測を含みますが。状況証拠から、おそらくそうなんじゃないかな、ですね。

なお、Key と Value をしっかり定義した Table 型を利用した場合でも、コンボボックス上であれば紹介した単一の値を配列の書き方（["値"]）で初期値として表示可能です。

# まとめ
- コンボボックス の初期値は [DefaultSelectedItems] です（重要
    - [Default] プロパティではないです注意！
- 初期値が確定しているなら配列の書き方（["値"]）が一番楽かも？
    - Form コントロール等と連携して利用する場合は Parent 等をちゃんと使うべきですが
- Items の要素として存在しない値も設定できちゃう注意！

試していただくとご理解いただけると思うのですが、単一の値を持つ配列（["あ"]など）を [DefaultSelectedItems] に指定することで、データソースに何を使っていようとコンボボックスの初期値としては動作する、というのが現状のようです。ただし、その値をデータソースへ反映する際には、データが書き込まれる側の仕様によって「どうなるか？」は変わってくる、と。この点を把握しておくと作りたいアプリの要件・仕様によって適切な判断ができるんじゃないかな？です。

存在しない値を指定できてしまうのは、個人的には非常に気持ち悪いです。もしかすると、それを応用して要件を満たせる場面が・・・今のとこ想像できないなぁｗ

配列（Collection）は初学者の方には慣れるまで難しい概念かもしれません。そんなに難しく考えずに色々手を動かして試してみると把握できると思いますので、是非チャレンジしてください。配列使えると、アプリの幅が広がると思いますよ。

忘れがちので繰り返しておきますが、コンボボックス の初期値は [DefaultSelectedItems] ですよ！（重要なのでｎ回目）。

それでは、皆さま、素晴らしい Power Platform Life を！