2010-05-18 76 views
2

我有一個「填充組合框」,我很開心,我甚至開始使用更多的組合框。它通過引用組合框對象的「值集合」(或任何你想要調用它)的ID,並添加項目和它們各自的值(不同)並完成工作。填充ComboBoxDataColumn項目和值

我最近有一個在gridview中使用組合框的好主意,我很高興地注意到它的工作只是單個組合框,但同時填充給定列中的所有組合框。

ObjComboBox.Items.Add("yadayada"); 
//works just like 
ObjComboBoxColumn.Items.Add("blablabla"); 

但是當我開始籌劃如何填充這些組合框我注意到:有沒有在ComboBoxDataColumn沒有「值」屬性。

ObjComboBox.Values = whateverArray; 
//works, but the following doesn't 
ObjComboBoxColumn.Values = whateverArray; 

問題:
0 - 我如何填充它的價值? (我懷疑這只是簡單的,但使用另一個名字)
1 - 如果它像一個組合框一樣工作,那麼沒有這個屬性的解釋是什麼?


----- [編輯] ------

所以我已經簽出查爾斯的報價,我已經想通我不得不改變我填充這些糟糕的方式男孩。我不應該循環遍歷字符串並將它們逐個插入到組合框中,而應該抓取要填充到表中的字段,並將表格的一列設置爲「值」,將另一列設置爲「顯示」 。所以,我已經做到了這一點:

ObjComboBoxColumn.DataSource = DTConfig; //Double checked, guaranteed to be populated 

ObjComboBoxColumn.ValueMember = "Code"; 
ObjComboBoxColumn.DisplayMember = "Description"; 

但沒有任何反應,如果我使用相同的對象像這樣:

ObjComboBoxColumn.Items.Add( 「StackOverflow上」);

它被添加。

沒有DataBind()函數。

它發現了兩列,這是保證(「代碼」和「說明」),如果我改變他們的名字爲不具有遠見者,它給了我一個例外,所以這是一個好兆頭。


----- [編輯] ------

我在SQL Server中的表,它是像

代碼|文字
-----
1 | foo
2 |酒吧

很簡單,跟其他組合框(GridView的外)我已經成功地填充通過行循環並添加文本:

ObjComboBox.Items.Add(MyDataTable.Rows[I]["MyColumnName"].ToString()); 

並獲得每一個值,將其添加到一個數組中,並設置它像:

ObjComboBox.Values = MyArray; 

我想填充我的comboboxColumns就像我用組合框一樣。

回答

3

我並不是說聽起來討厭,但你知道有這些東西的文檔?

http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridviewcomboboxcolumn.aspx

您可以通過添加值到 項目集合手動填充柱下拉列表 。或者,您可以通過設置 DataSource屬性將下拉列表綁定到其自己的 數據源。如果值爲 集合中的對象或 中的數據庫表中的記錄,則還必須設置 DisplayMember和ValueMember 屬性。 DisplayMember屬性 指示哪些對象屬性或 數據庫列提供顯示在下拉列表 列表中的值 。 ValueMember屬性 指示使用哪個對象屬性或 數據庫列來設置 單元格的Value屬性。


編輯:

從您的編輯,這聽起來像你可能會嘗試使用下面的類型DisplayMember和/或ValueMember的非公共屬性。或者,如果您的組合框數據源是DataTable,請確保它具有「代碼」和「描述」列。

下面是一個簡單的演示。我創建了Foo列表並將其分配爲我的ComboBox列的DataSource。只需創建一個winforms應用程序並將其粘貼。

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    }     

    protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 

     // this will be the datasource for the combo box column; you could also bind it to a dataset 
     List<Foo> foos = new List<Foo>() { 
      new Foo() { FooID = 0, FooName = "No Foo." }, 
      new Foo() { FooID = 1, FooName = "Foo Me Once" }, 
      new Foo() { FooID = 2, FooName = "Foo Me Twice" }, 
      new Foo() { FooID = 3, FooName = "Pity The Foo!" } 
     }; 

     DataGridView dataGridView1 = new DataGridView(); 
     dataGridView1.AutoGenerateColumns = false; 

     // add normal text column 
     DataGridViewColumn column = new DataGridViewTextBoxColumn(); 
     column.DataPropertyName = "MyText"; 
     column.Name = "Text"; 
     dataGridView1.Columns.Add(column); 

     // add the combo box column 
     DataGridViewComboBoxColumn comboCol = new DataGridViewComboBoxColumn(); 
     comboCol.Name = "Foo"; 
     // bind it to the list of foos to populate it 
     comboCol.DataSource = foos; 
     // specify which property of the grid's datasource to bind 
     comboCol.DataPropertyName = "MyFoo"; 
     // specify the property of the combo's datasource to bind 
     comboCol.ValueMember = "FooID"; 
     // specify the property of the combo's datasource to display 
     comboCol.DisplayMember = "FooName"; 

     dataGridView1.Columns.Add(comboCol); 

     // add some data 
     BindingSource bindingSource1 = new BindingSource(); 
     bindingSource1.Add(new BusinessObject(1, "You say")); 
     bindingSource1.Add(new BusinessObject(2, "George says")); 
     bindingSource1.Add(new BusinessObject(3, "Mr. T says")); 
     bindingSource1.Add(new BusinessObject()); 
     dataGridView1.DataSource = bindingSource1; 

     Controls.Add(dataGridView1); 
     dataGridView1.Dock = DockStyle.Fill; 
    }   

    class Foo 
    { 
     public int FooID { get; set; } 
     public string FooName { get; set; }   
    } 

    class BusinessObject 
    { 
     public BusinessObject(int foo, string text) 
     { 
      MyFoo = foo; 
      MyText = text; 
     } 
     public BusinessObject() 
     { 
      MyFoo = 0; 
      MyText = ""; 
     }    
     public string MyText { get; set; } 
     public int MyFoo { get; set; } 
    } 
} 
+0

您聽起來並不討厭。我計算出,有8萬個關於c#的問題中的大約6萬是來自那些閱讀過文檔,不理解,誤解或者根本沒有讀過它的人。我是其中的一員,我已經閱讀了一些內容,但還沒有想出如何做到這一點,並在S.O.上檢查過。並沒有發現任何問題,於是我決定提出一個問題,也許其他人可以在將來找到它,但謝謝! – Marcelo 2010-05-18 20:14:57

+0

@MarceloRamires:你可能是對的。我引用的文檔有幫助嗎?該頁面上也有一些例子。如果你仍然困惑,我可以爲你舉一個簡單的例子。 – 2010-05-18 20:45:12

+0

我會很高興=)我已經更新了我的問題 – Marcelo 2010-05-19 19:43:29