2016-09-23 133 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) –