しろあじ備忘録

システム関係の備忘録。ザルのような記憶力なので、こうして書いておかないと忘れるのだよ。

【C# windowsce mobile】DataGridメモ

.NET2008 .Net Compact Frameworkでモバイルアプリ開発
いつものC#のノリで作ろうとしたが、
コントロールの機能が少ない!DataGridではまったときの対策備忘録

困ったことにネットでの情報が少ない。
英語圏のQAとか翻訳ツールなど使って調べたりして何とか進めた。

なになにハンディで表を出したい?え、DataGridしかないの?

DataGridViewコントロールが無い。
あるのはDataGridコントロールのみ。

GrepCityでモバイル用のスプレッドコントロールがあるとかどうとか(未確認)
とはいえそれを購入するほどでもない。


しかたない、DataGridで進めよう。

設定できるプロパティが少ない

デザイン画面でDataGridを置き、必要なプロパティを設定、、と思ったが、
プロパティが少ない。

いつものノリでやろうとすると、すぐに壁にぶち当たる。

やろうと思ったらさらりとできなかった一覧(解決したのもあり)

1)指定した複数のセルの色を変えたい(⇒一応対策あり)
2)列幅を変えたい。欲を言えば表示内容に合わせて(⇒解決した)
3)セルによってフォントサイズを変えたい(⇒未解決 仕様を変えた)
4)セルを編集したい(⇒DataGridにはそういう機能ないとのこと。代替え策はあるがやってない。仕様を変えた)
5)データ表示後、クリックした項目でソートさせたい(⇒DataGridにはそういう機能ないとのこと。)

1)指定した複数のセルの色を変えたい(⇒一応対策あり)

スプレッドのノリで考えていたが、そういうノリのプロパティは実装されていない。

ただ、「選択したセルの色を変える」という機能はある。色も指定できる。

変えたいならば、対象のセルを選択状態にすればよい。

この方法はネットでもいくつか見つかる。

が、しかし、他のセルをクリックするとそのセルが選択状態になるので、
そのあたりの制御が必要。

仕様上、これとは別に「選択したセルに対する操作」をする必要が出てきたので、
色を変えることをやめた(マーク表示で逃げた)

2)列幅を変えたい。欲を言えば表示内容に合わせて(⇒解決した)

DataGridのDataSourceプロパティにSQL結果をセットすれば容易にデータを表示できる。

が、それだけだと列幅がデフォルトのまま。なんとも見づらい。


自動的に列幅を調整するような気の利いたプロパティなどない。

しかも、私の場合、処理内容によってDataGridに表示する項目が動的に変わる。
ハンディ側ではなくサーバー側に項目情報を持たせたい

これはあちこちネットで調べた結果、以下の形で実現できた。
dtには表示したいデータのSQL結果そのまま DataTable

dtCOLにはDataTable型で、表示したいデータの項目名と列幅を持たせている
内容はこんな感じ
COLNM | COLWIDTH
ーーーーーーーーーーー
項目1 | 40
項目2 | 80
項目3 | 100
 
サンプル

dg.TableStyles.Clear();
dg.DataSource = dt; //dt:SQL結果のDataTable

DataGridTableStyle tableStyle = new DataGridTableStyle();
tableStyle.MappingName = dt.TableName;
for (int i = 0; i < dt.Columns.Count; i++)
{
    DataGridTextBoxColumn tbcName = new DataGridTextBoxColumn();

    tbcName.Width = int.Parse(dtCOL.Rows[i]["COLWIDTH"].ToString());
    tbcName.MappingName = dt.Columns[i].ColumnName;
    tbcName.HeaderText = dtCOL.Rows[i]["COLNM"].ToString();
    tableStyle.GridColumnStyles.Add(tbcName);
}
dg.TableStyles.Add(tableStyle);
dg.Refresh();

tableStyle やGridColumnStylesを上記のように操作したらなんとかなった。
そう、列幅をいちいち設定したのだ。端末側で動的に列幅を判断させて、、までさせる研究をする時間はなかった。

3)セルによってフォントサイズを変えたい(⇒未解決 仕様を変えた)

機能がデフォルトでは無い。
研究しまくればできるだろうが、、
そこまで時間取れなかったので仕様を変えてもらった。

4)手でセルを編集したい(⇒DataGridにはそういう機能ないとのこと。代替え策はあるがやってない。仕様を変えた)

そう、これもまた機能がデフォルトでは無い。
Microsoftサイトでも「実行時に DataGrid のセルを編集できない」と明言していて、
代替え策へのリンクがあったが、それを押してもアクセスできない。。。。
多分、テキストボックスを利用するのかな。。。

これまた時間的な理由で仕様を変えてもらい、却下した。

5)データ表示後、クリックした項目でソートさせたい(⇒DataGridにはそういう機能ないとのこと。)

これもやっぱり機能がデフォルトでは無い。
本当にそんな機能は運用的に必要?ないと困る?
という観点で話をし、初期表示の時点の並び方が要望どおりならいい、ということで落ち着いた。

やるとしたら、
列を選択もしくは並び順コンボでも用意して並び順選択したうえで、
再検索ボタンクリックしてDataGrid再編集すればできなくはないけど。
その分、サーバーアクセスが増える。というのも説明の上。

どこまでハンディに機能を求めるのか

.Net Compact Framework はその名の通り、コンパクトだ。
どこか忘れてしまったが、、あるサイトでは「モバイルという環境だから最低限。必要な機能があれば作りこんでね」とか。
なので、普通に .Net Frameworkを使っていた私としては
「ええ、これもできないの?!」と連続だった。
作りこめばよいのだろうが、そこまで時間を用意していなかった。
じゃあ、、要件通りに作りこむか、いやそもそもその仕様必要かな?というのもあったり。
それもまた良い経験。

短い開発期間で急遽作ってほしい、という状況で
仕様を割と変えてもらえる関係性だったのが幸いだったと思う。


ハンディだから、リーダーでQRやらバーコードやら読み込んで、
その結果を表示する。

ハンディという形は手で持って、移動したりして、ぴっぴっぴ、、と続けて読む。
そこでいちいち詳しい結果を見るのか?というところもあったり。
正常に読み込めたかどうか、は見るとしても。

そもそも画面小さいしね、情報量多くしても、見づらい。

なんでハンディを使うのか。
ハンディで何をしたいのか、何をハンディに求めるのか。
まずはその辺りを整理できるとよさそうだ。

f:id:ramapipi:20200520115046p:plain