关于C# Winform DataGridView 设置DefaultCellStyle无效的原因与解决方案

简介:

上周在开发Winform 项目中,我曾遇到一个看似简单,但一直都没有解决的问题,那就是:设置winform DataGridView控件的行DefaultCellStyle,但却没有任何变化,我也曾求助于博问:http://q.cnblogs.com/q/72294/,但大家给的答案没有一个能解决这个问题,可能是问题重现不太容易,我自己也曾多次在其它项目中尝试重现这个问题,但一直都是正确的,没有出现我当前项目的问题,简直要崩溃啊!

先来看看我原有的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
private  void  Form1_Load( object  sender, EventArgs e)
{
     dataGridView1.SetHeader(t => t.AssetSingleNo, t => t.BaseInfo.Name, t => t.BaseInfo.Category.CategoryName,
                 t => t.Price, t => t.ProcureImport.Date, t => t.State.State);
 
     LoadData();
}
 
private  void  LoadData()
{
     var  resultList = QueryBusiness.GetList(t => true , //这里演示就直接忽略条件
                                  t =>  new
                                  {
                                      t.AssetSingleNo,
                                      t.AssetSingleInfo.BaseInfo.Name,
                                      t.AssetSingleInfo.BaseInfo.Category.CategoryName,
                                      t.AssetSingleInfo.Price,
                                      t.AssetSingleInfo.ProcureImport.Date,
                                      t.AssetSingleInfo.State.State
                                  },t =>t.AssetSingleNo,1,10);
     dataGridView1.DataSource = resultList;
 
     int  entityInListIndex = 1;
     dataGridView1.Rows[entityInListIndex].DefaultCellStyle =  new  DataGridViewCellStyle() { ForeColor = Color.Blue, Font =  new  Font( "Arial" , 11F, FontStyle.Bold) };
}

最终呈现的效果如下:

从上面的表格中可以看出,第2行(索引为1,实际为第2行)没有任何效果。当然如果你将这些代码及表格复制到其它项目中,可能不会出现这样的问题,这就是很烦人的事情。为了解决这个简单问题,搞清楚原因,今天一上班,我又开始进行测试与继续在网上找答案,终于功夫不负有心人,终于在微软的社区中发现有人也提到这样的问题,并解决了,地址是:

重新把所有绑定的数据在显示一遍,这里有一点延时,导致颜色其实没有设置到正确显示的row上。在DatabindingCompleted 时间里面,确保所有的数据 都已经绑定完成,这时候 能够确保 设置在正确的 行上面。

问题原因找到了,原来是绑定后,数据有延迟,必须确认数据绑定完成后,才能进行样式设置,基于这个原因,我修正了一下代码,将原设置Style的代码放到DataBindingComplete事件中,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
private  void  Form1_Load( object  sender, EventArgs e)
{
     dataGridView1.SetHeader(t => t.AssetSingleNo, t => t.BaseInfo.Name, t => t.BaseInfo.Category.CategoryName,
                 t => t.Price, t => t.ProcureImport.Date, t => t.State.State);
 
     dataGridView1.DataBindingComplete +=  new  DataGridViewBindingCompleteEventHandler(dataGridView1_DataBindingComplete);
 
     LoadData();
}
 
private  void  LoadData()
{
     var  resultList = QueryBusiness.GetList(t => true , //这里演示就直接忽略条件
                                  t =>  new
                                  {
                                      t.AssetSingleNo,
                                      t.AssetSingleInfo.BaseInfo.Name,
                                      t.AssetSingleInfo.BaseInfo.Category.CategoryName,
                                      t.AssetSingleInfo.Price,
                                      t.AssetSingleInfo.ProcureImport.Date,
                                      t.AssetSingleInfo.State.State
                                  },t =>t.AssetSingleNo,1,10);
     dataGridView1.DataSource = resultList;           
}
 
