【问题场景】:新建窗体应用程序,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());
}
}
}