C# DataGridView虚拟模式滚动时自动调整行大小

C# DataGridView虚拟模式滚动时自动调整行大小,c#,winforms,datagridview,C#,Winforms,Datagridview,我想使用DataGridView的虚拟模式,因为我有超过150k行(总是2列)。DataGridView中的数据是从文件中提取的,是只读的(用户不能添加或删除行)。但是,我的某些行需要比其他行具有更高的高度,因为其中显示的数据位于多行上 我目前正在填充DataGridView,如下所示: private struct ContactEntry { public string Name { get; set; } public string Addr { get; set; } }

我想使用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;
    }
}
private struct ContactEntry
{
公共字符串名称{get;set;}
公共字符串Addr{get;set;}
};
private void UpdateDagRidView(列表列表联系人)
{    
List newList=新列表();
for(int index=0;index

这样,由于虚拟模式,UI加载很快,但是当表单加载时,只调整第一个可见行的高度。当我向下滚动时,行中的数据会更改为列表中的新值,但高度不会更改。但是,当我调整窗体大小时,行高度会像应该的那样进行更新。

请尝试:“_-dgvContacts.AutoSizeRowsMode=DataGridViewAutoSizeRowsMode.AllCells;”@Graffi是否必须使用将此属性设置在特定位置?因为我尝试了你的建议,但它不起作用。当网格处于VirtualMode时,使用AllCells模式时要小心。这将为每个单元调用CellValueRequired事件,以确定要设置的大小,从而否定虚拟模式的用途。我在处理百万行数据集时遇到了这个问题,它将我的系统锁定了几分钟。