昨天,一位同事问我如何在网格中显示数据,其中内置数据绑定不支持他想对某些列做什么。
很高兴能够帮助我解释所有关于OnRowDataBound事件以及如何挂钩它并动态操作行对象中的单元格以完成您想要的任何操作。大。如果您正在使用asp.net。
唯一的问题是他正在编写winforms应用程序而DataGridView不支持OnRowDataBound!我简直不敢相信,但它不存在。
那么winforms的人怎么会管理这个呢?
答案 0 :(得分:2)
RowsAdded事件大致相当,但由于它使用的shared memory state,您可能会因使用此事件来访问行而遇到性能问题。这本质上是一种方案,其中DataGridView尝试通过在行之间共享某些状态来尝试最小化其内存占用,直到访问其中一个共享行,这导致它处于取消共享状态(内存和可能的性能损失) )。已经对优化进行了大量优化,但由于某种原因,我遇到了使用此事件的问题。
因此,如果RowsAdded为您工作而不会降低性能,那就太好了。如果没有,你仍然有很多选择。您可以从DataGridViewCell和DataGridView派生,以将自定义单元格(列)类型添加到网格中。这可能是自定义DataGridView最复杂的方法......但它几乎可以允许你想要的任何类型的单元格操作。
如果您希望在显示之前使用GDI +(System.Drawing)绘制某些内容,CellPainting事件会为您提供特定单元格绘制的挂钩。还有一个CellFormatting事件,它也为你提供了特殊的事件参数 - 但是我从来没有使用过那个,所以我不确定共享内存状态是否适用(通常对于绘图事件它不会)。
HTH, 理查德
答案 1 :(得分:0)
我不太确定,因为我也是一个ASP.NET人员,但是在winforms中你在一个真正的有状态环境中工作,而不是一个“伪有状态”(通过viewstate)环境。
因为在将所有内容刷新到Response之前无需执行所有操作(例如更改单元格样式等),您可以等到数据完成绑定,然后根据需要更改每一行,您已经仍然有你的数据源,所以只要你需要做更多的事情就可以使用它。
答案 2 :(得分:0)
因为在将所有内容刷新到Response之前无需执行所有操作(例如更改单元格样式等),您可以等到数据完成绑定,然后根据需要更改每一行,你还有你的数据源,所以只要你需要做更多的事情就可以使用它。
为清楚起见,datagridview当前已绑定,显示exisitng bound列。 现在,我需要在datagridview中添加新列,然后显示字典对象中的一些值。
尝试过,这段代码,但没有运气。列已添加,但不显示值。
if (dvMain.Columns[key] == null)
{
dvMain.Columns.Add(key, key);
}
dvMain[key,i].Value = myDictionary[key];