2010-10-22 86 views
1

我已動態創建上形式的DataGridView控制,具有數據源指定爲:如何以編程方式在DataGridView C#中轉換列類型?

((DataGridView)createdControl).DataSource = (IList)(p.GetValue(editedClient, null)); 

其中的IList被定義爲通用集合下面的類:

 public class CDocumentOperation 

    { 
     [DisplayName(@"Time")] 
     public DateTime TimePosted { get; set; } 
     [DisplayName(@"User")] 
     public CUser User { get; set; } 
     [DisplayName(@"Action")] 
     public string Action { get; set; } 
    } 

網格與數據成功地填充,但只有問題,所有列 被創建爲文本字段。我需要的是手動轉換綁定到用戶字段的列 以具有按鈕或鏈接(將列類型轉換爲DataGridViewButtonColumn)。

我可以在不修改網格創建後的網格自動填充功能的情況下執行此操作,而無需手動創建適當類型和數據複製的列 ?

回答

1

簡短的回答是,如果沒有在綁定之前手動創建列(並設置DataPropertyName屬性),則無法完成此操作。沒有可用於裝飾數據源的屬性,DataGridView將爲每種數據類型生成DataGridViewTextBoxColumn(除了將解析爲複選框列的Boolean除外)。這種行爲是內在的,不可改變的。

你最好的選擇是對電網禁用AutoGenerateColumns,寫自己的方法是動態生成相應的列類型,也許是基於自己的自定義屬性,如(從你上面的例子):

[DisplayName(@"Time"), ColumnType(typeof(DataGridViewButtonColumn))] 
public DateTime TimePosted { get; set; } 

屬性類很容易編寫(只需擴展Attribute,添加一個Type字段和相應的構造函數)。在將生成列的方法中(緊接在綁定之前),可以使用反射來抓取屬性並檢查是否存在自定義屬性。 (BindingSource.GetItemProperties()對於獲取有關集合中對象屬性的信息非常有用。)

這不是最優雅的解決方案(它深入研究一些中級概念),但它是解決此問題的唯一方法限制在DataGridView控件中自動生成的列。