[英]DataGridView SLOW when assigning value to cell
我似乎無法弄清楚這里發生了什么...我有一個dataGridView,在任何給定時間不超過500行,但通常大約200或300.我遍歷網格並根據用戶交互設置按鈕文本和顏色。 例:
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
我也在改變DataGridView中的單元格值並且經歷了緩慢。 在插入行之后每行更改2個值時,加載時間為5-6倍。
對我來說問題是以下屬性:
dgv_mainlist.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
顯然,每次在單元格中更改值時,DataGridView都會重新計算列寬,以確保所有文本都可見 - 如上面的屬性所指定。 在我的代碼中使用秒表,加載400行需要大約1秒鍾,每行約12個單元格。
然后我將屬性設置為:
dgv_mainlist.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
現在我的DataGridView加載大約需要0.05秒。 快20倍!
當然另一種選擇是在插入每一行時輸入單元格值,但在我的情況下是不可能的。
如果你需要像我一樣將上面的autosize屬性設置為“AllCells”,你可以在更改值之前將autosize設置為“None”,然后在完成后將其設置為“AllCells”。 它只增加了0.1秒的加載時間,這比將它設置為“AllCells”整個時間要好得多,這幾乎加快了我的加載時間。
感謝您訪問此頁面以幫助我找到答案。
添加注釋:我的DataGridView未綁定到數據源。 在代碼中通過循環插入行。
將自動調整大小模式設置為無。
paginationGirdView.Columns["colActualTime"].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
//assign value
row.Cells["colActualTime"].Value = "yesterday";
paginationGirdView.Columns["colActualTime"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
這將解決您所述的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.