2011-10-05 67 views
5

我試圖在DataGridView中設置一些東西。看起來這應該是非常簡單的,但我遇到了麻煩。我想顯示三列:DataGridViewComboBoxColumn數據源?

  • 代碼ID
  • 代號爲
  • 的組合框類型名的DisplayMember,TYPEID

的ValueMember我希望能夠從TypeName所有可能的值進行選擇。這裏是我的困境:

如果我所有這一切都裝入一個DataTable並設置DataGridViewDataSource,我可以顯示該記錄的現有TypeName,但組合框將不包括任何其他值。如果將DataGridViewComboBoxColumnDataSource設置爲包含所有可能的TypeNames的單獨DataTable,則不會顯示現有值。

DataGridView真的很煩人,所以無論是解決方案或可行的替代方案將不勝感激。

編輯︰看起來問題是由於我想有一個單獨的項目DisplayMemberValueMember。下面的作品,如果我不擔心IDValueMember設置:

var typeColumn = new DataGridViewComboBoxColumn 
{ 
    DataSource = typeList, 
    DisplayMember = "Type", 
    ValueMember = "Type", 
    DataPropertyName = "Type" 
} 

如果我這樣做,正確的類型選擇,但我不能改變在組合框中選擇:

var typeColumn = new DataGridViewComboBoxColumn 
{ 
    DataSource = typeList, 
    DisplayMember = "Type", 
    ValueMember = "TypeID", 
    DataPropertyName = "TypeID" 
} 

如果我用下面的我得到了FormatException錯誤,因爲它正試圖以填充:

var typeColumn = new DataGridViewComboBoxColumn 
{ 
    DataSource = typeList, 
    DisplayMember = "Type", 
    ValueMember = "TypeID", 
    DataPropertyName = "Type" 
} 

EDI牛逼typeList是一個簡單的DataTable由以下填充:

SELECT DISTINCT IT.InsuranceTypeID, IT.[Type] 
FROM InsuranceType IT 
WHERE IT.ClientID = @ClientID 
ORDER BY [Type] 
+0

你設置的DGVCBC的DataPropertyName?此外,史詩般的配置文件圖標。 http://social.msdn.microsoft。com/forums/en-US/winformsdatacontrols/thread/952b1cc9-4ba7-4b16-abdf-be2cdfde6460/ –

+0

是的...看到我的編輯。 –

+0

你可以發表你如何設置'typeList'和你添加到列表中的結構嗎? 「DataPropertyName」和「ValueMember」的類型必須相同,這可能是您在上一個示例中遇到異常的原因。 – SwDevMan81

回答

3

好吧,我想出了一個例子ClientInfoInsuranceDetails,我認爲可能會仿造什麼你正在努力去做。讓我知道這些細節是不是很對。這個例子將填充DataGridViewComboBox,並設置基礎上,InsuranceDetails(特別是在:InsurDetailz = all_insurance_types[2])值

public partial class Form1 : Form 
    { 
     private ClientInfo _myClient; 
     private BindingList<InsuranceDetails> all_insurance_types = 
     new BindingList<InsuranceDetails>(); 

     public Form1() 
     { 
     InitializeComponent(); 

     DataGridView grid = new DataGridView(); 
     grid.Dock = DockStyle.Fill; 
     grid.AutoGenerateColumns = true; 

     all_insurance_types.Add(new InsuranceDetails(1, "Health")); 
     all_insurance_types.Add(new InsuranceDetails(2, "Home")); 
     all_insurance_types.Add(new InsuranceDetails(3, "Life")); 

     var col = new DataGridViewComboBoxColumn 
     { 
      DataSource = all_insurance_types, 
      HeaderText = "Insurance Type", 
      DataPropertyName = "InsurDetailz", 
      DisplayMember = "ItType", 
      ValueMember = "Self", 
     }; 

     _myClient = new ClientInfo { 
      InsurDetailz = all_insurance_types[2], Name = "Jimbo" }; 
     grid.Columns.Add(col); 
     grid.DataSource = new BindingList<ClientInfo> { _myClient }; 
     this.Controls.Add(grid); 

     this.FormClosing += new FormClosingEventHandler(Form1_FormClosing); 
     } 

     void Form1_FormClosing(object sender, FormClosingEventArgs e) 
     { 
     // make sure its updated 
     InsuranceDetails c = _myClient.InsurDetailz; 
     string name = _myClient.Name; 
     // Place breakpoint here to see the changes in _myClient 
     throw new NotImplementedException(); 
     } 
    } 

    class ClientInfo 
    { 
     public string Name { get; set; } 
     public InsuranceDetails InsurDetailz { get; set; } 
    } 

    class InsuranceDetails 
    { 
     public int InsuranceTypeID { get; set; } 
     public String ItType { get; set; } 
     public InsuranceDetails Self { get { return this; } } 

     public InsuranceDetails(int typeId, String itType) 
     { 
     this.InsuranceTypeID = typeId; 
     this.ItType = itType; 
     } 
    } 
+0

祕密是「自我」屬性。 –

5

我也有類似的(我認爲)的問題,對我來說,解決辦法是設置DataSourceDataGridViewComboBoxColumn之前設置DataSourceDataGridView

就我而言,我的數據源是List<T>BindingList<T>分別,但它應該工作一樣用數據表:

DataGridViewComboBoxColumn categoryColumn = (DataGridViewComboBoxColumn)_ItemsGrid.Columns["CategoryID"]; 
categoryColumn.DataSource = categories; 

_ItemsGrid.DataSource = items; 
+0

不幸的是,這並沒有幫助。 –

+0

當使用Eloquera並將一些複雜的類綁定到數據網格時,這幫助了我很多。謝謝! – Sverker84

+0

這對我有用。謝謝! –

相關問題