2011-06-03 22 views
6

Bir comboboxlist'e veri eklemek istiyorum ancak bunun yapılacağı doğru yöntemden emin değilim. Veri, ham bir SQL ifadesinden geliyor.Bir ComboBox'a Veri Ekleme (Bağlı olmayan veri)

Doğrudan veri tabanından bağlanan veriye baktım, ancak tüm bu bağlanma ve veri kümelerinin benim için nasıl çalıştığını net olarak görmüyorum, bu yüzden bunu atlamaya karar verdim ve verileri kendime gönderdim (yardımınızla birlikte). i çevrimiçi görmesine

kod aşağıdaki şöyledir:

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); 
    } 
} 

Eğer gerçekten sadece bir combobox veri eklemek için yeni bir sınıf oluşturmak zorunda mıyım? Sorun combobox ad ve soyadı değeri (İD) ile doldurulur iken eklenmez olmasıdır

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)); 
    } 

: gibi Ayrıca, yukarıdaki tekniği kullanarak kodu bakar.

Herhangi bir Fikir? İsterseniz

Birçok sayesinde Richard

+1

aşağıdaki seçilen değeri elde edebilirsiniz değer gibi görünüyor 2. Bir yazım hatası mı hep? –

+0

Bir yan not olarak, böyle bir soruyu yanıtlamak, kodun çalışma zamanında nasıl davrandığını (genellikle hata ayıklamak gibi) bir bilgiye sahip olmak için genellikle uygundur. Birkaç mesaj kutusu ve size böyle bir bilgi veren Console.WriteLine 'var, ancak bize vermiyorsunuz.Buradaki gibi bir soruya cevap vermek daha kolay olacaktır. Burada // gibi bir değer varsa, doğru değeri 6'ya sahibim ve // ​​buradaki değer 1243'e göre – Snowbear

+0

Merhaba Alex, evet oradaki değeri 2 koyuyorum. Sadece test için ama Değer eklenmedi. – DevilCode

cevap

8

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

ComboBox en biridir ortak GUI elemanları. Kullanıcının listeden bir öğe seçme veya yeni bir metin girme imkanını sağlamak için kullanılır. Burada Microsoft Visual Studio .Net 2005 kullanarak C# 'da ComboBox'un bazı yaygın ve kullanışlı işlevleri göstereceğim.

En basit ComboBox: En basit durumda

, biz aşağıdaki-

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"); 

SÄ List gibi listedeki bazı dizeleri ekleyin:

Genellikle kullanıcılar bekliyoruz seçenekler sıralanmış sırayla gösterilecektir. Bu amaçla, Kodunuzu

bir satır eklemek zorunda
myComboBox.Sorted = true; 

DropDownStyle: ComboBox içinde

, kullanıcı bir metin girmek ya da sadece listeden bir öğe seçebilirsiniz. Yani geliştirici tarzını ayarlamalıdır. Mevcut 3 seçenek vardır:

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. 

Örnek:

myComboBox.DropDownStyle = ComboBoxStyle.DropDown; 

Suggesstion/Sözlük: bir kullanıcı bir metin girdiğinde

, o/o bazı öneriler ise mutlu olur Yazma sırasında açılan kutunun hemen altında gösterilir.

programcı karşılık gelen değerin (değil için seçilmiş bulunan kullanıcının bazı okunabilir metin seçer bir olgu olması, ancak edilebilir: Bu işlevselliği için,

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

Bir Trick Lines

çift yazmaya gerek metin) önemlidir. Örneğin, veritabanı projesinde StudentID, bir programcı için StudentName'den daha önemlidir. Bu yüzden, birleşik kutuda (İsim, Değer) birleşimini ekleyebilmemiz ve İsim seçimi sırasında ilgili değeri kolayca alabilmemiz güzel olurdu.

Ad ve Değer içeren bir nesne ekleyerek yapabiliriz.

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)); 

Ama şimdi ComboBox listesini görürseniz, tüm öğeleri aynı olup bu nesnelerin sınıf adları olduğunu göreceksiniz. Aslında, öğeler, bu nesnelerin ToString() işlevinin çıktısından başka bir şey değildir. Dolayısıyla, beklentimiz olarak davranmak için ToString() işlevini geçersiz kılarsak, işimiz biter.

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; 
} 
} 