private  void  dataGridView1_DataBindingComplete( object  sender, DataGridViewBindingCompleteEventArgs e)
{
     int  entityInListIndex = 1;
     dataGridView1.Rows[entityInListIndex].DefaultCellStyle =  new  DataGridViewCellStyle() { ForeColor = Color.Blue, Font =  new  Font( "Arial" , 11F, FontStyle.Bold) };
}

效果如下:

问题终于解决了,虽然是一个小问题,但若不明白原理及找到问题根源,小问题也会变成大问题,所以从这个问题中告诫我自己及大家:不要轻视任何一个问题,要有刨根问底的决心,每一个问题都要找到根本原因,不仅要知道如何做,还要明白为什么要这样做,这样才会成长。

本文转自 梦在旅途 博客园博客,原文链接: http://www.cnblogs.com/zuowj/p/4527541.html ,如需转载请自行联系原作者

相关文章
|
存储 SQL 数据库连接
C#程序调用Sql Server存储过程异常处理:调用存储过程后不返回、不抛异常的解决方案
本文分析了C#程序操作Sql Server数据库时偶发的不返回、不抛异常问题,并提出了解决思路。首先解析了一个执行存储过程的函数`ExecuteProcedure`,其功能是调用存储过程并返回影响行数。针对代码执行被阻塞但无异常的情况,文章总结了可能原因,如死锁、无限循环或网络问题等。随后提供了多种解决方案:1) 增加日志定位问题;2) 使用异步操作提升响应性;3) 设置超时机制避免阻塞;4) 利用线程池分离主线程;5) 通过信号量同步线程;6) 监控数据库连接状态确保可用性。这些方法可有效应对数据库操作中的潜在问题,保障程序稳定性。
884 11
|
Linux C# iOS开发
开源GTKSystem.Windows.Forms框架让C# Winform支持跨平台运行
开源GTKSystem.Windows.Forms框架让C# Winform支持跨平台运行
466 12
|
SQL API 定位技术
基于C#使用winform技术的游戏平台的实现【C#课程设计】
本文介绍了基于C#使用WinForms技术开发的游戏平台项目,包括项目结构、运行截图、实现功能、部分代码说明、数据库设计和完整代码资源。项目涵盖了登录注册、个人信息修改、游戏商城列表查看、游戏管理、用户信息管理、数据分析等功能。代码示例包括ListView和ImageList的使用、图片上传、图表插件使用和SQL工具类封装,以及高德地图天气API的调用。
基于C#使用winform技术的游戏平台的实现【C#课程设计】
|
关系型数据库 Java MySQL
C#winform中使用SQLite数据库
C#winform中使用SQLite数据库
1038 3
C#winform中使用SQLite数据库
|
API C#
C#实现Winform程序右下角弹窗消息提示
C#实现Winform程序右下角弹窗消息提示
1127 1
|
设计模式 程序员 C#
C# 使用 WinForm MDI 模式管理多个子窗体程序的详细步骤
WinForm MDI 模式就像是有超能力一般,让多个子窗体井然有序地排列在一个主窗体之下,既美观又实用。不过,也要小心管理好子窗体们的生命周期哦,否则一不小心就会出现一些意想不到的小bug
1796 0
|
API C# Windows
【C#】在winform中如何实现嵌入第三方软件窗体
【C#】在winform中如何实现嵌入第三方软件窗体
1123 0
|
关系型数据库 数据库 PostgreSQL
在C#中获取与设置Windows的字符编码方式
通过以上步骤,你可以在Docker环境下有效地重启PostgreSQL服务。这对于维护数据库健康、应用更新或环境配置更改后确保数据库服务正常运行至关重要。根据你的具体需求和环境设置,选择合适的方法来执行重启操作。
208 0
|
9月前
|
XML 前端开发 C#
C#编程实践:解析HTML文档并执行元素匹配
通过上述步骤,可以在C#中有效地解析HTML文档并执行元素匹配。HtmlAgilityPack提供了一个强大而灵活的工具集,可以处理各种HTML解析任务。
389 19
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
444 3