C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: DataGridViewでバインドモード かつ 仮想モード


(過去ログ 178 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■102315 / inTopicNo.1)  DataGridViewでバインドモード かつ 仮想モード
  
□投稿者/ 暗黒魔界の王 佐藤 (1回)-(2023/08/28(Mon) 15:04:32)

分類:[.NET 全般] 

フレームワーク: .NET 6.0
言語:C#

private List<CANData> dataList = new List<CANData>();

        public Form1()
        {
            InitializeComponent();

            dataGridView.DataSource = bindingSource1;

            bindingSource1.DataSource = dataList;
        }

という風に、DataGridViewにdataListをバインドした状態です。

dataListのデータは1ms以下の頻度で次々に追加されます。

現状 System.Timers.TimerをInterval = 100 にして
timer1_Tick()で
this.bindingSource1.ResetBindings(false);
を呼んで表示を更新しております。

動作はしているのですが、
データが数千を超えてくると、最小化して最大化したときの読み込みに時間がかかったり
数十万を超えてくると固まったような動作になります。

そこで仮想モードを使ってみたいのですが
バインドと仮想モードの併用はできるのでしょうか?

実際にやってみると、
dataGridView.VirtualMode = Trueにしても

dataGridView_CellValueNeededイベントが全く呼び出されません。
スクロールしたり、最小化最大化しても呼び出されません。

併用はできないのでしょうか?

引用返信 編集キー/
■102316 / inTopicNo.2)  Re[1]: DataGridViewでバインドモード かつ 仮想モード
□投稿者/ kiku (370回)-(2023/08/28(Mon) 16:03:10)
No102315 (暗黒魔界の王 佐藤 さん) に返信
> 動作はしているのですが、
> データが数千を超えてくると、最小化して最大化したときの読み込みに時間がかかったり
> 数十万を超えてくると固まったような動作になります。

数千〜数十万のデータを画面に表示する仕様に
無理があると思います。

仮にパフォーマンス的に問題なくできたとしても、
数十万のデータを画面に表示し、
それをすべて見る必要があるか疑問です。

自分だっから、データ量を少なくするような工夫をしたり、
直近の1000件のデータのみを表示するなど、
外部仕様の変更を検討すると思います。

どうしても全部表示したいのだとしたら無視してください。
引用返信 編集キー/
■102317 / inTopicNo.3)  Re[2]: DataGridViewでバインドモード かつ 仮想モード
□投稿者/ 暗黒魔界の王 佐藤 (2回)-(2023/08/28(Mon) 16:09:35)

> 数千〜数十万のデータを画面に表示する仕様に
> 無理があると思います。


すいません。
一度に表示されるのは
DataGridViewの行20 列64
ほどです。

Listには数十万のデータが格納されます。
引用返信 編集キー/
■102318 / inTopicNo.4)  Re[3]: DataGridViewでバインドモード かつ 仮想モード
□投稿者/ kiku (371回)-(2023/08/28(Mon) 16:13:45)
No102317 (暗黒魔界の王 佐藤 さん) に返信
>
> すいません。
> 一度に表示されるのは
> DataGridViewの行20 列64
> ほどです。
>
> Listには数十万のデータが格納されます。

画面表示用のListを作って、そこに20行のデータを格納してはどうですか?

数十万のデータの入ったListは、できればDBに格納するなどをした方が良いと思います。
引用返信 編集キー/
■102319 / inTopicNo.5)  Re[4]: DataGridViewでバインドモード かつ 仮想モード
□投稿者/ 暗黒魔界の王 佐藤 (3回)-(2023/08/28(Mon) 16:21:24)
No102318 (kiku さん) に返信
> ■No102317 (暗黒魔界の王 佐藤 さん) に返信
>>
>>すいません。
>>一度に表示されるのは
>>DataGridViewの行20 列64
>>ほどです。
>>
>>Listには数十万のデータが格納されます。
>
> 画面表示用のListを作って、そこに20行のデータを格納してはどうですか?
>
> 数十万のデータの入ったListは、できればDBに格納するなどをした方が良いと思います。


イメージ的にはWireSharkのように
受信データを延々と表示したく。
「停止」を押してスクロールすると過去のデータが見れるようなものにしたいです。

バインドを使うことなく単純な仮想モードにすれば
比較的軽量な表示ができました。

ですが、Listに対してフィルタやソートをかけたデータを表示しようとすると
バインドしてない状態ではスマートにコード化するアイデアが思い浮かばなかったため、
バインドした状態で仮想モードが使えないものかと質問させていただきました。


引用返信 編集キー/
■102320 / inTopicNo.6)  Re[5]: DataGridViewでバインドモード かつ 仮想モード
□投稿者/ kiku (372回)-(2023/08/28(Mon) 16:28:50)
No102319 (暗黒魔界の王 佐藤 さん) に返信
> ■No102318 (kiku さん) に返信
>>■No102317 (暗黒魔界の王 佐藤 さん) に返信
> ですが、Listに対してフィルタやソートをかけたデータを表示しようとすると
> バインドしてない状態ではスマートにコード化するアイデアが思い浮かばなかったため、
> バインドした状態で仮想モードが使えないものかと質問させていただきました。

