- PR -

仮想モード(VirtualMode)の DataGridView で RowCount を減らす時に時間がかかる

1
投稿者投稿内容
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-12-19 18:15
Windows アプリケーションを作っていて、DataGridView でたくさんの行数を扱うために仮想モード(VirtualMode)を使っています。
行数をたくさんある状態から行数を減らすときに、CPU使用率が100%になり、その状態がしばらく続きます。

下記に、再現コードを示します。フォームに DataGridView と TextBox と Button を1個ずつ貼ります。起動したら、テキストボックスに行数として 100000 を入れ、ボタンを押し、つぎに、10 を入れボタンを押します。この直後にCPU使用率が100%の状態が数秒ほど続きます。これがすぎれば、あとはスクロールなどは軽いです。

コード:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;

namespace Hoge
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
dataGridView1.VirtualMode = true;
}

private void button1_Click(object sender, EventArgs e)
{
dataGridView1.RowCount = int.Parse(textBox1.Text);
}
}
}



なにか回避策はないでしょうか?
10万行はたしかに少なくはない行数ですが、1万行でも、重い時間が一瞬ですがあります。
不思議なのは、行数が少ない状態から行数を増やすときは、一瞬で終わります。私としては、増やすのに時間がかからないのだから、減らすときも時間がかからないようにできても良いと思うのですが。

なお、環境は Windows XP + Visual C# 2008 + .NET Framework 3.5 です。

[ メッセージ編集済み 編集者: unibon 編集日時 2008-12-19 18:16 ]
passol
常連さん
会議室デビュー日: 2008/12/12
投稿数: 20
投稿日時: 2008-12-25 19:30
こんにちは、passolです。

もう、解決されているかもしれませんが・・・

一旦、Clearしちゃってセットし直すとかじゃダメですよね・・・
余計なことを書いてすいません。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-12-25 19:41
引用:

passolさんの書き込み (2008-12-25 19:30) より:
もう、解決されているかもしれませんが・・・

一旦、Clearしちゃってセットし直すとかじゃダメですよね・・・


コメントありがとうございます。いまだに解決していません。
Clear ってどうやるんでしょうか?(DataGridView クラスの ClearSelection メソッドではないですよね?)

ちなみに最初に提示したコードは、セルの内容はなにも表示させず、単に行数(縦方向のセルの数)を増減させるだけですが、これでもすでに遅いという症状が出てしまいます。
passol
常連さん
会議室デビュー日: 2008/12/12
投稿数: 20
投稿日時: 2008-12-25 19:54
こんにちは、passolです。

引用:

コメントありがとうございます。いまだに解決していません。
Clear ってどうやるんでしょうか?
(DataGridView クラスの ClearSelection メソッドではないですよね?)



DataGridView1.Rows.Clear()です。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-12-25 21:30
引用:

passolさんの書き込み (2008-12-25 19:54) より:
DataGridView1.Rows.Clear()です。


ありがとうございます。これでできました。

先日のサンプルコードでは、
コード:
        private void button1_Click(object sender, EventArgs e)
        {
            dataGridView1.Rows.Clear();
            dataGridView1.RowCount = int.Parse(textBox1.Text);
        }


のように、従来の RowCount の行の手前に Rows.Clear() の行を追加することでうまく(早く)動きました。
今開発している、実際に仮想モードでセルに値を入れているコードでも、早く動き、セルの表示も大丈夫でした。
1

スキルアップ/キャリアアップ(JOB@IT)