如何在DataGridView中显示一个可浏览(false)属性

本文关键字:一个 浏览 属性 false DataGridView 显示 | 更新日期: 2023-09-27 18:08:36

我想在DataGridView控件中显示System.ServiceProcess.ServiceControllerMachineName属性:

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;

我期望MachineName列被填充,实际上,当列创建时,列中显示的值为空

是否有一个解决方案,让我可以显示这个属性?

不重复:
我没有试图重写datagrid视图控件,所以datagrid视图的AutoGenerateColumns属性将在设计器中可见。我试图在DataGridView中显示具有[Browsable(false)]属性的ServiceController属性。

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

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

如何在DataGridView中显示一个可浏览(false)属性

这里的列不是自动生成的。它已经生成了,但是cell的值是空的,因为这个属性是不可浏览的。

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

  • 使用CellFormatting事件并为cell提供值。
  • 使用相同的属性名在模型或匿名对象中塑造结果。
  • 使用MetaDataType属性并为类提供新的元数据
使用CellFormatting

您可以使用CellFormatting并在行后面找到DataBound项,并直接从模型中使用property的值:

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属性注册该元数据类为您的原始模型,然后注册一个AssociatedMetadataTypeTypeDescriptionProvider作为TypeDescriptor为您的类。

这个方法对于从模型中分离元数据很有用。

它真的很简单,真的很有用。所有的ASP。. NET MVC开发人员熟悉这种方法,但Windows窗体开发人员通常不知道这种方法。看一个简单的例子和更多的描述,看看这篇文章:

  • 是否可以在部分类中添加属性到属性?