2016-09-23 132 views
0

可浏览(假)属性我想在DataGridView控件来显示System.ServiceProcess.ServiceControllerMachineName属性:如何显示在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; 

我希望要填充的MachineName列,而实际上而列被创建在列中显示的值为空

有没有解决方法,所以我可以显示此属性?

不是重复:
我并不想重写数据网格视图控件,以使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; 
    } 
} 
+2

的可能的复制[DataGridView中的AutoGenerateColumns设置为true以某种方式(http://stackoverflow.com/问题/ 1189576/datagridview-autogeneratecolumns-is-set-to-true-somehow) –

+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元数据类,然后为您的课程注册AssociatedMetadataTypeTypeDescriptionProvider作为TypeDescriptor

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

这真的很简单,真的很有用。所有ASP.NET MVC开发人员都熟悉这种方法,但Windows窗体开发人员通常不知道这种方法。要查看它的一个简单的例子,更说明看看这个帖子:

+0

CellFormatting就像我需要它一样工作。需要稍微调整它,但它然后像一个魅力。谢谢。 –

+0

不客气:) –

+0

还有一些非常有用的选项,例如[this](http://stackoverflow.com/a/34481967/3110834),我将添加它作为选项。在链接的文章中,它足以用'[Browsable(true)]'来修饰元数据属性。你会发现这篇文章真的很有用:[是否可以添加一个属性到部分类中的属性?](http://stackoverflow.com/a/34481967/3110834) –