4

我似乎无法弄清楚这里发生了什么......我有一个 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

4

2 回答 2

10

我也在更改 DataGridView 中的单元格值并遇到缓慢。当我在插入行后每行更改 2 个值时,加载时间是 5-6 倍。

我的问题是以下属性:

dgv_mainlist.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

显然,每次更改单元格中的值时,DataGridView 都会重新计算列宽,以确保所有文本都是可见的——正如上面的属性所指定的那样。在我的代码中使用秒表,加载 400 行大约需要 1 秒,每行大约 12 个单元格。

然后我将属性设置为:

dgv_mainlist.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;

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

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

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

信用转到此页面以帮助我找到答案。

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

于 2015-12-10T15:59:57.067 回答
3

Set autosize mode to none.

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

//assign value

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

This will solve your stated problem.

于 2016-10-07T02:30:49.010 回答