让我们看看你得到了什么。
我想在 gridview 中显示这些数据而不更改我的数据库。
太好了,应该是这样的。 数据必须与数据表示分开。
cellformatting 不是我想要的。 cellformatting 只是根据数据格式格式化单元格。
错了!
格式化正是您所需要的。一个相同的数据可以用多种方式表示。例如,一个和数字或日期值可以使用数千种方式(格式)显示(格式化)。这正是string.Format(和其他Format)方法所做的。另一个例子是Checkbox 显示bool 值。另一个例子是ComboBox 将ValueMember 显示为DisplayMember。等等。
事实上,您的要求是Format 函数的变体,可以通过Custom Numeric Format String 来实现。您只需将DataGridViewColumn.DefaultCellStyle 属性Format 设置为“Group 0”。
如果格式不够,与某些人所说的相反,CellFormatting 事件正是您所需要的。
默认情况下,DataGridView 控件会尝试将单元格的值转换为适合显示的格式。例如,它将数值转换为字符串,以便在文本框单元格中显示。您可以通过设置由 DefaultCellStyle 属性等属性返回的 DataGridViewCellStyle 的 Format 属性来指示要使用的格式设置。
如果标准格式不足,可以通过处理CellFormatting事件自定义格式。此事件允许您指示要用于单元格显示的确切显示值以及单元格样式,例如背景和前景色。这意味着您可以针对任何类型的单元格格式处理此事件,而不管单元格值本身是否需要格式化。
大部分时候对性能的影响可以忽略不计,因为只有在需要在屏幕上显示时才将值转换为字符串,并且屏幕的行数与总行数相比是有限的(以防万一你有一个庞大的数据)。
值/显示文本分离的优点之一是网格排序工作正常(按数字而不是按文本)。
总之,不要上当转换您的数据存储值以供显示。每个控件都有格式化功能,只需使用它们。由于您要求一种简单的方法,Format 属性是您的情况下最简单但有效的解决方案。
这是一个包含 100,000 行的示例,其中使用了两种格式设置方法(注释一个,取消注释另一个)。可以看到绝对没有性能问题,GroupId 列排序工作正常。
using System;
using System.Data;
using System.Linq;
using System.Windows.Forms;
namespace Samples
{
static class Program
{
static void UseFormat(DataGridView dg)
{
dg.ColumnAdded += (sender, e) =>
{
if (e.Column.DataPropertyName == "GroupId")
{
e.Column.DefaultCellStyle.Format = "Group 0";
}
};
}
static void UseCellFormatting(DataGridView dg)
{
dg.CellFormatting += (sender, e) =>
{
if (e.ColumnIndex >= 0 && e.RowIndex >= 0)
{
var column = dg.Columns[e.ColumnIndex];
if (column.DataPropertyName == "GroupId" && e.Value != null)
{
e.Value = "Group " + e.Value.ToString();
e.FormattingApplied = true;
}
}
};
}
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var form = new Form();
var dg = new DataGridView { Dock = DockStyle.Fill, Parent = form, ReadOnly = true, AllowUserToAddRows = false };
UseFormat(dg);
//UseCellFormatting(dg);
var data = new DataTable();
data.Columns.Add("Id", typeof(int));
data.Columns.Add("GroupId", typeof(int));
var groupIds = Enumerable.Range(0, 15).ToArray();
for (int i = 0; i < 100000; i++)
data.Rows.Add(i, groupIds[i % groupIds.Length]);
dg.DataSource = data;
Application.Run(form);
}
}
}