2017-06-08 2 views
1

レガシーコードを改善する方法があるかどうかを確認するために投稿しています。コードはDataGridViewにx行のデータを設定します。当初、データは少量であるため、コードは正常に機能しました。しかし、データが極端に増加しており、DataGridViewにデータを読み込む際のパフォーマンスが非常に遅いことがわかりました。DataGridViewの大きなデータにバーチャルモードを使用する方法

基本的に、私はいくつかの考慮事項があることを知っています(例えばVirtual Mode)。しかし、私が取りたいアプローチは、配列またはListを使用して配列に変換し、Rows.AddRange(配列)を呼び出して行の範囲を追加することです。しかし、私はそれを実装するのに問題があります。

現状では、これはコードが存在するものである:

if (value !=0) 
{ 
int row = 0; 
dataGridView1.AddRow(); 
dataGridView1.Rows[row].Cells[0] = "Test"; 
dataGridView1.Rows[row].Cells[1] = 9; 
dataGridView1.Rows[row].Cells[2] = "Test Two"; 
dataGridView1.Rows[row].Cells[3] = "Test Three"; 
row++; 
} 

if (valueTwo !=0) 
{ 
dataGridView1.AddRow(); 
dataGridView1.Rows[row].Cells[0] = "Test"; 
dataGridView1.Rows[row].Cells[1] = 9; 
dataGridView1.Rows[row].Cells[2] = "Test Two"; 
dataGridView1.Rows[row].Cells[3] = "Test Three"; 
row++; 
} 

ので、これは当然のことながら、全く効率的ではありません。私は知っている.AddRow()はそれ自体で課税方法であり、個々に行を追加すると、1つ1つはうまくいきません。

私のような何かを試してみました:

object[] data = {"Test", 9, "Test Two", "Test Three"}; 
List<DataGridViewRow> list = new List<DataGridViewRow>(); 
for (int i = 0; i < data.Length; i++) 
{ 
    DataGridViewRow row = new DataGridViewRow(); 
    row.SetValues(data[i]); 
    list.Add(row); 
} 
dataGridViewRow1.Rows.AddRange(list.ToArray()); 

しかし、これを実行すると、私にSetValuesライン上にNullPointerExceptionを取得します。

これを行う最善の方法は、DataTableを作成するか仮想モードを使用することですが、行を追加するのではなく、範囲を追加してデータのコンテナを渡す方法を試してみたいと思います。

私の説明ではっきりしていることを希望します。私がさらに説明する必要があるかどうかを教えてください。

編集:私はバーチャルモードを使用することが最善の方法だと思います。私は本当にそれを行う方法はわかりません。私はMSNのチュートリアルをチェックしましたが、少し混乱しました。私が10万行のバーチャルモードを実装する場合、どうやってそれをやっていくのですか?本当に素晴らしいことはありません。合計10,000行しか表示されません。

答えて

0

DataTableの方が正しい方法は ですが、グリッドビューに動的にデータを追加する場合は、最初に 列と行を追加する必要があります。

private void Form5_Load(object sender, EventArgs e) 
     { 
      var lstTemp = new List<test>(); 

      for (int i = 0; i < 10; i++) 
       lstTemp.Add(new test() { Name = "Test", No = i, Desc = "Desc " + i, Desc1 = "Desc1 " + i }); 

      dataGridView1.Columns.Add("Name", "Name"); 
      dataGridView1.Columns.Add("No", "Number"); 
      dataGridView1.Columns.Add("Desc", "Description1"); 
      dataGridView1.Columns.Add("Desc1", "Description2"); 

      foreach (var temp in lstTemp) 
      { 
       DataGridViewRow row = (DataGridViewRow) dataGridView1.Rows[0].Clone(); 
       row.Cells[0].Value = temp.Name; 
       row.Cells[1].Value = temp.No; 
       row.Cells[2].Value = temp.Desc; 
       row.Cells[3].Value = temp.Desc1; 
       dataGridView1.Rows.Add(row); 
      } 
     } 

     public class test 
     { 
      public string Name { get; set; } 
      public int No { get; set; } 
      public string Desc { get; set; } 
      public string Desc1 { get; set; } 
     } 

これはあなたを助けるかもしれない、あなたが行の前に列を追加する必要がありますあなたのケースのための

0

、あなたのデータを取り込むするBindingListを使用する

object[] data = { "Test", 9, "Test Two", "Test Three" }; 

      dataGridView1.Columns.Add("Name", "Name"); 
      dataGridView1.Columns.Add("No", "Number"); 
      dataGridView1.Columns.Add("Desc", "Description1"); 
      dataGridView1.Columns.Add("Desc1", "Description2"); 

      for (int i = 0; i < 10; i++) 
       dataGridView1.Rows.Add(data); 
0

てみてください、あなたが持つことができますプロフェッショナルをマッピングするか、ダイナミックなものを使用するクラスです。データをバインドできるように、フリーリストを作成する必要があります。

 DataGridViewCell cell = new DataGridViewTextBoxCell(); 
     DataGridViewTextBoxColumn colFileName = new DataGridViewTextBoxColumn() 
     { 
      CellTemplate = cell, 
      Name = "Value1", 
      HeaderText = "Value 1", 
      DataPropertyName = "Col1" 
     }; 

     DataGridViewCell cell2 = new DataGridViewTextBoxCell(); 
     DataGridViewTextBoxColumn colFileName2 = new DataGridViewTextBoxColumn() 
     { 
      CellTemplate = cell2, 
      Name = "Value2", 
      HeaderText = "Value 2", 
      DataPropertyName = "Col2" 
     }; 
     dataGridView1.Columns.Add(colFileName); 
     dataGridView1.Columns.Add(colFileName2); 

     List<DataPopulate> list = new List<DataPopulate>(); 
     list.Add(new DataPopulate() { Col1 = "tes1", Col2 = "teste2"}); 
     list.Add(new DataPopulate() { Col1 = "tes1", Col2 = "teste2" }); 
     list.Add(new DataPopulate() { Col1 = "tes1", Col2 = "teste2" }); 

     var dataPopulateList = new BindingList<DataPopulate>(list); 

     dataGridView1.DataSource = dataPopulateList; 
+0

ありがとうございます。私の掲示された元のコードを考えれば、これは最も速い方法ですか? – CireS

+0

また、一度に50の行を表示するために単純な仮想モードを実行する場合、何をする必要がありますか? – CireS

関連する問題