如何在DataGridView

时间:2016-09-23 17:50:12

标签: c# winforms datagridview

我想在MachineName控件中显示System.ServiceProcess.ServiceController的{​​{1}}属性:

DataGridView

它不会添加dataGridView1.DataSource = ServiceController.GetServices(); 属性。据我所知,这是由于该属性的MachineName属性。

但是当我像这样手动添加列时:

[Browsable(false)]

我希望实际填充dataGridView1.ColumnCount = 2; dataGridView1.AutoGenerateColumns = false; dataGridView1.Columns[0].Name = "Machine Name"; dataGridView1.Columns[0].DataPropertyName = "MachineName"; dataGridView1.Columns[1].Name = "Display Name"; dataGridView1.Columns[1].DataPropertyName = "DisplayName"; BindingSource bs = new BindingSource(); bs.DataSource = ServiceController.GetServices(); dataGridView1.DataSource = bs; 列时,在创建列时,列中显示的值为空

是否有解决方法以便我可以显示此属性?

不重复:
我没有尝试覆盖数据网格视图控件,因此数据网格视图的AutoGenerateColumns属性将在设计器中可见。 我尝试在DataGridView中显示带有MachineName属性的ServiceController属性

我感兴趣的任何人的最终解决方案:

[Browsable(false)]

1 个答案:

答案 0 :(得分:1)

此处不会自动生成列。它已生成但单元格的值为null,因为该属性不可浏览。

有多种解决方案可以解决这个问题,包括:

  • 使用CellFormatting事件并为单元格提供值。
  • 使用相同的属性名称在具有相同属性名称的模型或匿名对象中对结果进行整形。
  • 使用MetaDataType属性并为类提供新的元数据。

使用CellFormatting

您可以使用CellFormatting并查找该行后面的DataBound项,并直接使用该模型中的属性值:

void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    if (e.ColumnIndex < 0 || e.RowIndex < 0)
        return;
    var model = this.dataGridView1.Rows[e.RowIndex].DataBoundItem as Model;
    if (model != null)
        e.Value = model.SomeField;
}

塑造结果

您可以将查询结果整形为具有与原始模型相同属性名称的模型或匿名对象,以保留列设置:

dataGridView1.DataSource = list.Select(x => new { Field1= x.Field1, Field2 = x.Field2 })
                               .ToList();

使用MetaDataType属性并为类提供新的元数据

作为另一个选项,您可以使用包含metedata属性(如BrowsableDisplayName的模型的元数据类,然后使用MetadataType属性为原始模型注册thar元数据类,然后注册您班级的AssociatedMetadataTypeTypeDescriptionProviderTypeDescriptor

此方法可用于从模型中分离元数据。

它非常简单而且非常实用。所有ASP.NET MVC开发人员都熟悉这种方法,但Windows窗体开发人员通常不了解这种方法。要查看一个简单的示例以及有关它的更多描述,请查看此帖子: