質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

1回答

419閲覧

C♯.netFramework Windows DataGridViewのスクロールバーの再描画について

key_boui

総合スコア12

DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2024/07/18 03:54

実現したいこと

DataGridViewにて、大量の列項目とレコード数を持ち、縦横のスクロールバーが常に表示されています。
これを、常時最新のデータを監視して表示データを更新し続けている画面を実装したいです。

発生している問題・分からないこと

DataGridViewの下の横スクロールバーが、再描画の度に長さが変わってピクピクと常に動き続ける現象が発生しています。
原因としては、グリッドの最右で縦スクロールが再描画の度に表示と非表示を繰り返しているためと思われます。
レコードが少なかったり、縦スクロールを非表示にすると起きないのですが、運用時にはDataGridViewに縦横のスクロールバーが常に表示され、再描画を繰り返している状態です。

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

解決方法として、縦スクロールがデータレコードの件数に関わらず恆に表示させようと思ったのですが、調べても不可能奈仕様で、新たに作成するしかないとありました。
他には、明示的に全列のfrozenをfalseにしてみたり、スクロールバー設定をbothにしてみたりしましたが、解決方しませんでした。
また、スクロールバーのスライダーの大きさが変わるのが問題なので、その大きさを固定する方法も調べましたが、見つかりませんでした。

以外の解決案を提案してみたのですが、諸々の事情にやり却下され、他の方法を模索しています。
・DataGridViewのデフォルトでないスクロールバーを追加でつける
・常に再描画するのでなく、表示内容の変更があったときにだけ再描画する

現在は、グリッドの右端とコンポーネント描画範囲の右端に隙間をあけて、縦スクロールの有無に影響を受けないようにする方針で調べています。
しかし、グリッドの左右の幅が短いときにならどうにかなるのですが、画面の幅を大きく超える長さのグリッド幅なので、同じようにできませんでした。
いずれか解決可能なアプローチはありますでしょうか

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2024/07/18 04:27

> 縦スクロールが再描画の度に表示と非表示を繰り返している 実際にどういうことをすればそういうことが起きるのか? というところがわからないです. 何か「その現象が再現するコード」みたいなのって示せないものでしょうか? ※既存のセルの表示内容を変更するとき(それによってセルのサイズが変化しないならば)スクロールバーの状態に影響を与えることは無いように想像するのですが,実際は違うのかな?
YAmaGNZ

2024/07/18 04:27

DataGridViewの設定や表示方法に依存する部分もありそうですし 再現できるコードを示されたほうが回答が得られやすいかと思います。
key_boui

2024/07/18 09:09

コメントありがとうございます。下の再現してくださった方の現象がまさにそれです
guest

回答1

0

ベストアンサー

C#

1 public partial class Form1 : Form 2 { 3 4 DataGridView dgv = new DataGridView() { Width = 300, Height = 100 }; 5 6 public Form1() 7 { 8 InitializeComponent(); 9 this.Width=350; 10 this.Height=200; 11 12 for(int i = 0; i < 10; i++) 13 { 14 dgv.Columns.Add(new DataGridViewTextBoxColumn() { HeaderText = $"Column {i}"}); 15 } 16 this.Controls.Add(dgv); 17 18 Timer t = new Timer() { Interval = 200,Enabled = true }; 19 t.Tick += (object sender,EventArgs e)=>{ 20 refresh_dgv(); 21 }; 22 } 23 24 private void refresh_dgv() 25 { 26 27 dgv.Rows.Clear(); 28 29 for(int i = 0;i < 100;i++) { 30 dgv.Rows.Add(); 31 } 32 33 } 34 35 }

このコードで表示される
イメージ説明
このような現象ですかね?

例のように一旦全ての行を消して表示行を新たに生成しているのであれば、行を消す前にDataGridViewの再描画を停止してからデータの更新を行い、全ての更新が終了したら再描画を再開しRefreshしてやれば改善しないでしょうか。

例えばこちらにあるような拡張メソッドを作成し

C#

1 private void refresh_dgv() 2 { 3 4 dgv.SuspendDrawing(); 5 dgv.Rows.Clear(); 6 7 for(int i = 0;i < 100;i++) { 8 dgv.Rows.Add(); 9 } 10 dgv.ResumeDrawing(); 11 }

といった感じで再描画を抑制してやるとか

投稿2024/07/18 06:08

編集2024/07/18 06:18
YAmaGNZ

総合スコア10469

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

key_boui

2024/07/18 09:45 編集

ありがとうございます! 上記の拡張メソッドを実装したら理想通りの動きが実現できたので、この方法で提案してみます。 案が通ったらご報告します。 上司に却下されたらまたご相談させてください…。 SuspendLayout()と ResumeLayout()も試してみましたが、これでは描画は止まらないのですね
YAmaGNZ

2024/07/18 11:26

どのようなデータなのか分かりませんがそもそも行を一旦削除しなくては実現不可なのでしょうか? 下の行を見ている時に更新が入ると行が戻ってしまうなどの弊害もありそうです。 BindingList等をdatasourceにセットするなどの方法で実現できたりしないのでしょうか?
key_boui

2024/07/19 08:37

行が戻ってしまう問題はたしかにありました。 表示している行列を常に記録して移動させることで表示場所を保持するようにしました。 承認する担当者が休みだったので、週明けにまた報告します。 その方法も一度試してみます コメントありがとうございます
key_boui

2024/07/22 03:59

この方法でOKをもらえたので、解決とさせていただきます。ありがとうございました! 一部、sendMessagがintとなっていたところを、下記サイトを参考に、intptrとしました https://dobon.net/vb/dotnet/control/beginupdate.html
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問