2013-01-10 68 views
0

的情況diplayed是這樣的:我怎樣才能cange一個屬性是如何在GridDataViewer

我有一個Form含有DataGridViewDataGridView綁定到對象BindingSource。 綁定的對象有一個Property這是一個枚舉。

我想要做的就是把一列中的DataGridView但不是顯示枚舉的號碼,我想把它映射到一個String

是否有這樣做的一個簡單的方法?

我正在考慮爲模型添加另一個Property以返回String我想展示,但我希望儘可能避免這種情況。

編輯:

enum是這樣的:

public enum FilterClass 
{ 
    TypeAFilter = 1, 
    TypeBFilter = 2, 
    TypeCFilter = 3 
}; 

我很新的C#的世界,所以也許我做一些完全錯誤的

+0

你可以顯示什麼枚舉定義看起來像..?你也想要將枚舉轉換爲它的字符串表示形式..? – MethodMan

+0

http://stackoverflow.com/questions/3924257/how-to-display-enum-values-in-datagridview-column – platon

+0

@platon我沒有'DataTable',我有一個對象列表綁定到BindingSource –

回答

1

我會創造一個新的領域表示枚舉的字符串表示並將DataGridView的列綁定到此屬性的BusinessObject類。這種方法是否符合您的要求?

public string EnumString { 
    get { 
    FilterClass fClass = this.FilterClass; 
    return fClasss.ToString(); 
    } 
} 
+0

基本上,你的意思是添加一個新的屬性到我正在顯示的對象,使得轉換爲字符串。 –

+0

是的,這應該很容易實現。我將在答案中很快發佈代碼。 – platon

1

你想在你的類來獲取每一個枚舉的名稱中字符串表示

例如做這樣的事情

這僅僅是在那裏你會放一個例子枚舉聲明請讓我知道如果這是你想要其他明智我將不得不改變我的回答

namespace sampleLogin 
{ 
    public enum FilterClass 
    { 
     TypeAFilter = 1, 
     TypeBFilter = 2, 
     TypeCFilter = 3 
    }; 

    public partial class frmLogin : Form 
    { 
     public frmLogin() 
     { 
     InitializeComponent(); 

     foreach (FilterClass fltClass in Enum.GetValues(typeof(FilterClass))) 
     { 
      Console.WriteLine(fltClass.ToString()); 
     } 
    } 
} 
+0

我想要的是,如果有任何簡單的方法將枚舉轉換爲字符串,但是當它顯示在DataGridView中。 –

0

你可以寫一個事件處理程序DataGridView.CellFormatting。在處理程序中,第一個參數是DataGridView(聲明爲對象),第二個參數的類型爲DataGridViewCellFormattingEventArgs,它有一個屬性ColumnIndex。如果調用的是正確的列索引,那麼您可以從DataGridView獲得rowcell,然後以任何喜歡的方式格式化單元格。

還有一種更復雜的方式,您可以將事件處理程序分配給列,但在此不再重複。如果您對此方法感興趣,請查看我的其他帖子。

因此,在您想要顯示的對象上創建另一個屬性可能會更簡單。但我已經爲完整性添加了這個答案。

1

讓我們想象一下,你不能改變業務對象(假設它是一個第三方組件),你可以簡單的創建一個自定義列:

private void Form1_Load(object sender, EventArgs e) 
{ 
    // filling up example data 
    var s = new List<InfoItem>(); 
    s.Add(new InfoItem() { PropertyA = "PA", PropertyB = 1, PropertyC = DateTime.Now, PropertyD = InfoItemType.Item_B }); 
    s.Add(new InfoItem() { PropertyA = "PB", PropertyB = 2, PropertyC = DateTime.Now, PropertyD = InfoItemType.Item_C }); 
    s.Add(new InfoItem() { PropertyA = "PC", PropertyB = 3, PropertyC = DateTime.Now, PropertyD = InfoItemType.Item_A }); 
    s.Add(new InfoItem() { PropertyA = "PD", PropertyB = 4, PropertyC = DateTime.Now, PropertyD = InfoItemType.Item_B }); 

    // assign my collection to the DataGrid 
    dg.DataSource = s; 

    // let's create one more column at the end 
    var column = new DataGridViewColumn(); 
    column.CellTemplate = new DataGridViewTextBoxCell(); 
    column.HeaderText = "Custom Column"; 
    column.Name = "customColumn"; // important name to remember 
    column.DataPropertyName = "PropertyD"; // the Enum Property 
    dg.Columns.Add(column); // add the column 
} 

// let's make the use of the `CellFormatting` event 
private void dg_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
{ 
    // If the column is the "customColumn", check the value. 
    if (this.dg.Columns[e.ColumnIndex].Name == "customColumn") 
    { 
     if (e.Value != null) 
     { 
      // let's change to whatever we want... 
      switch ((InfoItemType)e.Value) 
      { 
       case InfoItemType.Item_A: e.Value = "I'm A"; break; 
       case InfoItemType.Item_B: e.Value = "I'm B"; break; 
       case InfoItemType.Item_C: e.Value = "I'm C"; break; 
       default: e.Value = "I'm not..."; break; 
      } 
     } 
    } 
} 

記得事件附加到DataGridView對象

enter image description here

然後結果會是這樣的:

enter image description here

+0

我在另一篇文章中看到過這個解決方案。那傢伙抱怨說'CellFormatting'事件處理程序的執行過於拖延了應用程序。那可能嗎? –

+0

你可能需要有數百行,我永遠不會做的女巫,我會做一個分頁系統,例如,你總有可能創建自己定製的'DataGridViewColumn',女巫我也對我的本地例子...如果有人願意,我可以發佈該代碼... – balexandre