【问题标题】:Format autogenerated column in WPF DataGrid在 WPF DataGrid 中格式化自动生成的列
【发布时间】:2015-03-02 15:55:22
【问题描述】:

我通过 SQLite 适配器从 SQLite 检索到一些数据,并将其填充到 DataTable 中,如下所示:

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 窗体的 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 评估一种或另一种格式

【问题讨论】:

  • 只是出于兴趣,您为什么要在后面的代码中编写此代码,而不是使用 Xaml 设计器?这是一个非常小的应用程序,不值得实现 MVVM 模式吗?
  • @Hardgraf 好吧这只是为了显示一些数据以供阅读,不认为创建这种结构的模型和视图模型是值得的。
  • 我想这取决于应用程序将变得多么复杂。但是如果您正在计划 CRUD 功能等,那么可能值得实施 MVVM。
  • @Hardgraf 我的意思是我在我的大部分应用程序中都使用 MVVM,这只是一个片段,它始终是只读的,所以没有 CRUD。
  • 对。就我个人而言,我只会在 XAML 中定义数据网格。打开 AutoGenerateColums = false 并根据您的要求充实一个数据网格。大概你知道什么数据进来,所以你可以自己定义列?

标签: c# wpf sqlite datagrid


【解决方案1】:

我知道这是一篇旧帖子,但我最近遇到了这个问题。我在这里发布一个解决方案,以防它帮助任何人。这是我在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 的事件处理程序将优雅地完成这个技巧。

【讨论】:

    猜你喜欢
    • 2014-03-12
    • 1970-01-01
    • 2012-04-24
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 2018-12-06
    相关资源
    最近更新 更多