2009-08-12 48 views
7

Estoy tratando de mostrar un DataGridView simple vinculado a un DataTable y quiero, en última instancia, que mi primera columna en el DataTable sea la celda del encabezado de fila para el DataGridView. En este punto, me conformaré con tener cualquier valor en la celda del encabezado de la fila. Puedo mostrar DataGridView con todas mis filas y columnas, y con las celdas de encabezado de columna, pero sin celda de encabezado de fila. Verifico el valor en la fila.HeaderCell.Value, y los datos que coloco allí están ahí. Compruebo row.HeaderCell.Displayed y es falso, pero esto es de solo lectura, por lo que no puedo hacerlo cierto. ¿Cómo hago que se muestre la celda del encabezado de fila?DataGridView muestra la celda del encabezado de fila

Aquí hay una simple muestra de lo que he tratado de conseguir que esto funcione:

 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); 

Respuesta

1

La respuesta parece ser controlar el evento DataGridView.CellFormatting. Por qué configurar el valor en otro lugar no funciona está más allá de mí, pero estoy seguro de que hay una razón. Agregué el siguiente controlador de eventos y todo está bien:

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

Creo que esto es algún tipo de error. En VB.NET, puede establecer 'HeaderCell.Value' según sea necesario. Sin embargo, debes recurrir a tu trabajo en C#. –

+2

Esto se debe a que el código se ejecuta desde el constructor. Mueve el código al evento Load u otro manejador de eventos. – AMissico

+0

Esto se llama para cada columna, por lo que es un poco derrochador. Es posible que desee cambiarlo para que compruebe e.ColumnIndex == 0 antes de establecer el HeaderCell.Value. –

9

Si coloca este código en el constructor, no funcionará. Mueva el código al evento Load del formulario y debería funcionar bien. Un problema común con Windows.Forms y C# es el uso de una inicialización incorrecta en el constructor. Muchos controles no se crean completamente hasta que el constructor finaliza. (No recuerdo por qué, pero creo que es porque todavía no se creó el identificador). Se pueden evitar muchos "problemas" si se inicializa en el evento Load según lo recomendado por Microsoft.

1

Después de asignar valores a la DataGridView, ya sea mediante la unión o de forma manual, lo hice lo siguiente:

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

y funcionó para mí. Creo que debería haber alguna solución aún más simple en Linq.

4

Sólo tiene que llamar ToString() como se indica a continuación

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

@Andro Selva: si esta lógica está vinculada a CTOR, entonces no puedo ver el valor de HeaderCell cuando se procesa el formulario. Si llamo a este método en Form_Load(), esto funciona. :) –

1

utilicé la respuesta de Karl, pero cambió el controlador de eventos para RowsAdded, asumiendo el nombre de encabezado de fila no está cambiando una vez creada la fila. El problema con CellFormatting es que se llama para cada columna, por lo que se pierde un tiempo configurando HeaderCell.Value una y otra vez.

private void dataGridViewVersions_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) 
    { 
     DataGridView gridView = sender as DataGridView; 
     MyData vr = gridView.Rows[e.RowIndex].DataBoundItem as MyData ; 
     if (vr != null) 
     { 
      gridView.Rows[e.RowIndex].HeaderCell.Value = vr.RowName.ToString(); 
     } 
    } 
Cuestiones relacionadas