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

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

List items = new List();

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());

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值