gpt4 book ai didi

c# - 为单元格赋值时 DataGridView SLOW

转载 作者:行者123 更新时间:2023-11-30 14:14:46 27 4
gpt4 key购买 nike

我似乎无法弄清楚这里发生了什么......我有一个在任何给定时间不超过 500 行的 dataGridView,但通常在 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 行(每行约 12 个单元格)大约需要 1 秒。

然后我将属性设置为:

dgv_mainlist.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;

现在我的 DataGridView 大约需要 0.05 秒来加载。快二十倍!

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

如果您像我一样需要将上述自动调整大小属性设置为“AllCells”,您可以在更改值之前将自动调整大小设置为“无”,然后在完成后将其设置为“AllCells”。它只使我的加载时间增加了 0.1 秒,这比一直将其设置为“AllCells”要好得多,后者使我的加载时间增加了将近一秒。

归功于 this page帮助我找到答案。

添加注释:我的 DataGridView 未绑定(bind)到数据源。在代码中通过循环插入行。

关于c# - 为单元格赋值时 DataGridView SLOW,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11256967/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com