DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DataGridのソートアイコンを出さないようにしたい

環境/言語:[WXPSP2 VS2003 C# .NET1.1]
分類:[.NET]

DataGridでソート機能を有効にすると、列ヘッダの右端にソートアイコンが表示されます
このアイコンはアイコンのサイズに比べてずいぶん広い領域を使うのでヘッダの文字列に影響を与えます

このアイコンの表示を抑制する方法はないでしょうか?
> このアイコンの表示を抑制する方法はないでしょうか?

AllowSortingをfalseにする以外に方法はないと思います。よって、並び替えを自分で行うようにするか、ヘッダを自作するか程度の解決法しか私には思いつきません。
■No14662に返信(管理人さんの記事)
>>このアイコンの表示を抑制する方法はないでしょうか?
>
> AllowSortingをfalseにする以外に方法はないと思います。よって、並び替えを自分で行うようにするか、ヘッダを自作するか程度の解決法しか私には思いつきません。

ありがとうございます
AllowSortingをoffにして、プログラムで並び替えをする方法は試したのですが
DataSourceがDataViewでSortプロパティを使うと
DataSourceのSortを勝手に読んでアイコンを出してしまうようです
Tableそのものをプログラムでソートするのは、うーん避けたいですね

ヘッダの描画コードを書くことは吝かでないのですが
セル描画のような入り口が見つかりませんでした

そうすると結局は全ての描画をする事になってしまうのでしょうか?
「ヘッダを自作する」というのは、例えば、PictureBoxに自分で描画するとか、その他のコントロールを並べたりするという意味です。つまり、かなり難しいと思います。

もっといい方法があればよいのですが、残念ながら私には分かりません。
■No14688に返信(管理人さんの記事)
> 「ヘッダを自作する」というのは、例えば、PictureBoxに自分で描画するとか、その他のコントロールを並べたりするという意味です。つまり、かなり難しいと思います。

なるほど
別の事でグリッドの一部自前描画を試したことがあるのですが
スクロールバーが正しいスクロール位置を示さない場合があるという原因で断念した事があります
グリッドがスクロールしている場合に、確実に現在の表示位置を得られる手段が見つからなかったという事です
このため描画する座標が計算できず、描画がずれてしまうという事が起きました

描画するにせよ配置するにせよこの問題はすべてに影響してしまいます
逆に言えばスクロール位置が正確に把握できれば
がんばれば自前描画が可能なはずとなります

これがあるため他の方法はないかな?と思ったのが今回の投稿の動機でした
この問題はもしかして別の質問で立てるかもしれません

ありがとうございました
解決済み!
> 逆に言えばスクロール位置が正確に把握できれば
> がんばれば自前描画が可能なはずとなります

私は実際に詳しく調べたことがないので分からないのですが、水平スクロールバーの位置を示すDataGridのプロテクトメンバのHorizScrollBarプロパティのValueや、GridHScrolledメソッドのseパラメータのNewValueの値は、正しい位置を示さないのでしょうか?参考までに教えていただければ幸いです。
解決済み!
2006/01/27(Fri) 16:45:28 編集(投稿者)

> 私は実際に詳しく調べたことがないので分からないのですが、水平スクロールバーの位置を示すDataGridのプロテクトメンバのHorizScrollBarプロパティのValueや、GridHScrolledメソッドのseパラメータのNewValueの値は、正しい位置を示さないのでしょうか?参考までに教えていただければ幸いです。

はいそういう観測を得ました
DataGridをベースにした派生コントロールの内部の描画において
現在のスクロール位置を得るためにスクロールバーのValueを参照しようとして観測されました

具体的には、間接的要因でスクロールバーの状態が変化した時に
最新の情報の更新されるタイミングがないのではないか?と考えてます

イベントの方は確認してませんが、これは操作に起因するのでずれは生じないかもしれません

HBarはピクセル単位なので再現を確認しにくいですがVBarでは簡単に観測できます

例えばDosck=FillとなっているGridで領域以上の行数が存在すると垂直バーが出ますが
その状態から最下行にスクロールしておいて、ウィンドウの底辺を少しずつリサイズして延ばします
そうすると、グリッド内に表示されている行数が徐々に増えていくので
スクロールバーの位置も変わっていかなければならないと思うのですが
リサイズ前のスクロール位置を示したままになります
デバグコードでスクロール値をモニタして確認しました

描画イベントは発生するのでそのなかでスクロール位置を頼りに描画を行うと
描画にずれが生じるという形で問題が表面化しました

同様に、左右にスクロールされている状態から、列ヘッダの幅をドラグして変更するなどの操作で描画の横ずれが起きました
この横ずれはモンキーオペレーションで起きたり起きなかったりするもので
意図的に起こしにくかったのですが上記の列幅変更で再現しました
内部の計算値をデバグコードでモニタしましたが
描画の座標値の計算は常に同じ計算結果を得ていたので
スクロールを考慮しなければ、常に同じ描画が得られるはず

※ わかりにくいでしょうか?
例えばx=500の位置に垂直線を引くというコードが、計算値は常に500と計算されているのに
そこにスクロールバーから得たオフセットをかけて描画すると実際の描画がずれたりずれなかったりする
という現象です

垂直水平のいずれも、セル移動やスクロールといった直接操作でなく
サイズ変更などにより波及的に状態が変わった時に顕著に発現しました
■No14722に返信(SadManさんの記事)

詳しく教えていただき、ありがとうございました。スクロール位置が正確にわからないケースがあるというのは知りませんでしたので、勉強になりました。時間がありましたら、私も試してみたいと思います。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板