net - fill datagridview c# with datatable
¿Cómo ordenar una columna DataGridView(vinculada a un BindingSource) por fecha? (2)
Quizás este código te dará una idea. Primero estoy configurando los datos:
DataTable dt = new DataTable();
dt.Columns.Add("DateOfBirth", typeof(DateTime));
dt.Rows.Add(new DateTime(1981, 10, 29));
dt.Rows.Add(new DateTime(1984, 8, 12));
dt.Rows.Add(new DateTime(1982, 9, 7));
bindingSource1.DataSource = dt;
dataGridView1.DataSource = bindingSource1;
dataGridView1.Columns[0].SortMode = DataGridViewColumnSortMode.Programmatic;
Ahora, usando ColumnHeaderMouseClick, realizaremos la clasificación en la primera columna:
private SortOrder _sortDirection;
private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) {
if (e.ColumnIndex == 0) {
string sort = string.Empty;
switch (_sortDirection) {
case SortOrder.None:
_sortDirection = SortOrder.Ascending;
sort = "asc";
break;
case SortOrder.Ascending:
_sortDirection = SortOrder.Descending;
sort = "desc";
break;
case SortOrder.Descending:
_sortDirection = SortOrder.None;
sort = string.Empty;
break;
}
dataGridView1.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = _sortDirection;
if (!string.IsNullOrEmpty(sort)) {
bindingSource1.Sort = "DateOfBirth " + sort;
} else {
bindingSource1.RemoveSort();
}
}
}
¡Espero que esto ayude!
Tengo un DataGridView que, entre otros, tiene columnas que contienen fechas. Desafortunadamente, las fechas están en el formato DD.MM.YYYY y el valor completo está en 1 columna, que es el formato de fecha común aquí en Europa. La DGV está vinculada a BindingSource, que es capaz de clasificar y clasificar de manera avanzada.
El problema es el siguiente: si utilizo la clasificación estándar de DGV, las fechas se ven como cadenas (se muestran en un DataGridViewTextBoxColumn) y, por lo tanto, se ordenan por día-> mes-> año, pero por supuesto que me gustaría exactamente lo opuesto; Quiero que sean ordenados cronológicamente.
Entonces, ¿hay alguna manera de ordenar estas columnas de la manera que quiero?
- Con mucho, la forma más fácil sería utilizar el evento SortCompare de la DGV, pero aparentemente eso no se puede hacer si la DGV está vinculada a un DataSoruce.
- Por supuesto, utilicé Google y siempre obtengo la solución "utilizar la propiedad Ordenar para la clasificación avanzada". El BindingSource que está vinculado al DGV sí admite la ordenación y la clasificación avanzada pero, según tengo entendido, esto me da la posibilidad, por ejemplo, de ordenar por varias columnas y no proporciona una manera de ordenar la columna de columna por año-> mes-> día (o en términos más generales, me permite implementar un tipo de función de comparación). ¿O me estoy perdiendo algo?
¿Qué opciones tengo para lograr lo que quiero? Al explicar, tenga en cuenta que no soy nuevo en la programación, soy nuevo en este aspecto de Windows Forms.
¡Gracias por adelantado!
private void DataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
{
if (e.Column.Name == "YourColumnName") //<== this must be your date column name
{
DateTime dt1 = Convert.ToDateTime(e.CellValue1);
DateTime dt2 = Convert.ToDateTime(e.CellValue2);
e.SortResult = System.DateTime.Compare(dt1, dt2);
e.Handled = true;
}
}