设置具有对象 DataSource 的 DataGridView 中自动生成的列的格式

2023-12-06

我想自动创建我的所有列DataGridView基于我的自定义课程。每件事都按其应有的方式工作,但我需要的是格式化和对齐单元格值。

那么是否有一个属性可以添加到我的字段(HeightMeter)中,以便它可以根据需要对齐和格式化。要在手动列创建代码中执行此操作,您将使用以下命令:

DataGridViewColumn.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
DataGridViewColumn.DefaultCellStyle.Format = "N2";

如何在使用 AutoGenerateColumns 解决方案时指定 DefaultCellStyle 属性 - 注意我仅限于使用 .net 2 :(

以下是我需要的和我得到的示例:

public partial class Form1 : Form
{
  private List<Person> people = new List<Person>();
  private DataGridView dataGridView1 = new DataGridView();
  private DataGridView dataGridView2 = new DataGridView();
  public Form1()
  {
    InitializeComponent();
    dataGridView1.Dock = DockStyle.Top;
    dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

    dataGridView2.Dock = DockStyle.Top;
    dataGridView2.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

    Controls.Add(dataGridView2);
    Controls.Add(dataGridView1);

    Load += new EventHandler(Form1_Load);
    Text = "";
  }

  private void Form1_Load(object sender, EventArgs e)
  {
    PopulateLists();
    dataGridView1.AutoGenerateColumns = true;
    dataGridView1.DataSource = people;

    CreateAndPopulateGrid2();
  }

  public void CreateAndPopulateGrid2()
  {
    DataGridViewColumn columnName = new DataGridViewTextBoxColumn();
    columnName.HeaderText = "Name";

    DataGridViewColumn columnHeight = new DataGridViewTextBoxColumn();
    columnHeight.HeaderText = "Height [m]";
    columnHeight.ValueType = typeof(double);

    columnHeight.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
    columnHeight.DefaultCellStyle.Format = "N2";
    dataGridView2.Rows.Clear();
    dataGridView2.Columns.Clear();
    dataGridView2.Columns.Add(columnName);
    dataGridView2.Columns.Add(columnHeight);

    DataGridViewRow row;
    foreach (Person p in people)
    {
      row = new DataGridViewRow();
      row.CreateCells(dataGridView2);
      row.Cells[0].Value = p.Name;
      row.Cells[1].Value = p.HeightMeter;
      dataGridView2.Rows.Add(row);
    }
  }

  private void PopulateLists()
  {
    people.Clear();
    people.Add(new Person("Harry", 1.7523));
    people.Add(new Person("Sally", 1.658));
    people.Add(new Person("Roy", 2.158));
    people.Add(new Person("Pris", 1.2584));
  }
}

class Person
{
  [System.ComponentModel.DisplayName("Name")]
  public string Name { get; set; }
  [System.ComponentModel.DisplayName("Height [m]")]
  public double HeightMeter { get; set; }

  public Person(string name, double heightMeter)
  {
    Name = name;
    HeightMeter = heightMeter;
  }
}

使用自定义属性控制 DataGridView 列的外观

当自动生成列时DataGridView,对一些属性有内置支持,包括ReadOnly, DisplayName and Browsable属性。例如,如果您使用Browsable(false)它不会作为列添加到DataGridView.

But for Format,没有这样的内置支持。您可以创建一个自定义DisplayFormat属性并编写一些代码来使用它DataGridView自动生成列后。

例如,假设您有一个这样的类:

using System;
using System.ComponentModel;
public class Product
{
    [DisplayName("Code")]
    [Description("Unique code of the product")]
    public int Id { get; set; }

    [DisplayName("Product Name")]
    [Description("Name of the product")]
    public string Name { get; set; }

    [DisplayName("Unit Price")]
    [Description("Unit price of the product")]
    [DisplayFormat("C2")]
    public double Price { get; set; }
}

结果,我们将会有一个DataGridView就像截图一样,可以看到我们使用了Description属性作为列的工具提示文本,我们也使用DisplayFormat以货币格式显示价格:

enter image description here

首先我们应该创建格式的自定义属性,DisplayFormat:

using System;
using System.ComponentModel;
public class DisplayFormatAttribute : Attribute
{
    public DisplayFormatAttribute(string format)
    {
        Format = format;
    }
    public string Format { get; set; }
}

然后加载数据并自动生成列,例如:

var list = new List<Product>() {
    new Product(){ Id=1, Name="Product 1", Price= 321.1234},
    new Product(){ Id=2, Name="Product 2", Price= 987.5678},
};
this.dataGridView1.DataSource = list;

然后,为了利用属性,您可以编写不依赖于模型类型的代码:

var type = ListBindingHelper.GetListItemType(dataGridView1.DataSource);
var properties = TypeDescriptor.GetProperties(type);
foreach (DataGridViewColumn column in dataGridView1.Columns)
{
    var p = properties[column.DataPropertyName];
    if (p != null)
    {
        var format = (DisplayFormatAttribute)p.Attributes[typeof(DisplayFormatAttribute)];
        column.ToolTipText = p.Description;
        column.DefaultCellStyle.Format = format == null ? null : format.Format;
    }
}

您可以简单地将上面的代码封装在类似的方法中void SetupColumn(DataGridView dgv)或者如果你有一个派生的DataGridView,您可以创建一个DataBind(object data)方法并在该方法中分配data to DataSource然后使用上面的代码作为方法体的其余部分。

Note

我还在你的问题下的评论中读到你已经告诉过'...每个字段都有点多。' 如果出于某种原因你不喜欢属性方法,你可以简单地坚持使用这样的 for 循环:

foreach (DataGridViewColumn c in dataGridView1.Columns)
{
    if (c.ValueType == typeof(double))
    {
        c.DefaultCellStyle.Format = "C2";
        c.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
    }
}

Windows 窗体中的 DataAnnotations 属性

要了解如何在 Windows 窗体中将数据注释属性用于 DataGridView 和验证,请查看以下文章:

  • Windows 窗体中 DataGridView 的 DataAnnotations 属性
  • Windows 窗体的 DataAnnotations 验证属性
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设置具有对象 DataSource 的 DataGridView 中自动生成的列的格式 的相关文章

  • ASP Core HttpClientFactory 模式使用客户端证书

    任何人都知道在使用时如何使用客户端证书HttpClientFactory 在我发现的所有示例中 您需要提供HttpMessageHandler in the HttpClient构造函数 使用时不可用HttpClientFactory se
  • 如何在 C# 中知道 PID 和 VID 来发现虚拟 COM 端口名称

    如果我知道 PID 和 VID 我会尝试找到查找 COM 端口名称的正确方法 到目前为止 我写了解决方法 但我不相信没有更优雅和正确的方法 顺便说一句 我知道我可以使用 REGEX 编写此代码只是为了测试解决方法 我知道还有很大的改进空间
  • C中函数指针的递归声明

    我想声明一个返回指向相同类型函数的指针的函数 我想用它来实现如下状态机 typedef event handler t event handler t event t compilation error event handler t st
  • 如何重命名序列化对象列表后生成的 XML 属性

    我正在序列化对象列表List
  • dup2() 和 exec()

    include
  • binary_log_types.h:没有这样的文件或目录

    我正在编译一个小型 mysql C 项目并且 遇到以下错误 C Program Files x86 MySQL MySQL Server 5 7 include mysql com h 22 30 fatal error binary lo
  • 计算复杂数组的abs()值的最快方法

    我想计算 C 或 C 中复杂数组元素的绝对值 最简单的方法是 for int i 0 i lt N i b i cabs a i 但对于大向量来说 速度会很慢 有没有办法加快速度 例如使用并行化 语言可以是 C 或 C 鉴于所有循环迭代都是
  • 增量决策树 C++ 实现

    有谁知道决策树分类器的增量实现吗 这样 当您将新实例添加到训练集中时 它可以根据现有决策树分类器以低计算量并尽可能快地生成最佳决策树分类器 换句话说 我有一个最优决策树分类器集A 其中命名为T 1 现在我想添加实例X to set A并找到
  • 通过用于 Symbol 条码扫描仪 DS4208 的 SNAPI.dll API 捕获图像

    我想通过 SNAPI API 从 Symbol 目前为 Zebra 条形码扫描仪 DS4208 型号 我们还使用 Zebra 的另一个但兼容的型号 捕获图像 条形码捕获 识别效果很好 但看起来像SnapiDLL SNAPI SnapShot
  • 以编程方式运行 T4 文本模板

    有没有一种方法可以通过代码以编程方式运行 T4 文本模板 我正在制作一种自定义域特定语言 我希望相关的文本模板在用户每次保存时运行 目前 这就是我在 DSL 模型中所做的事情 protected override void OnDocume
  • 函数指针上的未知类型 F TYPE

    include
  • 试图使用加密来混淆我的项目打破了它

    我试图尝试不同的混淆选项 为了做到这一点 我首先尝试了加密货币 以下是我遵循的步骤 打开加密向导并选择一些选项 选择我的解决方案文件 完成向导后 我看到有些 Dll 被很好地混淆了 但我的项目现在无法构建 我注意到的两件事是 我的文件夹中有
  • ASP.NET中如何访问除wwwroot以外的位置

    我可以使用访问服务器的物理位置Server MapPath 这给了我内部的物理路径wwwroot文件夹 我想将一些数据保存到同一服务器的另一个驱动器中D 驾驶 我想我无法获取以下位置的物理位置D 驾驶使用Server MapPath因为它位
  • 三种 System.Drawing 方法表现出缓慢的绘制或闪烁:解决方案?或其他选择?

    我正在通过 System Drawing 进行一些绘图 但遇到了一些问题 我将数据保存在队列中 并将该数据绘制 绘制 到三个图片框中 此方法填充图片框 然后滚动图形 所以不要在以前的绘图上绘制 并且逐渐看起来更混乱 我找到了两种绘制图表的解
  • C++:LPWSTR 在 cout 中打印为地址

    我有一个类型变量LPTSTR 我打印到std cout with lt lt 在 ANSI 系统中 不知道它是在哪里确定的 它工作得很好 它打印了字符串 现在 在 Unicode 系统中 我得到的是十六进制地址而不是字符串 那么 为什么LP
  • 我可以对(非成员)函数使用部分模板特化吗?

    我试图在 非成员 函数上使用部分模板专业化 但我在语法上遇到了问题 我在 StackOverflow 中搜索了其他部分模板专业化问题 但这些问题涉及类或成员函数模板的部分专业化 作为起点 我有 struct RGBA RGBA uint8
  • 为什么必须通过 this 指针访问模板基类成员?

    如果下面的类不是模板 我可以简单地拥有x in the derived班级 但是 通过下面的代码 我have to use this gt x Why template
  • #define 内存地址声明

    这个 define 语句有什么作用 它用于定义内存地址 但我不明白 uint32 t 部分 define GPxDAT uint32 t 0x6FC0 通常用于访问映射到地址空间的硬件寄存器 或者一些特定的内存地址 硬件寄存器应定义为vol
  • C# 3.0 中自动属性和公共字段的区别

    我无法理解为什么 C 3 0 中存在自动实现的属性语言功能 当你说的时候有什么区别 public string FirstName than public string FirstName get set 因为它们在生成的 IL 代码 和机
  • 替换全局热键

    我有一个位于托盘中的应用程序 我想定义多个热键来触发我的程序中的事件 我从 AaronLS 在这个问题中的出色回答中找到了灵感 使用C 设置全局热键 https stackoverflow com a 27309185 3064934 如果

随机推荐

  • MVC C# 下拉列表在模型上显示 System.Web.SelectListItem 并且不能盲视控制器

    请帮我 我的下拉列表显示System Web SelectListItem在调试模式下 但不显示我在列表中定义的实际文本 任何人都可以帮忙吗 如何使控制器具有我在列表中定义的文本 而且我的下拉列表在选择时并不盲目 请帮我 这是它的样子 请看
  • 将 JComponent 重置为默认值

    例如 如果组件是一个复选框 则必须设置为 false 或者它是一个文本字段 则必须清除文本 我正在尝试编写一种重置所有组件的方法JPanel 它必须像 HTML 表单中的重置功能一样工作 如何重置JComponent到默认值 作为一名优秀的
  • 当目录名称包含方括号“[ ]”等特殊字符时,Glob 不起作用

    当路径目录带有方括号时 我在使用 glob 函数时遇到问题 Example 1 working path temp DIRECTORY SEPARATOR dir name files glob path DIRECTORY SEPARAT
  • 从 SciPy 稀疏矩阵填充 Pandas SparseDataFrame

    我注意到熊猫现在有支持稀疏矩阵和数组 目前 我创建DataFrame 像这样 return DataFrame matrix toarray columns features index observations 有没有办法创建一个Spar
  • 如何设置图标以获取基础FloatingActionsMenu

    我正在使用 com getbase floatingactionbutton FloatingActionsMenu 作为可扩展的 FAB 但无法在 fab 菜单上设置图标 我尝试过设置背景可绘制 但不起作用 谢谢
  • FFmpeg:编码 PCM 16 音频数据分配错误

    我目前正在尝试使用 avi 容器内的一些视频对一些原始音频数据进行编码 使用的视频编解码器是 mpeg4 我想使用 PCM 16LE 作为音频编解码器 但我面临着一个问题AVCodec gt frame size音频样本的参数 完成所有正确
  • 绘制包含显示圆形图标的标签

    所以我试图绘制一个标签 其中包含一个显示圆圈的图标 该圆圈最初将被填充为红色 然后根据我按下的 3 个按钮中的哪一个 它会使用重绘更改为绿色 蓝色或红色 这是我到目前为止所拥有的 public class ColorChanger impl
  • Android 联系人在单个数据库查询中显示姓名和电话号码?

    我正在尝试从本机数据库获取联系人列表及其显示名称和电话号码 任何或全部 有许多方法可以通过多次查询手机数据库来获取此信息 但这会带来相当大的开销 这是我一直在处理的查询 但结果是 Uri uri ContactsContract Conta
  • OpenAI GPT-3 API 错误 429:“请求失败,状态代码 429”

    我正在尝试将 OpenAI API 连接到我的 Vue js 项目 一切都很好 但每次我尝试 POST 请求时 我都会收到一个429状态码 请求过多 但我什至没有机会做一个 有什么帮助吗 回复 message Request failed
  • 在 Altair 中将 R 值(相关性)添加到散点图

    因此 我正在研究 Cars 数据集 并希望将 R 值添加到散点图中 所以我可以使用这段代码来生成散点图transform regression添加一条很棒的回归线 from vega datasets import data import
  • C 中的隐式整数类型转换

    我了解 C 语言在整数和浮点类型之间的隐式转换 但我对有符号 无符号隐式类型转换有疑问 例如 如果您添加unsigned char and a signed int 结果类型是什么 这会是一个unsigned int a signed in
  • UISearchBarDelegate shownSearchResultsButton 属性的正确用法是什么?

    我将搜索栏配置为显示结果按钮 但该按钮仅在用户输入字符之前显示 此时 X 取消按钮将取代它 因此 无需输入字符 搜索结果集就等于整个数据集 我希望结果按钮保留在那里 这样当用户输入足够的字符以获得较小的结果集 例如 5 或 6 行 时 他们
  • JavaScript Prompt() 方法

    我正在处理一项任务 但我遇到了问题prompt 方法 我发现我可以做一个提示 但我需要多个提示 并且需要金额 例如 我创建了一个包含许多艺术家的 HTML 表以及包含 DVD CD 和音频的列 所有行中都有价格 我需要写一个提示来执行此操作
  • 如何按python pandas中的值范围列表进行分组[重复]

    这个问题在这里已经有答案了 我有以下数据框 name value a 100 b 200 c 150 d 300 e 400 f 200 g 100 我有范围列表 例如 0 100 100 200 超过 200 基于此 我必须计算上面数据框
  • 是否可以获取 XSD 中定义的 XML 节点的类型?

    我正在用 python 解析 XML 我有一个 XSD 架构来验证 XML 我能否获取 XSD 中定义的 XML 特定节点的类型 例如 我的XML 一小部分 是
  • 与全序相比,偏序是否足以构建堆?

    C std priority queue 只需要部分顺序 但如果它的实现是二叉堆 它是如何工作的 例如 假设我们有一个部分有序集 a b c x c lt b b lt a c lt a x与以下无关a b c 那么最大堆是 layer 1
  • RevMob sdk 5.9.0 在导入 时出现头文件错误

    我已经将 RevMobs 集成到我的项目中 现在我只需更新它并下载新的 sdk 5 9 0 并按照与之前相同的步骤进行操作并参考此链接 RevMob ios sdk 但现在我无法集成它并且在导入头文件时 import
  • Rails 存储第三方凭证。有人知道最佳实践吗?

    我读过一堆其他相关问题 似乎没有什么能真正回答我的问题 我的应用程序将与几个不同的第三方网站集成 ebay paypal google amazon 这是一个产品管理系统 它将产品推送到各地 当然 由于它与所有这些网站交互 因此需要用户名
  • 我们可以将语音识别框架与 Today Extension 结合起来吗

    我正在尝试构建一个带有语音按钮的小部件 当我按下它时 它应该将说出的语音转换为文本 但是 当我尝试录制语音时 AVAudioEngine 无法启动 是因为 Today Extension 中不允许 AVAudioEngine 吗 在互联网上
  • 设置具有对象 DataSource 的 DataGridView 中自动生成的列的格式

    我想自动创建我的所有列DataGridView基于我的自定义课程 每件事都按其应有的方式工作 但我需要的是格式化和对齐单元格值 那么是否有一个属性可以添加到我的字段 HeightMeter 中 以便它可以根据需要对齐和格式化 要在手动列创建