2011-06-03 88 views
6

我希望將數據添加到組合框中,但我不確定正確的方法來執行此操作。數據來自原始SQL語句。將數據添加到組合框(未綁定數據)

我已經直接從數據庫中查看綁定數據,但並不清楚所有這些綁定和數據集是如何工作的,所以我決定跳過這一步,並將數據自己插入到combox中(在您的幫助下)。

的代碼,我在網上看到那張像下面這樣:

public partial class Form1 : Form { 
    // Content item for the combo box 
    private class Item { 
     public string Name; 
     public int Value; 
     public Item(string name, int value) { 
      Name = name; Value = value; 
     } 
     public override string ToString() { 
      // Generates the text shown in the combo box 
      return Name; 
     } 
    } 
    public Form1() { 
     InitializeComponent(); 
     // Put some stuff in the combo box 
     comboBox1.Items.Add(new Item("Blue", 1)); 
     comboBox1.Items.Add(new Item("Red", 2)); 
     comboBox1.Items.Add(new Item("Nobugz", 666)); 
    } 

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { 
     // Display the Value property 
     Item itm = (Item)comboBox1.SelectedItem; 
     Console.WriteLine("{0}, {1}", itm.Name, itm.Value); 
    } 
} 

你真的必須創建一個新的類,只是將數據添加到組合框? 此外,使用上述技術我的代碼看起來像:

while (rdata.Read()){ 
     String Name = (String)rdata["vetName"]; 
     Name = Name.Trim(); 
     String Surname = (String)rdata["vetSurname"]; 
     Surname = Surname.Trim(); 

     String id = rdata["vetID"].ToString().Trim(); 

     MessageBox.Show("ID " + id); 

     int value1 = Convert.ToInt32(id); 
     MessageBox.Show("value1 " + value1); 

     String display = (String)Name + " " + Surname; 

     editVetComboBox.Items.Add(new Item(display, 2)); 
    } 

的問題是,當該組合框被填入姓名和姓的值(ID)不添加。

任何想法?

非常感謝, 理查德

+1

從代碼中得到選擇的值好像值始終是2。它是一個錯字? – 2011-06-03 01:35:56

+0

作爲一個方面說明,回答這樣一個問題,通常很方便的是獲得代碼在運行時的行爲方式(就像我會調試它一樣)。你有幾個消息框和'Console.WriteLine'給你提供這樣的信息,但是你不會給我們。回答這樣的問題比較容易,如果代碼中有評論,比如'//這裏我有正確的值6'和'//由於某種原因這裏的值是1243' – Snowbear 2011-06-03 03:17:44

+0

嗨,亞歷克斯,是的,我把值2放在那裏只是爲了測試,但沒有增加價值。 – DevilCode 2011-06-03 16:18:46

回答

8

來源:http://tipsntricksbd.blogspot.com/2007/12/combobox-is-one-of-most-common-gui.html

組合框是一個最常見的GUI元素。它用於爲用戶提供從列表中選擇項目或輸入新文本的功能。在這裏,我將向您展示C#中使用Microsoft Visual Studio .Net 2005的ComboBox的一些常用和有用的功能。

最簡單的組合框:

在最簡單的情況下,我們在列表中添加一些字符串,如以下各項

myComboBox.Items.Add("Bangladesh"); 
myComboBox.Items.Add("India"); 
myComboBox.Items.Add("Pakistan"); 
myComboBox.Items.Add("Srilanka"); 
myComboBox.Items.Add("Maldives"); 
myComboBox.Items.Add("Nepal"); 
myComboBox.Items.Add("Bhutan"); 

排序清單:

一般用戶所期望的是,選項將按排序順序顯示。爲此,我們必須添加的代碼 -

一行
myComboBox.Sorted = true; 

DropDownStyle:

在組合框,用戶可以輸入文字或者只是從列表中選擇一個項目。所以開發者應該設定它的風格。有可用的3個選項:

ComboBoxStyle.DropDownList: User can just select one item from a list. 
ComboBoxStyle.DropDown: User can either type a text or select an item from list. 
ComboBoxStyle.Simple: User can only type a text in text box. Item list is not shown. 

例子:

myComboBox.DropDownStyle = ComboBoxStyle.DropDown; 

寶貴意見/詞典:

當用戶輸入文本時,他/她變得快樂,如果提出了一些建議在打字時顯示在組合框的正下方。對於這種功能,我們需要寫幾個線 -

myComboBox.AutoCompleteSource = AutoCompleteSource.ListItems; 
myComboBox.AutoCompleteMode = AutoCompleteMode.Suggest; 

一招:

可能存在用戶選擇一些可讀文本的情況,但對於程序員對應值(未選擇的文字)很重要。例如,在數據庫項目中,StudentID對於程序員來說比StudentName更重要。所以,如果我們可以在組合框中添加(名稱,值)組合,並且在名稱選擇時我們可以很容易地獲得相應的值,那將會很好。

我們可以通過添加一個包含名稱和值的對象來實現。

class ComboBoxItem 
{ 
public string Name; 
public int Value; 
public ComboBoxItem(string Name, int Value) 
{ 
this.Name = Name; 
this.Value = Value; 
} 
} 


