dotnet / dotnet/winforms

DataGridView unshare rows in VirtualMode despite all conditions to prevent it are met.

Open
#6,930 5 comments 0 reactions 1 assignee Claimed by @kirsan31 View on GitHub
area-controls-DataGridView help wanted
Dominant language
C#
Stars
4.9k
Forks
1.1k
Avg merge
1d 13m
Merged PRs (30d)
85

Description

### .NET version

6.0.201

### Did it work in .NET Framework?

No

### Did it work in any of the earlier releases of .NET Core or .NET 5+?

Tested with .NET Framework 4.6.1, same issue.

### Issue description

When creating `DataGridView` and setting `VirtualMode` to `true` it is not possible to prevent rows from becoming unshared.

As far as i see, i did everything that is described in this [article](https://docs.microsoft.com/en-us/dotnet/desktop/winforms/controls/how-to-implement-virtual-mode-in-the-windows-forms-datagridview-control?view=netframeworkdesktop-4.8) to prevent rows becoming unshared, but no luck. This article is not updated for .NET Core or later.

Please take a look at the video, rows becoming unshared on row (cell) select (in 4.6.1 same behavior) but in 6.0.2 it also for some reason incrementally unshare all rows from 0 to the end in inconsistent manner (sometimes it won't start it unless row changed with arrow keys or some other woodoo)

https://user-images.githubusercontent.com/102589197/160618007-a6077a18-8869-4388-9cbd-52ea604f4fec.mp4

### Steps to reproduce

Code below is not exactly what i'm trying to achieve, it is a result of experiments to see if i can solve this issue.
My goal is to display large set of data using virtual mode without unsharing rows.

```cs
namespace WinFormsApp1;

internal static class Program
{
[STAThread]
static void Main()
{
ApplicationConfiguration.Initialize();
Application.Run(new Form1());
}
}

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

grid.ReadOnly = true;
grid.AllowUserToResizeColumns = false;
grid.AllowUserToResizeRows = false;
grid.ShowCellToolTips = false;
grid.Columns.Add(new DataGridViewColumn(new DataGridViewTextBoxCell()) { HeaderText = "One", Name = "c_one1" });
grid.Columns.Add(new DataGridViewColumn(new DataGridViewTextBoxCell()) { HeaderText = "Two", Name = "c_one2" });
grid.Columns.Add(new DataGridViewColumn(new DataGridViewTextBoxCell()) { HeaderText = "Three", Name = "c_one3" });
grid.Columns.Add(new DataGridViewColumn(new DataGridViewTextBoxCell()) { HeaderText = "Four", Name = "c_one4" });
grid.Columns.Add(new DataGridViewColumn(new DataGridViewTextBoxCell()) { HeaderText = "Five", Name = "c_one5" });
grid.VirtualMode = true;
grid.EnableHeadersVisualStyles = false;
grid.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
grid.RowHeadersVisible = false;
grid.MultiSelect = false;
grid.ColumnHeadersVisible = false;
grid.RowUnshared += Grid_RowUnshared;
grid.CellValueNeeded += Grid_CellValueNeeded;
grid.RowCount = 1000000;
}

private void Grid_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
{
e.Value = e.RowIndex.ToString();
}

private void Grid_RowUnshared(object sender, DataGridViewRowEventArgs e)
{
tb.AppendText($"Row {e.Row.Index} unshared" + Environment.NewLine);
}

#region Designer
private System.ComponentModel.IContainer components = null;
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
components.Dispose();
base.Dispose(disposing);
}

private void InitializeComponent()
{
this.grid = new System.Windows.Forms.DataGridView();
((System.ComponentModel.ISupportInitialize)(this.grid)).BeginInit();
this.SuspendLayout();
//
// grid
//
this.grid.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.grid.Location = new System.Drawing.Point(22, 12);
this.grid.Name = "grid";
this.grid.RowTemplate.Height = 25;
this.grid.Size = new System.Drawing.Size(534, 412);
this.grid.TabIndex = 0;
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(800, 450);
this.Controls.Add(this.grid);
this.Name = "Form1";
this.Text = "Form1";
//textbox
tb = new TextBox();
tb.Size = new Size(200, 412);
tb.Location = new Point(22 + 536, 12);
tb.Multiline = true;
Controls.Add(tb);

((System.ComponentModel.ISupportInitialize)(this.grid)).EndInit();
this.ResumeLayout(false);
}

private DataGridView grid;
private TextBox tb;
#endregion
}

```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.