我想使用DataGridView的虚拟模式,因为我有超过150k行(总是2列)。 DataGridView中的数据是从文件中提取的,并且是只读的(用户无法添加或删除行)。但是,我的一些行需要比其他行更高,因为它中显示的数据是多行。
我目前正在填充我的DataGridView:
private struct ContactEntry
{
public string Name { get; set; }
public string Addr { get; set; }
};
private void UpdateDataGridView(List<Contact> listContact)
{
List<ContactEntry> newList = new List<ContactEntry>();
for (int index = 0; index < listContact.Count; index++)
{
Contact ct = listContact[index];
string addresses = string.Empty;
if (Contact.Addrs != null)
{
// Construct list of addresses
foreach (string addr in Contact.Addrs)
{
addresses = String.Format("{0}{1}{2}", addresses, Environment.NewLine, addr);
}
// Removes first environment new line
addresses = addresses.Remove(0, 2);
var entry = new ContactEntry();
entry.Name = Contact.Name;
entry.Addr = addresses;
newList.Add(entry);
}
}
_dgvContacts = newList;
_dgvContacts.CellValueNeeded += _dgvContacts_CellValueNeeded;
// Set the row count
_dgvContacts.RowCount = newList.Count;
_dgvContacts.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
_dgvContacts.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCells;
if (_dgvContacts.CurrentCell != null)
{
_dgvContacts.CurrentCell.Selected = false;
}
}
private void _dgvContacts_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
{
switch (_dgvContacts.Columns[e.ColumnIndex].Name)
{
case "Name":
e.Value = _dgvContacts[e.RowIndex].Name;
break;
case "Addresses":
e.Value = _dgvContacts[e.RowIndex].Addr;
break;
}
}
这样,由于虚拟模式,UI会快速加载,但是当加载表单时,只会调整第一个可见行的高度。当我向下滚动时,行中的数据将从列表中更改为新值,但高度不会更改。但是,当我调整表单大小时,行高度会按照它应该更新。