仮想モードの話が下記にありました。
https://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=res&namber=35451&type=35451&space=45&mo=35455&page=0&no=0

自身では仮想モードを使ったことがないので
わからないのですが、

DBから必要な情報のみ抜き出して
部分的に画面に表示する実装ができそうです。
Listで数十万のデータを持つのではなく、
DBに入れてあげれば、フィルタなどはDB機能のインデックスを使えたりし、
高速になるのではないかと考えました。
引用返信 編集キー/
■102321 / inTopicNo.7)  Re[1]: DataGridViewでバインドモード かつ 仮想モード
□投稿者/ KOZ (409回)-(2023/08/28(Mon) 16:49:50)
No102315 (暗黒魔界の王 佐藤 さん) に返信
> dataListのデータは1ms以下の頻度で次々に追加されます。
> そこで仮想モードを使ってみたいのですが
> バインドと仮想モードの併用はできるのでしょうか?

併用は出来ません。
リストが頻繁に更新されるのであれば、List<T> ではなく、BindingList<T> を使ってみてください。
引用返信 編集キー/
■102322 / inTopicNo.8)  Re[6]: DataGridViewでバインドモード かつ 仮想モード
□投稿者/ 暗黒魔界の王 佐藤 (4回)-(2023/08/28(Mon) 16:55:59)
No102320 (kiku さん) に返信
> ■No102319 (暗黒魔界の王 佐藤 さん) に返信
>>■No102318 (kiku さん) に返信
> >>■No102317 (暗黒魔界の王 佐藤 さん) に返信
>>ですが、Listに対してフィルタやソートをかけたデータを表示しようとすると
>>バインドしてない状態ではスマートにコード化するアイデアが思い浮かばなかったため、
>>バインドした状態で仮想モードが使えないものかと質問させていただきました。
>
> 仮想モードの話が下記にありました。
> https://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=res&namber=35451&type=35451&space=45&mo=35455&page=0&no=0
>
> 自身では仮想モードを使ったことがないので
> わからないのですが、
>
> DBから必要な情報のみ抜き出して
> 部分的に画面に表示する実装ができそうです。
> Listで数十万のデータを持つのではなく、
> DBに入れてあげれば、フィルタなどはDB機能のインデックスを使えたりし、
> 高速になるのではないかと考えました。


DBを使う場合でもDataGridViewのDataSourceにバインドしてしまうと
仮想モードは使えなくなりそうなので
Listの場合と変わりないような気がしています。
引用返信 編集キー/
■102323 / inTopicNo.9)  Re[2]: DataGridViewでバインドモード かつ 仮想モード
□投稿者/ 暗黒魔界の王 佐藤 (5回)-(2023/08/28(Mon) 17:02:20)
No102321 (KOZ さん) に返信
> ■No102315 (暗黒魔界の王 佐藤 さん) に返信
>>dataListのデータは1ms以下の頻度で次々に追加されます。
>>そこで仮想モードを使ってみたいのですが
>>バインドと仮想モードの併用はできるのでしょうか?
>
> 併用は出来ません。
> リストが頻繁に更新されるのであれば、List<T> ではなく、BindingList<T> を使ってみてください。


ありがとうございます。
バインドと仮想モードの併用は出来ないですね。
ネット検索を駆使してもそれができそうな記述は見つからず
実際に試してもバインドした状態では、
dataGridView_CellValueNeededイベントが発生してくれません。


BindingListだと
Listが更新されるたびに自動で描画しようとするため
Listに1ms以下の頻度でデータが追加されると
普通の使い方では非常にもっさりします。(動作はします)

今回、データが非常に多いので
表示に必要なデータのみを扱ってくれる仮想モードの使用は
必須かなと思っております。

そのため、バインドを諦め、
自分でDataGridViewColumnを定義して、
dataGridView_CellValueNeededイベント内で値を更新する
しかないのかなーと思い始めております。
引用返信 編集キー/
■102326 / inTopicNo.10)  Re[3]: DataGridViewでバインドモード かつ 仮想モード
□投稿者/ 暗黒魔界の王 佐藤 (6回)-(2023/08/29(Tue) 15:11:22)
結果的に仮想モードよりも下記のほうが快適な表示になりました。

BindingSourceのDataSourceに独自クラスのListをセット
DataGridViewのDataSourceにBindingSourceをセット


1ms以下の間隔でListにデータがAddされる。

BindingSourceのResetBindings(false)を
300ms間隔くらいで呼ぶ(これが表示間隔)


BindingListだとデータが追加されたタイミングで表示を更新しようとしてくるので
高頻度にデータが追加されると表示が辛くなる。
また、DataGridViewのデータソースにBindingListをセットした状態でも
仮想モードは使用できるが、更新頻度が激しいため
CellValueNeededイベントがとてつもない頻度で発生して表示は遅くなる。


バインドしつつ表示のタイミングを制御しやすい
BindingSourceが最適でした。
とりあえずWireSharkくらいの表示レベルにはなりました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -