2009-08-12 3 views
7

Ich versuche, eine einfache DataGridView anzuzeigen, die mit einer DataTable verknüpft ist, und ich möchte schließlich meine erste Spalte in der DataTable die Zeilenheaderzelle für das DataGridView sein. An diesem Punkt werde ich mich damit begnügen, irgendeinen Wert in der Zeilenkopfzelle zu haben. Ich kann das DataGridView mit all meinen Zeilen und Spalten und mit Spaltenüberschriftenzellen, aber ohne Zeilenüberschriftzelle anzeigen. Ich überprüfe den Wert in der row.HeaderCell.Value, und die Daten, die ich dort hingelegt habe, sind da. Ich überprüfe row.HeaderCell.Displayed und es ist falsch, aber das ist nur lesbar, also kann ich es nicht wahr machen. Wie mache ich die Anzeige der Zeilenkopfzeile?DataGridView Anzeigenzeile Headerzelle

Hier ist ein einfaches Beispiel, was ich versucht habe, diese an die Arbeit zu machen:

 DataTable table = new DataTable(); 
     for (int i = 0; i<10; i++) 
     { 
      table.Columns.Add(new DataColumn("column-" + i)); 
     } 

     for (int i = 0; i < 10; i++) 
     { 
      DataRow theRow = table.NewRow(); 

      for (int j = 0; j < 10; j++) 
       theRow[j] = i + "-" + j; 
      table.Rows.Add(theRow); 

     } 

     dataGridView1.DataSource = table; 
     dataGridView1.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders; 
     int rowNumber = 1; 
     foreach (DataGridViewRow row in dataGridView1.Rows) 
     { 
      if (row.IsNewRow) continue; 
      row.HeaderCell.Value = "Row " + rowNumber; 
      rowNumber = rowNumber + 1; 
     } 
     dataGridView1.AutoResizeRowHeadersWidth(
      DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders); 

Antwort

1

Die Antwort scheint das DataGridView.CellFormatting Ereignis zu behandeln. Warum es nicht möglich ist, den Wert anderswo zu setzen, ist mir ein Rätsel, aber ich bin mir sicher, dass es einen Grund dafür gibt. Ich fügte den folgenden Ereignishandler hinzu und alles ist gut:

private void dataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
    { 
     DataGridView gridView = sender as DataGridView; 

     if (null != gridView) 
     { 

      gridView.Rows[e.RowIndex].HeaderCell.Value = gridView.Rows[e.RowIndex].Cells[0].Value; 
      Console.WriteLine("GridViewCell: " + gridView.Rows[e.RowIndex].Cells[0].Value); 

     } 
    } 
+0

Ich glaube, das ist eine Art Bug. In VB.NET können Sie 'HeaderCell.Value' nach Bedarf festlegen. Dennoch müssen Sie auf Ihre Arbeit in C# zurückgreifen. –

+2

Dies liegt daran, dass der Code vom Konstruktor ausgeführt wird. Verschieben Sie den Code in Load-Ereignis oder einen anderen Ereignishandler. – AMissico

+0

Dies wird für jede Spalte aufgerufen, so ist es ein wenig verschwenderisch. Möglicherweise möchten Sie es ändern, damit es e.ColumnIndex == 0 überprüft, bevor es den HeaderCell.Value setzt. –

9

Wenn Sie diesen Code in den Konstruktor einfügen, wird es nicht funktionieren. Verschieben Sie den Code in das Ereignis Load des Formulars, und es sollte gut funktionieren. Ein häufiges Problem mit Windows.Forms und C# ist die Verwendung einer falschen Initialisierung im Konstruktor. Viele Steuerelemente werden erst nach Abschluss des Konstruktors vollständig erstellt. (Ich vergesse den Grund, aber ich glaube, es liegt daran, dass das Handle noch nicht erstellt wurde.) Viele "Work arounds" können vermieden werden, wenn Sie das Ereignis Load wie von Microsoft empfohlen initialisieren.

1

Nach Werte an die Datagridview zuweisen, entweder durch Bindung oder manuell, habe ich die folgenden:

foreach (DataGridViewRow row in dgvValues.Rows) 
{ 
    row.HeaderCell.Value = (row.Index+1).ToString(); 
} 

und es funktionierte für mich. Ich denke, es sollte eine noch einfachere Problemumgehung in Linq geben. als gegeben

4

Rufen Sie ToString() unter

row.HeaderCell.Value = ("Row " + rowNumber).ToString(); 
+0

@Andro Selva: Wenn diese Logik mit CTOR verknüpft ist, kann ich den HeaderCell-Wert nicht sehen, wenn das Formular gerendert wird. Wenn ich diese Methode in Form_Load() aufrufen, funktioniert das. :) –

1

benutzte ich Karls Antwort, aber die Ereignishandler RowsAdded geändert, wird die Zeile Header-Namen unter der Annahme, nicht einmal die Zeile zu ändern erstellt wird. Das Problem mit CellFormatting ist, dass es für jede Spalte aufgerufen wird, so dass es einige Zeit verschwendet, den HeaderCell.Value immer und immer wieder zu setzen.