DataGridView滚动时的虚拟模式自动大小行

时间:2017-02-16 22:34:50

标签: c# winforms datagridview

我想使用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会快速加载,但是当加载表单时,只会调整第一个可见行的高度。当我向下滚动时,行中的数据将从列表中更改为新值,但高度不会更改。但是,当我调整表单大小时,行高度会按照它应该更新。

0 个答案:

没有答案