在 WPF DataGrid 中格式化自动生成的列
Format autogenerated column in WPF DataGrid
我通过 SQLite 适配器从 SQLite 检索了一些数据,并将其填充到数据表中,如下所示:
using (conexionSQLite = new SQLiteConnection(Datos.stringConexionSQLite))
{
conexionSQLite.Open();
string textoSQLite;
SQLiteDataAdapter adaptadorSQLite;
try
{
textoSQLite = "SELECT Fecha, ROUND(ValorTotal,0) as ValorTotal, ROUND(ValorProductoTerminado,0) as ValorProductoTerminado, ROUND(ValorSemielaborados,0) as ValorSemielaborados, ROUND(ValorMateriasPrimas,0) as ValorMateriasPrimas, ROUND(ValorEnvases,0) as ValorEnvases FROM valorStockPorFecha";
adaptadorSQLite = new SQLiteDataAdapter(textoSQLite, conexionSQLite);
adaptadorSQLite.Fill(bd, "tablaValorStock");
}
catch (SQLiteException excepcionSQL)
{
Console.WriteLine("Error: " + excepcionSQL.ToString());
}
}
DataTable tablaValorStock = bd.Tables["tablaValorStock"];
然后我将它绑定到 DataGrid:
dataGrid.ItemsSource = tablaValorStock.DefaultView;
自动生成所有列。
我想要的是格式化一些列,而不必先手动定义它们。
我在考虑自动生成列的某种事件处理,类似于 Windows Forms 的 DataGrid 等效代码:
private void RadGridView1_AutoGeneratingColumn(object sender, GridViewAutoGeneratingColumnEventArgs e)
{
GridViewDataColumn column = e.Column as GridViewDataColumn;
if (column.DataType == typeof(int))
{
column.DataFormatString = "{0:p}";
}
}
我会根据 DataGridColumn.Header
评估一种格式或另一种格式
我知道这是一个旧问题 post,但我最近遇到了这个问题。我 post 这里有一个解决方案,以防它对任何人有帮助。这是我在 AutoGeneratingColumn
中所做的:
if (e.PropertyType == typeof(int))
{
DataGridTextColumn dataGridTextColumn = e.Column as DataGridTextColumn;
if (dataGridTextColumn != null)
{
dataGridTextColumn.Binding.StringFormat = "{0:p}";
}
}
正如@Hardgraf 所建议的,在大多数情况下,最好在 XAML 中指定它。然而,这就是为什么我需要在 C# 代码中完成此操作。我必须显示从存储过程返回的大约 20 个表。表的个数和列名完全由存储过程决定。如果可能的话,在 XAML 中很难做到。即使我设法让它在 XAML 中工作,代码也很难阅读。但是当我在 C# 代码中这样做时,一个简单的循环和一个 AutoGeneratingColumn 的事件处理程序将优雅地完成这个技巧。
我通过 SQLite 适配器从 SQLite 检索了一些数据,并将其填充到数据表中,如下所示:
using (conexionSQLite = new SQLiteConnection(Datos.stringConexionSQLite))
{
conexionSQLite.Open();
string textoSQLite;
SQLiteDataAdapter adaptadorSQLite;
try
{
textoSQLite = "SELECT Fecha, ROUND(ValorTotal,0) as ValorTotal, ROUND(ValorProductoTerminado,0) as ValorProductoTerminado, ROUND(ValorSemielaborados,0) as ValorSemielaborados, ROUND(ValorMateriasPrimas,0) as ValorMateriasPrimas, ROUND(ValorEnvases,0) as ValorEnvases FROM valorStockPorFecha";
adaptadorSQLite = new SQLiteDataAdapter(textoSQLite, conexionSQLite);
adaptadorSQLite.Fill(bd, "tablaValorStock");
}
catch (SQLiteException excepcionSQL)
{
Console.WriteLine("Error: " + excepcionSQL.ToString());
}
}
DataTable tablaValorStock = bd.Tables["tablaValorStock"];
然后我将它绑定到 DataGrid:
dataGrid.ItemsSource = tablaValorStock.DefaultView;
自动生成所有列。
我想要的是格式化一些列,而不必先手动定义它们。
我在考虑自动生成列的某种事件处理,类似于 Windows Forms 的 DataGrid 等效代码:
private void RadGridView1_AutoGeneratingColumn(object sender, GridViewAutoGeneratingColumnEventArgs e)
{
GridViewDataColumn column = e.Column as GridViewDataColumn;
if (column.DataType == typeof(int))
{
column.DataFormatString = "{0:p}";
}
}
我会根据 DataGridColumn.Header
我知道这是一个旧问题 post,但我最近遇到了这个问题。我 post 这里有一个解决方案,以防它对任何人有帮助。这是我在 AutoGeneratingColumn
中所做的:
if (e.PropertyType == typeof(int))
{
DataGridTextColumn dataGridTextColumn = e.Column as DataGridTextColumn;
if (dataGridTextColumn != null)
{
dataGridTextColumn.Binding.StringFormat = "{0:p}";
}
}
正如@Hardgraf 所建议的,在大多数情况下,最好在 XAML 中指定它。然而,这就是为什么我需要在 C# 代码中完成此操作。我必须显示从存储过程返回的大约 20 个表。表的个数和列名完全由存储过程决定。如果可能的话,在 XAML 中很难做到。即使我设法让它在 XAML 中工作,代码也很难阅读。但是当我在 C# 代码中这样做时,一个简单的循环和一个 AutoGeneratingColumn 的事件处理程序将优雅地完成这个技巧。