首页 新闻 会员 周边

【内存消耗问题】DataGridViewComboboxColoumn关于Items属性和DataSource属性的性能开销问题

0
悬赏园豆:50 [待解决问题]

【问题场景】:新建窗体应用程序,Form中添加1个DataGridView控件,并新增1列数据(列类型为DataGridViewComboboxColoumn)。下拉列表绑定15000条选项值,表格添加15000行数据行。

【问题对比】:分别使用Items属性和DataSource属性绑定下拉列表数据,打开Windows任务管理器,观察内存消耗。

【测试结果】:(1)情况一:使用DataSource绑定数据,内存开销很小,且速度快,当CtrlC操作时,GetClipboardContent()消耗内存快速增加许多;情况二:使用Items绑定数据,内存开销较大,且速度慢,当CtrlC操作时,GetClipboardContent()消耗内存变化不大

(2)两种情况下,内存消耗的最大值借相差不大

【!!!问题!!!】:内存开销花在什么地方了?如何保持用DataSource绑定数据的小开销和快速,又能避免GetClipboardContent()操作内存消耗过大?

【示例代码】:

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 TestComboBoxClipBoard
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            dataGridView1.KeyDown += new KeyEventHandler(dataGridView1_KeyDown);
        }

        void dataGridView1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Control && e.KeyCode == Keys.C)
            {
                //打断点,观察GetClipboardContent语句执行时,内存消耗情况
                DataObject data = dataGridView1.GetClipboardContent();
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            List<DataGridViewRow> rowList = new List<DataGridViewRow>();
            List<string> items = new List<string>();
            int itemsCount = 15000;

            for (int index = 0; index < itemsCount; index++)
            {
                items.Add(index.ToString());
            }

            //DataSource和Items的区别
            //使用DataSource【新建表内存消耗不大,CtrlC操作后观察可知内存消耗变大】
            (dataGridView1.Columns[0] as DataGridViewComboBoxColumn).DataSource = items.ToArray();
            //使用Items【新建表内存消耗大,CtrlC操作后内存变化不大】
            //(dataGridView1.Columns[0] as DataGridViewComboBoxColumn).Items.AddRange(items.ToArray());

            for (int index = 0; index < itemsCount; index++)
            {
                DataGridViewRow row = new DataGridViewRow();
                object[] para = { "123" };
                row.CreateCells(dataGridView1, para);
                rowList.Add(row);
            }

            dataGridView1.Rows.AddRange(rowList.ToArray());
        }
    }
}

青竹叶的主页 青竹叶 | 初学一级 | 园豆:150
提问于:2011-08-08 15:57
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册