Kodunuzdaki itibaren yolu-

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

Kullanıcı "Shakibul Alam" yazıp listeden karşılık gelen öğeyi seçmeden ID = 4'ü nasıl buluyorsunuz? Bir sözlük (değer, id) kullanıyor musunuz yoksa bir döngü oluşturuyor musunuz? (Bu yüzden myComboBox.IndexOf (myComboBox.Text) açıkçası her zaman geri dönüyor olmasından dolayı -1) Teşekkür ederim – Fil

+0

Bu bana yardımcı oluyor. –

1

Hayır, sen ComboBox veri eklemek için yeni bir sınıf oluşturmak zorunda değilsiniz, sadece dizeleri ekleyebilirsiniz. Sınıflar kolaylık içindir ve kesinlikle burada uygun görünürler - neden onları önlemek istersiniz? (Belki de sorunuzu tam olarak anlamıyorum ...)

Yapacağınız tek şey dizge işlemlerini gerçekleştiriyorsa ve her zaman sınıftaki ToString() kullanarak, tek tek özelliklere erişmiyorsanız, hiçbir noktaya gerek yoktur. o zaman sahip - sadece bir dizeye formatlayın ve bunu kullanın.

+0

Açıklığa kavuşmak için, Değeri, bu durumda Kimlik olan birleşik giriş kutusuna ekleyemem. Isırgan adı + soyadı iyi görünüyor. Bunu yapmak için sınıf dışı yolu nedir? – DevilCode

1

Bu değerin kodunuzda her zaman 2 olduğunu görebiliyorum. Bu, sahip olduğunuz sorun olabilir.

Ayrıca biraz kodunuzu basitleştirmek için çalıştı:

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 olduğunu varsayarsak ve sıralanan tüm alanları veritabanında null değildir.

+0

Sanırım dize Name = rdata ["vetName"] ToString() Trim(); 'daha okunabilir. Ama sadece söyleyeyim, bu bir +1 ... – Andre

+0

@Andre 'rdata [" vetName "]' nemli bir alan değilse, içinde zaten dize nesnesi olurdu. Eğer null ise "rdata [" vetName "] 'i string' olarak yapmanız gerekir. –

+0

Verileri elimden gelenin en iyisini yapamam. Sadece combobox için öğeleri ekleme işlemi bir görev gibi görünüyor .... – DevilCode

0

Hayır, kendi sınıfınızı oluşturmak zorunda değilsiniz ... ama yaptığınız şeyle ilgili mantıklı. Uygulamanızda, bir sınıf türünün veritabanı varlığınızı temsil etmesi iyi bir fikirdir. Varlık sınıfınızın ToString() yöntemini geçersiz kılın. Ardından, bu sınıf türlerini doğrudan ComboBox'a yerleştirin. ComboBox, metni görüntülemek için varlığınızdaki ToString() öğesini çağırır. İşte

benziyor olacaktınız:

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; 
    } 
} 

Ardından, açılan kutunun doğrudan örneklerini ekleyin:

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

Burada bu ID bir INT olacaktır. Ancak, combobox'a nasıl atanır, bu fonksiyon sadece bir string döndürür (Name + Soyad). – DevilCode

+0

Bu durumda ToString() 'in geçersiz kılması bu durumda ne yapar? Cast var = (string) kaydı ["vetsurname"] sırasında çağrılır mı; tamam belki bu soruyu sormanın daha iyi bir yolu Ben "Merhaba Dünya" String "combobox" görünür ilgili değeri ile eklemek istiyorum. Bunu yapmanın en kolay yolu nedir: combobox.Items.Add ("Hello World", 200); <---- bunun gibi bir şey var mı? – DevilCode

+0

Bir combobox'a bir nesneyi eklediğinizde, combobox ekran metnini almak için her öğede ToString() öğesini çağırır. Sınıf tipinde, istediğiniz her şeyi ToString() 'e dönüştürebilirsiniz. İşte, ben 'İsim + Soyadı' iade ediyorum. Başka bir şey döndürmek isterseniz, bunu ToString() ifadesinde belirtin. –