bla

.NET madness featuring a TabControl, a DataGridView and some HeaderCells

Dienstag, 8.3.2016, 11:46 > da]v[ax

I think I just found a bug in the .NET-Framework (v4.5). I can reproduce this in VS2015 in Visual Basic, I haven't tried it in C# as of yet.

Here's what I wanted to achieve:

Task: Create a Windows Form with a Tabcontrol. The second tab has a DataGridView. This DataGridView should show some values in each row's HeaderCell.

The usual approach:

1. Create a new Form. Add a TabControl. The first TabPage is empty:

Screenshot_160308_11-17-10

the second TabPage features a DataGridView:

Screenshot_160308_11-17-23

Please note that initially the first TabPage is selected!

2. In your Form.New(), create a DataTable and databind it to the DataGridView:

Public Sub New()

' This call is required by the designer.
InitializeComponent()

' Add any initialization after the InitializeComponent() call.
Dim dt As New DataTable("SomeLines")
Dim col As DataColumn
col = New DataColumn("Col 1", Type.GetType("System.String"))
dt.Columns.Add(col)

col = New DataColumn("Col 2", Type.GetType("System.String"))
dt.Columns.Add(col)

For i As Integer = 0 To 10
Dim row As DataRow = dt.NewRow()
row(0) = "BLA" & i
row(1) = "something"
dt.Rows.Add(row)
Next

Me.DataGridView1.DataSource = dt
End Sub

3. In the Load()-Event of the form, write your HeaderCell.Values:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
For i As Integer = 0 To Me.DataGridView1.RowCount - 1
Me.DataGridView1.Rows(i).HeaderCell.Value = _
Me.DataGridView1.Rows(i).Cells(0).Value
Next
End Sub

The bug: The row headers are always empty!

Screenshot_160308_11-22-25

But: if you CTRL-X / CTRL-V the DataGridView to the first TabPage, the code magically works:

Screenshot_160308_11-23-56

The workaround: Before writing the HeaderCell-contents, make sure that the TabPage featuring the DataGridView is selected! You may deselect it afterwards:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
Me.TabControl1.SelectedIndex = 1
For i As Integer = 0 To Me.DataGridView1.RowCount - 1
Me.DataGridView1.Rows(i).HeaderCell.Value = Me.DataGridView1.Rows(i).Cells(0).Value
Next
Me.TabControl1.SelectedIndex = 0
End Sub

Result:

Screenshot_160308_11-26-37

Here's the Visual-Studio-Solution for download in case you want to reproduce the bug: DataGridViewHeaderCells.zip

I've got to write this to StackOverflow tonight. Finding this took me nearly a day! Damn!!

Antworten

Dein Kommentar

Das Kleingedruckte:
Halte Dich bitte an die Spielregeln. Welche Emoticons du verwenden kannst, steht hier. Kommentarabonnements werden automatisch nach 3 Monaten gelöscht.
 
 Wer HTML kann, ist klar im Vorteil. Diese Tags sind erlaubt:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
 
 Bei der Menge an Spam-Kommentaren passiert es hin und wieder, dass ein Kommentar vom Spamfilter gefressen wird. Bitte sei mir nicht böse aber ich habe weder Zeit noch Lust, solch verloren gegangenen Kommentaren hinterher zu forschen. Wenn das öfters passiert, schreib' mir 'ne Mail damit ich dich whitelisten kann.

OOPS!

Es sieht so aus, als hättest du keinen Werbeblocker installiert. Das ist schlecht für dein Gehirn und manchmal auch für deinen Computer.

Bitte besuche eine der folgenden Seiten und installiere dir einen AdBlocker deiner Wahl, danach kannst du todamax wieder ohne Einschränkungen genießen.


uBlock Origin: für Chrome | Firefox | Safari

AdGuard: für Chrome | Firefox | Safari | Opera | Yandex

AdBlock Plus: für Chrome | Firefox | Safari | Opera | Internet Explorer

uMatrix: für Firefox | Chrome | Opera

Ey, lass mich einfach rein, okay?
(Setzt per Javascript einen Cookie. Wenn Du das alles deaktiviert hast, weiß ich auch nicht, wie ich dir helfen soll)

Ich will das hier nie wieder sehen.
(Setzt per Javascript einen sehr langlebigen Cookie. Wenn Du das alles deaktiviert hast oder Cookies automatisch oder auch von Hand löschst, weiß ich auch nicht, wie ich dir helfen soll)

Ihr Browser versucht gerade eine Seite aus dem sogenannten Internet auszudrucken. Das Internet ist ein weltweites Netzwerk von Computern, das den Menschen ganz neue Möglichkeiten der Kommunikation bietet.

Da Politiker im Regelfall von neuen Dingen nichts verstehen, halten wir es für notwendig, sie davor zu schützen. Dies ist im beidseitigen Interesse, da unnötige Angstzustände bei ihnen verhindert werden, ebenso wie es uns vor profilierungs- und machtsüchtigen Politikern schützt.

Sollten Sie der Meinung sein, dass Sie diese Internetseite dennoch sehen sollten, so können Sie jederzeit durch normalen Gebrauch eines Internetbrowsers darauf zugreifen. Dazu sind aber minimale Computerkenntnisse erforderlich. Sollten Sie diese nicht haben, vergessen Sie einfach dieses Internet und lassen uns in Ruhe.

Die Umgehung dieser Ausdrucksperre ist nach §95a UrhG verboten.

Mehr Informationen unter www.politiker-stopp.de.