![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
DataGridViewのVirtual Modeをtrueにしてデータを表示させています。
DataGridViewのRowCountを設定すると、件数が多い(数万件以上)場合に、CPUの使用率が高くなり、動作が遅くなってしまいます。
例:
Dgview.RowCount = 100000;
画面に表示されているセルに関係なく、すべてのセルについてCellValueNeededイベントが発生してしまっているようなのですが、その原因がつかめません。
画面に表示されているセルのCellValueNeededが優先的に発生するようで、データ自体は正常に表示されます。
しかし、画面上のセル分のイベントが終わると、また続きからCellValueNeededイベントが再開されてしまいます。
セルの値はDataTable変数に一度値を格納したものをセルごとに取得しています。
試しに、100000件のDataGridViewのみを表示するプログラムを作成した場合、正常に動作しました。
現在作成中のプログラムでのバグ?のようです。
他に特別なイベントが発生している形跡は自分の確認した限りでは見られません。
説明下手で申し訳ありませんが、原因のわかる方、回答お願いします。
No.1ベストアンサー
- 回答日時:
こんばんは。
断言は出来ませんが、実行中に
Dgview.RowCount = 100000;
を実行すると、拡大されたセルの分だけCellValueNeededイベントが発生しています。
その際、帳尻あわせをする為にデータテーブルの件数も拡大する処理をしていませんか(要は其処が重たい原因ではないかと)。
以下の様にしてボタンを押した瞬間にセルとデータテーブルを10万件まで拡大して見ましたが、一定時間重たくなります。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace WindowsApplication
{
public partial class Form1 : Form
{
DataTable dataTable1;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//テーブルの作成
dataTable1 = new DataTable();
dataTable1.Columns.Add();
dataTable1.Columns.Add();
//テーブルにデータを25件まで拡大
ExpandRowRange(25);
//セルを50件まで拡大
dataGridView1.ColumnCount = 2;
dataGridView1.RowCount = 50;
}
private void dataGridView1_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
{
//セルの位置がテーブル件数を超えているので引き返す
if (e.RowIndex >= dataTable1.Rows.Count ||
e.ColumnIndex >= dataTable1.Columns.Count)
return;
e.Value = dataTable1.Rows[e.RowIndex][e.ColumnIndex];
}
private void dataGridView1_CellValuePushed(object sender, DataGridViewCellValueEventArgs e)
{
if (e.Value == null)
return;
//セルの位置がテーブル件数を超えているので、テーブル件数を拡大する
if (e.RowIndex >= dataTable1.Rows.Count)
ExpandRowRange(e.RowIndex + 1);
dataTable1.Rows[e.RowIndex][e.ColumnIndex] = e.Value;
}
private void button1_Click(object sender, EventArgs e)
{
//テーブル件数を10万件まで拡大する(重たい)
ExpandRowRange(100000);
//セルを10万件まで拡大する
dataGridView1.RowCount = 100000;
}
private void ExpandRowRange(int index)
{
for (int i = dataTable1.Rows.Count; i < index; ++i)
dataTable1.Rows.Add(new Object[] { i.ToString(), "データ" + i.ToString() });
}
}
}
データテーブルの代わりに
http://msdn.microsoft.com/ja-jp/library/3eayzh46 …
を使えば負担が軽減するかもしれません。
遅レスですが、自己解決したので、一応原因を書き留めておきます。
DataGridViewの「ColumnHeaderHeightSizeMode」プロパティと「AutoSizeColumnMode」プロパティを初期値から変更すると、すべてのセルで「CellValueNeeded」イベントが発生してしまうようでした。
この2つを初期値に戻すことで、画面に表示されるセルのみについて「CellValueNeeded」プロパティが発生するようになりました。
データテーブルには、RowCountを設定する前に値を10万件分保存していて、その際の処理は必要なものだと認識していましたが、リンク先も参考にさせていただきます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) IF 関数で「〇〇 という文字を含む場合」の分岐処理で表示された数字はSUMで数字集計できますか? 3 2022/08/02 16:29
- Excel(エクセル) エクセルについて教えてください。 2 2023/06/14 11:11
- Excel(エクセル) エクセルの表示形式について教えてください あるセルの「A」という値と、別のセルの「B」という値を組み 4 2023/02/21 21:55
- Excel(エクセル) Excel 特定セルの数値を参照したセルの0表示が空白にならないのはどうしてか? 3 2022/04/28 22:23
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Visual Basic(VBA) VB DataGridViewについて 3 2022/06/08 17:20
- Excel(エクセル) Excel フィルタ後のコピー貼付けと可視セルの関係について 3 2023/02/07 16:42
- Excel(エクセル) エクセルで”入力シート”の文字書式の変更を”出力シート”で同じ文字書式で印刷したいです。VBA希望 4 2023/04/24 11:07
- Excel(エクセル) Excelにの以下の設定方法について教えてください! C列にデータ入力の設定をしています。(出、入を 3 2022/06/22 01:33
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAマクロ実行時エラーの修正に...
-
Excel UserForm の表示位置
-
Excel VBA IF文がうまく動作し...
-
エクセルVBA 配列からセルに「...
-
【VBA】【ユーザーフォーム_Lis...
-
VBA:日付を配列に入れ別セルに...
-
Excelで空白セル直前のセルデー...
-
特定の色のついたセルを削除
-
Excel VBAでCheckboxの名前を変...
-
複数指定セルの可視セルのみを...
-
VBAでユーザーフォームにセル値...
-
Excel-VBA セルのデータ書出し(Q2)
-
【VBA】写真の貼り付けコードが...
-
EXCEL VBA 文中の書式ごと複写...
-
下記のマクロの説明(意味)を...
-
オーバーフローを回避する方法?
-
excelで結合セルの場合にエラー...
-
[Excel VBA] このコードでは行...
-
VBAについて
-
EXCELのフォーム上でリアルタイ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAマクロ実行時エラーの修正に...
-
Excel UserForm の表示位置
-
エクセルVBA 配列からセルに「...
-
EXCEL VBA 文中の書式ごと複写...
-
特定の色のついたセルを削除
-
【Excel VBA】一番右端セルまで...
-
Excelで空白セル直前のセルデー...
-
【VBA】写真の貼り付けコードが...
-
VBAコードについて教えてくださ...
-
【VBA】【ユーザーフォーム_Lis...
-
Excel 範囲指定スクショについ...
-
VBAでユーザーフォームにセル値...
-
VBA:日付を配列に入れ別セルに...
-
VBA にて、条件付き書式で背景...
-
Excel VBAでCheckboxの名前を変...
-
複数指定セルの可視セルのみを...
-
Excel VBA IF文がうまく動作し...
-
エクセルのカーソルを非表示に...
-
入力規則のリスト選択
-
VBA 複数条件の分岐処理の上手...
おすすめ情報