¿Cómo visualizo solo ciertas columnas de una tabla de datos?
Pregunta
Estoy usando un servicio web que devuelve un conjunto de datos. en este conjunto de datos hay 5 tablas, digamos tablas A, B, C, D, E. Yo uso la tabla A.
Entonces
DataTable dt = new DataTable()
dt = dataset.Table["A"]
Ahora en esta tabla de datos hay columnas a1, a2, a3, a4, a5, a6, a7.
Digamos que solo quiero obtener las columnas a3 y a4 y luego enlazarlas a mi cuadrícula de datos.
¿Cómo hago esto?
Solución
Ignora el hecho de que tienes más datos de los que necesitas. Establezca AutoGenerateColumns
en false
. Cree BoundColumns
para a3
y a4
.
Otros consejos
Recomiendo leer este artículo de 4GuysFromRolla para cualquier persona que necesite una buena comprensión del control web DataGrid
.
Nota: Ya que esta pregunta ya está contestada. Quiero aclarar qué se debe hacer, en caso de que alguien más se esté preguntando.
DataSet ds;
//Get Data
using (SqlConnection connection = new SqlConnection(connectionString))
{
// Create the command and set its properties.
SqlCommand command = new SqlCommand();
command.Connection = connection;
command.CommandText = "GetMyData";
command.CommandType = CommandType.StoredProcedure;
ds = connection.ExecuteDataSet();
}
if(ds !=null && ds.Tables.Count > 0)
{
dg.DataSource = ds.Tables[0];
// disable autogeneration of columns
dg.AutoGenerateColumns = false;
//Hide unecessary columns
dg.Columns["a3"].Visible = false;
dg.Columns["a4"].Visible = false;
}
Debería enlazar toda la tabla y luego configurar la visibilidad de las columnas de la siguiente manera
dgvMain.Columns[ColumnA3_Name].Visible = true;
dgvMain.Columns[ColumnA1_Name].Visible = false;
Siempre puedes intentar establecer las propiedades de DataPropertyName de columnas particulares para que coincidan con lo que hay en tu DataTable. Luego vincule esa DataTable a un BindingSource y enlace esa fuente de enlace a su grilla.
Siempre que los nombres de las columnas en su DataTable coincidan con los DataPropertyNames de sus columnas de DataGrid, su cuadrícula de datos debería mostrar solo las columnas coincidentes.
En mi ejemplo, mi proceso stred hace algo similar a esto:
ALTER PROCEDURE ps_Clients_Get
AS
BEGIN
SELECT
convert(varchar(2000), path) as [Client Folder],
c.description as [Client Name],
c.*
FROM Client c
END
GO
y mi código C #:
using (DataTable dt = new DataTable())
{
using (OdbcConnection cnDsn = new OdbcConnection(cmLocalTrackingDBDSNAME))
{
cnDsn.Open();
using (OdbcCommand cmdDSN = new OdbcCommand())
{
var _with1 = cmdDSN;
_with1.Connection = cnDsn;
_with1.CommandType = System.Data.CommandType.StoredProcedure;
_with1.CommandText = "{ CALL ps_Clients_Get }";
using (OdbcDataAdapter adapter = new OdbcDataAdapter())
{
dt.Locale = System.Globalization.CultureInfo.InvariantCulture;
adapter.SelectCommand = cmdDSN;
adapter.Fill(dt);
bindingSourceDataLocation.DataSource = dt;
dataGridViewDataLocation.AutoGenerateColumns = false;
dataGridViewDataLocation.DataSource = bindingSourceDataLocation;
}
}
cnDsn.Close();
}
}
¡Buena suerte!
Se puede utilizar el siguiente código de seguimiento
//It represent name of column for which you want to select records
string[] selectedColumns = new[] { "a3", "a4" };
DataTable tableWithSelectedColumns = new DataView(dataset.Table["A"]).ToTable(false, selectedColumns);
He intentado esto y funciona.
Dim DT As DataTable = YourDT
DGV.DataSource = dt
DGV.AutoGenerateColumns = False
Dim cc = DGV.ColumnCount
For i = 0 To cc - 1
DGV.Columns(i).Visible = False
Next
DGV.Columns("ColumnToShow").Visible = True
DGV.Columns("ColumnToShow").Visible = True