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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.102315 の関連記事表示

<< 0 >>
■102315  DataGridViewでバインドモード かつ 仮想モード
□投稿者/ 暗黒魔界の王 佐藤 -(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イベントが全く呼び出されません。
    スクロールしたり、最小化最大化しても呼び出されません。

    併用はできないのでしょうか?
親記事 /過去ログ178より / 関連記事表示
削除チェック/

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

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

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

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

    どうしても全部表示したいのだとしたら無視してください。
記事No.102315 のレス /過去ログ178より / 関連記事表示
削除チェック/

■102317  Re[2]: DataGridViewでバインドモード かつ 仮想モード
□投稿者/ 暗黒魔界の王 佐藤 -(2023/08/28(Mon) 16:09:35)

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


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

    Listには数十万のデータが格納されます。
記事No.102315 のレス /過去ログ178より / 関連記事表示
削除チェック/

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

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

    数十万のデータの入ったListは、できればDBに格納するなどをした方が良いと思います。
記事No.102315 のレス /過去ログ178より / 関連記事表示
削除チェック/

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


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

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

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

記事No.102315 のレス /過去ログ178より / 関連記事表示
削除チェック/

■102320  Re[5]: DataGridViewでバインドモード かつ 仮想モード
□投稿者/ kiku -(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機能のインデックスを使えたりし、
    高速になるのではないかと考えました。
記事No.102315 のレス /過去ログ178より / 関連記事表示
削除チェック/

■102322  Re[6]: DataGridViewでバインドモード かつ 仮想モード
□投稿者/ 暗黒魔界の王 佐藤 -(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の場合と変わりないような気がしています。
記事No.102315 のレス /過去ログ178より / 関連記事表示
削除チェック/

■102321  Re[1]: DataGridViewでバインドモード かつ 仮想モード
□投稿者/ KOZ -(2023/08/28(Mon) 16:49:50)
    No102315 (暗黒魔界の王 佐藤 さん) に返信
    > dataListのデータは1ms以下の頻度で次々に追加されます。
    > そこで仮想モードを使ってみたいのですが
    > バインドと仮想モードの併用はできるのでしょうか?

    併用は出来ません。
    リストが頻繁に更新されるのであれば、List<T> ではなく、BindingList<T> を使ってみてください。
記事No.102315 のレス /過去ログ178より / 関連記事表示
削除チェック/

■102323  Re[2]: DataGridViewでバインドモード かつ 仮想モード
□投稿者/ 暗黒魔界の王 佐藤 -(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イベント内で値を更新する
    しかないのかなーと思い始めております。
記事No.102315 のレス /過去ログ178より / 関連記事表示
削除チェック/

■102326  Re[3]: DataGridViewでバインドモード かつ 仮想モード
□投稿者/ 暗黒魔界の王 佐藤 -(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くらいの表示レベルにはなりました。
記事No.102315 のレス / END /過去ログ178より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -