- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个带有 DataSet
的 Windows 窗体应用程序。我只是使用了数据 |添加新数据源以将 Northwind 数据库的 Products 表添加到我的 DataSources 并创建一个显示 Products 表内容的 DataGridView
。我只是将 Products 表从“数据源”窗口拖到表单中,因此所有列都是自动创建的。
现在,我希望将包含“已停产”列为真的产品的行涂成不同的颜色。我已经为它创建了一个 CellPainting
事件处理程序,但我无法找到 Discontinued 列的值。
因为 DataGridView
是自动创建的,其中的列的名称类似于 dataGridViewTextBoxColumn1
,它的 DataPropertyName
为“ProductID”。
我的问题是:如何根据 DataPropertyName
找到 Discontinued 的值?或者我是否需要使用列本身的名称? (在这种情况下我最好给它起一个有意义的名字)
我的代码是:
private void productsDataGridView_CellPainting(object sender,
DataGridViewCellPaintingEventArgs e)
{
if (e.RowIndex >= 0)
{
var row = productsDataGridView.Rows[e.RowIndex];
if ((bool) (row.Cells[ nameOrIndexOfColumn ].Value))
{
e.CellStyle.ForeColor = Color.DarkGray;
}
}
}
如何访问带有 DataPropertyName
“Discontinued”的列的值?
解决方案
根据 Neil Barnwell 的回答,这似乎是一种方式。
private void productsDataGridView_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
if (e.RowIndex >= 0)
{
var productView = (DataRowView) productsDataGridView.Rows[e.RowIndex].DataBoundItem;
var product = productView.Row as NorthwindDataSet.ProductsRow;
if (product != null && product.Discontinued)
{
e.CellStyle.ForeColor = Color.DarkGray;
}
}
}
这样做的最大优势是 Discontinued 值不必是 DataGridView 上的实际列。
最佳答案
不要从网格中的列中获取值,而是从填充网格行的实际数据行中获取值。这样你就可以避免所有的魔术弦等。
因为 [Type]DataRow
隐藏在附加到网格的 DataView
中,所以需要进行一些转换,但这是一种更优雅的方法(并且在未来发生变化的情况下远没有那么脆弱)如果你将它很好地集成到你的代码中而不是依赖魔术字符串。
这是我的一篇旧博客文章,详细描述了如何做:
http://koder.wordpress.com/2010/04/09/getting-data-from-a-winforms-datagridview/
更新
您已经提到您正在使用 Northwind 并且您“只是将 Products 表拖到表单中”,所以我猜这不是一个关键任务软件,而是为了其他人的利益阅读,我只是想建议在实际应用中这不再是典型的方法。
通常这些天我们会考虑有一个 Domain Model ,也许使用 ORM从数据存储中获取我们的域对象(当然数据集不是真正的 ORM),然后可能使用类似 MVVM 的东西构建优化的数据结构以绑定(bind)到来自这些域对象的 UI 元素。
使用这种方法,因为您有实际数据要提交给 ViewModel,所以您可以根据实际数据计算颜色等规则,UI 仅显示应用这些业务规则的结果。
关于c# - 如何根据 DataPropertyName 列访问 DataRowView 中的单元格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4793100/
我有一个 DataGridView 控件,我想用数据填充它。 我使用 DataSource 属性 // dgvDealAsset is DataGridView private voi
我正在使用 DataGridView 将其数据源绑定(bind)到列表,并为每一列指定属性。 一个例子是: DataGridViewTextBoxColumn colConcept = new Da
让图像显示我有以下类(class) public class Master { public string MasterName = "Something"; public List
我有一个带有 DataSet 的 Windows 窗体应用程序。我只是使用了数据 |添加新数据源以将 Northwind 数据库的 Products 表添加到我的 DataSources 并创建一个显
我是一名优秀的程序员,十分优秀!