2009-03-10 15 views
4

ich eine Datagridview auf eine Liste von Geschäftsobjekten gebunden haben zu arbeiten:Datagridview-Spaltenreihenfolge scheint nicht

Dim template As New IncidentTemplate 
Dim temps As List(Of IncidentTemplate) = template.LoadAll 
Dim bs As New BindingSource 

If Not temps Is Nothing Then 

    bs.DataSource = temps 
    Me.dgvTemplates.DataSource = bs 

End If 

ich dann ein ungebundenes Schaltfläche Spalte hinzufügen und unsichtbar einige der gebundenen Spalten machen:

 Dim BtnCol As New DataGridViewButtonColumn 
     With BtnCol 
      .Name = "Edit" 
      .Text = "Edit" 
      .HeaderText = String.Empty 
      .ToolTipText = "Edit this Template" 
      .UseColumnTextForButtonValue = True 
     End With 

     .Columns.Add(BtnCol) 
     BtnCol = Nothing 

     For Each col As DataGridViewColumn In Me.dgvTemplates.Columns 

       Select Case col.Name 

       Case "Name" 
        col.DisplayIndex = 0 
        col.FillWeight = 100 
        col.Visible = True 

       Case "Description" 
        col.DisplayIndex = 1 
        col.FillWeight = 100 
        col.Visible = True 

       Case "Created" 
        col.DisplayIndex = 3 
        col.HeaderText = "Created On" 
        col.DefaultCellStyle.Format = "d" 
        col.FillWeight = 75 
        col.Visible = True 

       Case "CreatedBy" 
        col.DisplayIndex = 2 
        col.HeaderText = "Created By" 
        col.FillWeight = 75 
        col.Visible = True 

       Case "Edit" 
        col.DisplayIndex = 4 
        col.HeaderText = "" 
        col.FillWeight = 30 
        col.Visible = True 

       Case Else 
        col.Visible = False 

      End Select 

     Next 

Das scheint ziemlich gut zu funktionieren, außer was ich mache, die Knopfspalte (Edit) wird immer in der Mitte der anderen Spalten statt am Ende angezeigt. Ich habe sowohl DGV.Columns.Add und DGV.Columns.Insert versucht, als auch den DisplayIndex der Spalte (dies funktioniert für alle anderen Spalten), aber ich bin nicht in der Lage, die Button-Spalte an der richtigen Stelle anzuzeigen. Ich habe auch versucht, die Knopfspalte vor und nach dem Setzen der restlichen Spalten hinzuzufügen, aber das scheint keinen Unterschied zu machen Kann jemand vorschlagen, was ich falsch mache? Es macht mich verrückt ...

Antwort

16

Ich stolperte auf Ihren Beitrag, während Sie ein ähnliches Problem zu lösen suchen. Ich habe es schließlich ausfindig gemacht, indem ich (unter Verwendung der DisplayIndex-Eigenschaft) die AutoGenerateColumns-Eigenschaft von DataGridView auf false gesetzt habe. Diese Eigenschaft ist im Designer nicht sichtbar, also habe ich sie einfach zum Konstruktor für mein Formular hinzugefügt. Stellen Sie sicher, dass Sie dies tun, bevor Sie die Datenquelle für Ihr Raster festlegen.

Hope this helps ...

+1

Für mich ich die Designer wurde mit Spalten hinzufügen (etwas abgebildet, andere nicht), und noch war ich Spalten immer aus Auftrag. Die Einstellung 'AutoGenerateColumns = false;' vor der Bindung hat den Trick gemacht. Danke Kumpel. –

4

Die AutoCreateColumn ist das Problem. Der folgende Artikel gibt ein Beispiel für das Beheben von es. in einem Datenrasteransicht

Von DataDridView DisplayOrder Not Working

Wenn die Displayindex der Spalte Einstellung, waren einige Spalten in der falschen Reihenfolge. Um das Problem zu beheben, musste ich AutoGenerateColumns vor dem Festlegen der Datenquelle auf "True" und nach dem Setzen auf "FALSE" festlegen.

Beispiel:

dgvReservedStalls.AutoGenerateColumns = True 
dgvReservedStalls.DataSource = clsReservedStalls.LoadDataTable() 
dgvReservedStalls.AutoGenerateColumns = False 
+0

Dieser arbeitete für mich + auch Sie können die Spalten autogen dann neu anordnen. – stigzler

2

Der gleiche Problem hier, und nach einer Weile suchen, fand ich heraus, dass die DisplayIndexes in absteigender Reihenfolge es für mich, indem gemacht.

Es ist kontraintuitiv, weil es eine Nummer ist, aber ich musste sie trotzdem in Ordnung bringen.

Dies funktioniert:

With customersDataGridView 
    .Columns("ContactName").DisplayIndex = 0 
    .Columns("ContactTitle").DisplayIndex = 1 
    .Columns("City").DisplayIndex = 2 
    .Columns("Country").DisplayIndex = 3 
    .Columns("CompanyName").DisplayIndex = 4 
End With 

Während dies nicht tat:

With customersDataGridView 
    .Columns("ContactName").DisplayIndex = 0 
    .Columns("CompanyName").DisplayIndex = 4 
    .Columns("Country").DisplayIndex = 3 
    .Columns("ContactTitle").DisplayIndex = 1 
    .Columns("City").DisplayIndex = 2 
End With