2012-06-29 29 views
3

我似乎无法弄清楚这里发生了什么......我有一个dataGridView,在任何给定时间不超过500行,但通常在200或300左右。我遍历网格并根据用户交互设置按钮文字和颜色。例如:DataGridView SLOW当给单元格赋值时

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     DataGridViewButtonColumn btn; 
     ContextMenuStrip ctxtStartStop; 

     public Form1() 
     { 
      InitializeComponent(); 

      formatGrid(); 
      populateGrid(); 

      ctxtStartStop = new ContextMenuStrip(); 
      ctxtStartStop.Items.Add("START ALL"); 
      ctxtStartStop.Items.Add("STOP ALL"); 
      ctxtStartStop.ItemClicked += new ToolStripItemClickedEventHandler(ctxtMenuStrip_ItemClicked); 
     } 

     private void formatGrid() 
     { 
      btn = new DataGridViewButtonColumn(); 
      btn.Text = "START"; 
      btn.Name = "colStartStop"; 
      btn.HeaderText = "Start/Stop"; 
      btn.DefaultCellStyle.BackColor = Color.LightGreen; 
      btn.DefaultCellStyle.ForeColor = Color.Black; 
      btn.ReadOnly = false; 
      btn.UseColumnTextForButtonValue = false; 
      btn.FlatStyle = FlatStyle.Standard; 
      btn.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; 

      gridDisplay.AutoGenerateColumns = false; 
      gridDisplay.AllowUserToAddRows = false; 
      gridDisplay.RowHeadersVisible = false; 
      gridDisplay.Columns.Add(new DataGridViewTextBoxColumn() 
      { 
       Name = "colSymbol", 
       HeaderText = "Symbols", 
       ReadOnly = true, 
       AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill, 
       MinimumWidth = 50 
      }); 
      gridDisplay.Columns.Add(btn); 

      gridDisplay.MouseClick += new MouseEventHandler(gridDisplay_MouseClick); 
     } 

     private void populateGrid() 
     { 
      for (int i = 0; i < 500; i++) 
      { 
       gridDisplay.Rows.Add("XYZ", "START"); 
      } 
     } 

     private void gridDisplay_MouseClick(object sender, MouseEventArgs e) 
     { 
      if (e.Button == System.Windows.Forms.MouseButtons.Left) 
       return; 

      int rowPosition = gridDisplay.HitTest(e.X, e.Y).RowIndex; 
      int colPosition = gridDisplay.HitTest(e.X, e.Y).ColumnIndex; 

      if (rowPosition == -1 && colPosition == 1) 
      { 
       ctxtStartStop.Show(gridDisplay.PointToScreen(e.Location)); 
      } 
     } 

     private void ctxtMenuStrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e) 
     { 
      if (e.ClickedItem.Text == "START ALL") 
      { 
       ctxtStartStop.Hide(); 
       startAll(); 
      } 
      else if (e.ClickedItem.Text == "STOP ALL") 
      { 
       ctxtStartStop.Hide(); 
       stopAll(); 
      } 
     } 

     private void startAll() 
     { 
      string action = string.Empty; 
      int idx = 1; 

      for (int i = 0; i < gridDisplay.Rows.Count; i++) 
      { 
       var btnCell = gridDisplay.Rows[i].Cells[idx]; 

       action = (string)btnCell.Value; 

       if (action == "START") 
       { 
        btnCell.Value = "STOP"; 
        gridDisplay.Rows[i].Cells["colStartStop"].Style.BackColor = Color.Red; 
        gridDisplay.Rows[i].Cells["colStartStop"].Style.ForeColor = Color.White; 
       } 
      } 
     } 

     private void stopAll() 
     { 
      string action = string.Empty; 
      int idx = 1; 

      for (int i = 0; i < gridDisplay.Rows.Count; i++) 
      { 
       var btnCell = gridDisplay.Rows[i].Cells[idx]; 

       action = (string)btnCell.Value; 

       if (action == "STOP") 
       { 
        btnCell.Value = "START"; 
        gridDisplay.Rows[i].Cells["colStartStop"].Style.BackColor = Color.LightGreen; 
        gridDisplay.Rows[i].Cells["colStartStop"].Style.ForeColor = Color.Black; 
       } 
      } 
     } 
    } 
} 

有趣的是,设置颜色工作正常,但是当我设置值运行速度非常慢。

有人可以请解释我在做什么错在这里。

谢谢 -DA

+0

你可以请一些更好的代码布局/格式的代码,因为这是不友好的阅读或解决 – JohnnBlade

+0

你不能让一个'DataSource'与相关的值(在源中进行更改)并绑定它们,处理'CellFormatting'事件中的颜色 – V4Vendetta

+0

我发现这篇文章是因为我也有同样的问题。我从MyClass的内存字典中为每个DataGridView添加了400行,每行有十几个单元格,耗时0.15秒。但是,如果我添加2行代码,如“dgv_mainlist.Rows [r_index] .Cells [3] .Value =”“;”它需要1秒钟来运行整个事情。通过为每行2个单元添加值,将时间延长将近5至6倍。 - 3年,仍然没有回应这个职位...我想我不会屏住呼吸。看起来像是控制中的问题。 –

回答

4

我也曾经是一个DataGridView更改单元格的值和遇到速度缓慢。当插入行后,每行更改2个值时,它需要加载5-6倍的时间。

对我来说,问题是以下属性:

dgv_mainlist.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; 

Evidentally DataGridView的重新计算各列中的值是在小区变更,以确保所有文字时间宽度是明显的 - 上述指定属性。在我的代码中使用秒表,大约需要1秒钟加载400行,每行约12个单元。

然后我的属性设置为:

dgv_mainlist.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None; 

现在我的DataGridView花费大约0.05秒的负载。快20倍!

当然,其他选项是插入每一行时输入单元格的值,但在我的情况下,这是不可能的。

如果您需要将上述autosize属性设置为“AllCells”,您可以在更改值之前将autosize设置为“None”,然后完成后将其设置为“AllCells”。它只增加了0.1秒的加载时间,比把它设置为“AllCells”的时间要好得多,这对我的加载时间增加了几乎一秒。

信用转到this page帮助我找到答案。

补充说明:我的DataGridView没有绑定到数据源。行通过代码中的循环插入。

0

将自动调整模式设置为无。

paginationGirdView.Columns["colActualTime"].AutoSizeMode = DataGridViewAutoSizeColumnMode.None; 

//assign value 

row.Cells["colActualTime"].Value = "yesterday"; 
paginationGirdView.Columns["colActualTime"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; 

这将解决您陈述的问题。

+0

刚刚测试过,这对性能没有任何影响,如果不是比原始速度慢或慢。 – IamBatman