myComboBox.Items.Add(new ComboBoxItem("Ashis Saha",1)); 
myComboBox.Items.Add(new ComboBoxItem("Subrata Roy", 2)); 
myComboBox.Items.Add(new ComboBoxItem("Aminul Islam", 3)); 
myComboBox.Items.Add(new ComboBoxItem("Shakibul Alam", 4)); 
myComboBox.Items.Add(new ComboBoxItem("Tanvir Ahmed", 5)); 

但如果你現在看到的組合框的列表中,你會發現,所有的項目都是相同的,他們是這些對象的類名。實際上,這些項目只不過是這些對象的ToString()函數的輸出。所以如果我們簡單地重寫ToString()函數來表現我們的期望,我們就完成了。

class ComboBoxItem 
{ 
public string Name; 
public int Value; 
public ComboBoxItem(string Name, int Value) 
{ 
this.Name = Name; 
this.Value = Value; 
} 

// override ToString() function 
public override string ToString() 
{ 
return this.Name; 
} 
} 

您可以在以下way-

int selectedValue = ((ComboBoxItem)myComboBox.SelectedItem).Value; 
+0

如果用戶在沒有從列表中選擇相應項目的情況下編寫「Shakibul Alam」,您如何找到ID = 4?你使用字典(值,ID)還是你做一個for循環? (這是因爲myComboBox.IndexOf(myComboBox.Text)顯然總是返回-1) 謝謝 – Fil 2015-10-11 14:05:35

+0

這個依賴可以幫助我。 – 2016-01-23 18:13:31

1

不,你不必創建一個新類將數據添加到組合框,你可以,如果你只想添加字符串。類是爲了方便起見的,它們在這裏看起來確實很方便 - 爲什麼要避免它們? (也許我不太明白你的問題......)

如果你所要做的只是執行字符串操作,並且一直在類上使用ToString(),而不是訪問單個屬性,那麼沒有意義然後將它格式化爲一個字符串並使用它。

+0

爲了澄清,我不能將值添加到組合框,在這種情況下,它是ID。蜇名字+姓氏顯示罰款。什麼是非班級的方式來做到這一點? – DevilCode 2011-06-03 16:20:48

1

我可以看到,代碼中的值總是2。這可能是你的問題。

此外,試圖簡化代碼一點:

while (rdata.Read()) 
{ 
    string name = (string)rdata["vetName"]; 
    string surname = (string)rdata["vetSurname"]; 
    int id = (int)rdata["vetID"]; 
    string display = name.Trim() + " " + surname.Trim(); 
    editVetComboBox.Items.Add(new Item(display, id)); 
} 

假設vetID是integer和所有列出的字段是不是在數據庫爲空。

+0

我想'string Name = rdata [「vetName」]。ToString()。Trim();'更具可讀性。但只是說,這是一個+1 ... – Andre 2011-06-03 01:43:20

+0

@Andre'rdata [「vetName」]'如果它不是可以爲空的字段就已經有內部的字符串對象。如果它不可用,則需要將'rdata [「vetName」]作爲字符串來執行。 – 2011-06-03 01:46:53

+0

我可以把數據拿出來罰款它不能無效。只是將項目添加到組合框的過程看起來像一個任務.... – DevilCode 2011-06-03 16:17:01

0

不,你不需要創建自己的類......但它對你正在做的事情有意義。在您的應用程序中,讓類類型表示您的數據庫實體是一個好主意。覆蓋實體類的ToString()方法。接下來,將這些類類型直接插入ComboBox。組合框將調用實體上的ToString()來顯示文本。

這是它會是什麼樣子:

public class Vet 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string SurName { get; set; } 

    public Vet() 
    { 
     // default constructor 
    } 

    public Vet(IDataRecord record) 
    { 
     ID = (int) record["vetid"]; 
     Name = (string) record["vetname"]; 
     SurName = (string) record["vetsurname"]; 
    } 

    public override string ToString() 
    { 
     return Name + " " + SurName; 
    } 
} 

下,直接添加的情況下,你的組合框:

comboBox.Items.Clear(); 
while(rdata.Read()) 
{ 
    comboBox.Items.Add(new Vet(rdata)); 
} 
+0

這裏這個ID將是一個INT。但是,它是如何分配給組合框的函數只返回一個字符串(名稱+姓氏)。 – DevilCode 2011-06-03 16:07:16

+0

在這種情況下,如何覆蓋ToString()在這種情況下做什麼?它是否在調用期間被調用var =(string)record [「vetsurname」]; 確定也許更好的方法來問這個問題是我想添加字符串「Hello World」與相關聯的值「200」出現在組合框中。什麼是最簡單的方法來做到這一點: combobox.Items.Add(「Hello World」,200); <----這樣的事情? – DevilCode 2011-06-03 16:13:05

+0

當您將對象添加到組合框中時,組合框將調用每個項目上的ToString()以獲取顯示文本。在類類型中,可以讓ToString()返回任何你想要的。在這裏,我有它返回'姓名+姓氏'。如果您希望它返回其他內容,只需在ToString()的return語句中指定它即可。 – 2011-06-03 21:14:35