2009-11-17 8 views
7

¿Alguien podría decirme por qué estoy recibiendo filas en blanco después de ejecutar este código?Obteniendo filas en blanco después de establecer DataGridView.DataSource

... 
dataGridView.AutoGenerateColumns = false; //must be false, else getting additional columns from SQL 
dataGridView.DataSource = dataSet.Tables[0].DefaultView; 

también trató

dataGridView.Update(); 

pero no funciona.

El conteo de filas está bien, pero ¿por qué obtengo filas en blanco?

Estoy usando Winforms.

Respuesta

3

Lo que está contenido en el conjunto de datos?

Quizás la DataTable contenida en su DataSet no tenga filas. Dejaría AutoGenerateColumns en verdadero y simplemente ocultaré manualmente qué columnas no quieres ver. Nunca he usado AutoGenerateColumns = false. Sin embargo, sin más código, será difícil de diagnosticar. Intente intercambiar esas dos declaraciones (.DataSource primero).

AutoGenerateColumns puede no tener ningún efecto en la fuente de enlace correspondiente (DataTable from DataSet).

conjunto de datos debe ser llenado por el adaptador de datos:

// Example 
DataAdapter = new SqlDataAdapter(); 
DataAdapter = CreateInventoryAdapter(); 
DataAdapter.TableMappings.Add("Table", "GARAGE"); 

DataAdapter.Fill(myDataSet); 
myDataView = myDataSet.Tables[0].DefaultView; 
dataGridView1.DataSource = myDataView 
+0

Chicos gracias por su ayuda, pero no quiero dedicarle más tiempo a esto. Mi código extendido también funciona bien, así que no quiero cambiarlo más. Saludos cordiales – Jooj

4

Además, si está utilizando AutoGenerateColumns = false, asegúrese de que ha añadido algunas columnas enlazadas, o se obtendrá una fila en blanco para cada registro

+0

¿Tiene un breve ejemplo de cómo agregar columnas encuadernadas? – Jooj

+0

Ver la publicación de Sorin Comanescu a continuación. Esa es la manera de hacerlo. – tardomatic

9

Pruebe algo como lo siguiente:

grid.AutoGenerateColumns = false; 

DataGridViewColumn col = new DataGridViewTextBoxColumn(); 
col.DataPropertyName = "Prop1"; 
col.HeaderText = "Property 1"; 
grid.Columns.Add(col); 

col = new DataGridViewTextBoxColumn(); 
col.DataPropertyName = "Prop2"; 
col.HeaderText = "Property 2"; 
grid.Columns.Add(col); 

grid.DataSource = dataSet.Tables[0].DefaultView; 

Prop1 & Prop2 debe coincidir con los nombres de las columnas de su tabla. Propiedad 1 & La propiedad 2 es el texto del encabezado que se mostrará.

EDIT:

A partir del ejemplo que diste parece que estás combinando columnas enlazadas con columnas no unidos.

Haga lo siguiente:

1.Retire cualquier columna añadieron mediante el diseñador 2.Add este código:

grid.AutoGenerateColumns = false; 

DataGridViewColumn colID = new DataGridViewTextBoxColumn(); 
colID.DataPropertyName = "customerID"; 
colID.HeaderText = "Ident."; 
grid.Columns.Add(colID); 

DataGridViewColumn colName = new DataGridViewTextBoxColumn(); 
colName.DataPropertyName = "customerFirstName"; 
colName.HeaderText = "First name"; 
grid.Columns.Add(colName);  
grid.DataSource = dataSet.Tables[0].DefaultView; 

HTH.

+0

Mi código hace lo mismo que el tuyo. Solo que configuro columnas de datagridview en el diseñador y coinciden con los nombres de las columnas de mi tabla. – Jooj

+0

Entonces, si está vinculando la cuadrícula usando el diseñador y obtener columnas adicionales de sql es su única preocupación, podría simplemente hacer invisibles las columnas indeseables utilizando el diseñador. –

+0

Podría hacerlos invisibles pero los textos del encabezado de las columnas adicionales son diferentes de las otras columnas hechas con el diseñador. p.s .: Esto es para una aplicación de varios idiomas. – Jooj

1

Ok una muestra más extensa:

que hice en el diseñador de algunas columnas:

nombres de columna: customerID and customerFirstName

columna HeaderText: Ident. and First name

en cuando me siento algunos datos de tabla de SQL ...

sql = "select customerID, customerFirstName From customer;"; 

dataGridView.AutoGenerateColumns = false; 
dataGridView.DataSource = dataSet.Tables[0].DefaultView; 

y las columnas de la tabla sql son las mismas que los nombres de columna en dataGridView.

El resultado que obtengo cuando dataGridView.AutoGenerateColumns = false; es una columna de dos columnas DataGridView con headerText Ident. | First name.

Cuando configuro dataGridView.AutoGenerateColumns = true;, obtengo columnas dataGridView como esta: Ident. | First name | customerID | customerFirstName.

todas las filas inferiores Ident y First name son empty y todos los demás por debajo de customerID y customerFirstName son ok.

Ahora quiero que las filas inferiores customerID y customerFirstName estarían bajo Ident y First name y columnas customerID y customerFirstName debe estar oculto.

de escribir este código y funciona:

DataTable dTable = dataGridView.GetTable().Tables[0]; 

foreach (DataRow dataRow in dataGridView.GetTable().Tables[0].Rows) 
{ 
    int n = dataGridView.Rows.Add(); 
    foreach (DataColumn dataColumn in dTable.Columns) 
    { 
     dataGridView.Rows[n].Cells[dataColumn.ColumnName].Value = dataRow[dataColumn.ColumnName].ToString(); 
    } 
} 

Pero qué dosis no DataGridView hacer esto por mí con este código:

dataGridView.DataSource = dataSet.Tables[0].DefaultView;

+0

¿Has llenado tu DataSet? DataAdapter = new SqlDataAdapter(); DataAdapter = CreateInventoryAdapter(); DataAdapter.TableMappings.Add ("Tabla", "GARAGE"); DataAdapter.Fill (myDataSet); myDataView = myDataSet.Tables [0] .DefaultView; dataGridView1.DataSource = myDataView –

14

He encontrado el problema.

Diseñé columnas en el diseñador de VS datagridview. No es el nombre de la columna, pero la columna DataPropertyName debe coincidir con los campos en la base de datos.

Luego, también se ocultarán las columnas duplicadas.

4

Sé que ha pasado mucho tiempo desde que publicó esto, pero tuve el mismo problema y descubrí la respuesta, así que pensé en publicarlo para que otros pudieran beneficiarse.

La razón por la que sus columnas estaban en blanco se debe a que también necesita establecer DataPropertyName de cada una de las columnas en el diseñador para que coincida con los nombres de campo de la base de datos. Simplemente establecer el nombre del diseño no es suficiente.

Espero que ayude a alguien.

1

Me.dgvList.AutoGenerateColumns = False

Dim col = New DataGridViewTextBoxColumn() 
    col.DataPropertyName = "VisitNo" 
    col.HeaderText = "Sr. No." 
    dgvList.Columns.Add(col) 

Funciona

0

Trate de añadir este código antes de cargar la cuadrícula

dataGridView.ColumnCount = 0; 
0

Así que tenían una implementación personalizada donde doy los usuarios la capacidad de guardar los filtros tipo Excel de las columnas.

Cargué los resultados en la cuadrícula, pero no apareció nada porque el filtro de Excel en una columna no podía coincidir con nada.

Cuestiones relacionadas