2015-08-04 3 views
1

У меня есть рутина, которая открывает набор записей и создает коллекцию Items для поля со списком. После googling я нашел подход, который использует класс ComboboxItem.C# ComboBox databinding

public class ComboboxItem 
{ 
    public string Text { get; set; } 
    public object Value { get; set; } 

    public override string ToString() 
    { 
     return Display; 
    } 
} 

Мой код использует этот класс для добавления элементов в ComboBox. Когда я запускаю приложение и щелкаю Combobox, правильные значения находятся в списке ... отлично! Моя проблема заключается в том, что когда форма загружает запись из базы данных, вместо этого она ищет соответствующее значение списка, которое соответствует значению базы данных, оно просто показывает значение из базы данных: например, Великобритания, а не Великобритания. Когда я пытаюсь сохранить запись, она пытается спасти «Соединенное Королевство» вместо «Великобритании». Поэтому я считаю, что свойства DisplayMember и ValueMember нужно назначать. Я предположил, что мне нужно будет назначить их как «Текст» и «Значение», но когда я это сделаю, Combobox отображает список одинаковых значений. Что я делаю неправильно?

Edit: Это упрощенная версия того, что я поставил в моем ComboBox Класс:

public class StandardComboBox : ComboBox 
    { 
     protected List<ComboboxItem> DataSourceList = new List<ComboboxItem>(); 

     public bool SetRecordSource(string Criteria) 
     { 
      ADODB.Recordset RS = new ADODB.Recordset(); 

      try 
      { 
       DataSourceList.Clear(); 

       // Open ADDOB.Recordset RS with the records specified in Criteria 

       while (RS.EOF == false) 
       { 
      ComboboxItem MyComboboxItem = new ComboboxItem(); 
      MyComboboxItem.Value = RS.Fields[0].Value.ToString(); 
      MyComboboxItem.Display = RS.Fields[1].Value.ToString(); 

        DataSourceList.Add(MyComboboxItem); 

        RS.MoveNext(); 
       } 

       this.DataSource = DataSourceList; 
       this.ValueMember = "Value"; 
       this.DisplayMember = "Display"; 

       return true; 
      } 
     } 
} 
+0

Это приложение WPF? – Han

ответ

1

Во-первых, я думаю, вы должны назвать ваш класс лучше (например, страны.). Затем также задайте имя свойства. Используйте строку в качестве типа данных.

public class Country 
{ 
    public string ID { get; set; } 
    public string Name { get; set; } 
} 

Затем вы связываете выпадающий список и устанавливаете DisplayMember и DisplayValue.

comboBox1.DataSource = listCountry; 
comboBox1.DisplayMember = "Name"; 
comboBox1.ValueMember = "ID"; 

Если вы хотите принять значение, просто используйте SelectedValue.

private void button1_Click(object sender, EventArgs e) 
{ 
    MessageBox.Show(comboBox1.SelectedValue.ToString()); 
} 

Полный исходный код.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

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

     private void Form1_Load(object sender, EventArgs e) 
     { 
      var listCountry = new List<Country>() { 
       new Country() {ID = "UK", Name = "United Kingdom"}, 
       new Country() {ID = "US", Name = "United States of America"}, 
      }; 

      comboBox1.DataSource = listCountry; 
      comboBox1.DisplayMember = "Name"; 
      comboBox1.ValueMember = "ID"; 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      MessageBox.Show(comboBox1.SelectedValue.ToString()); 
     } 
    } 

    public class Country 
    { 
     public string ID { get; set; } 
     public string Name { get; set; } 
    } 
} 
+0

Спасибо за ответ. Я не использую переменную List. Я добавляю элементы непосредственно в коллекцию ComboBox Items. Я делаю это так, потому что моя PopulateComboBox() - это универсальная процедура, которая может настраивать элементы для любого ComboBox. Я не могу представить изящный способ создания динамического списка, который будет сохраняться после завершения процедуры. Я нашел немало примеров, показывающих, как люди добавляют элементы непосредственно в коллекцию элементов ComboBox. Я удивлен, что после этого у меня возникла такая проблема с поведением. –

+0

Я ударил по идее. Я переопределил класс ComboBox и дал классу собственный список, затем я использовал ваш код, чтобы заполнить его. У меня все еще есть такая же проблема, хотя ..... Когда запись загружается из базы данных, отображаемое значение - «Великобритания», а не «Соединенное Королевство». Я нажимаю на поле со списком, и все нужные элементы есть. Я использую синтаксис: ComboBox.Value = RS.Fields [0] .Value.ToString(); Это правильно, не так ли? Edit: Черт, я сейчас думаю, что мне нужно сделать свой собственный поиск в списке для записи, которая соответствует моему значению базы данных. –

+0

Пожалуйста, отредактируйте ваше сообщение, чтобы я мог увидеть модификацию вашего кода. – Han

0

Мне удалось это сделать сейчас. Я из фона MsAccess, где, например, вы просто назначаете combobox с «UK», а в списках combobox - «United Kingdom». В C# это сложнее. Если вы хотите назначить значение со списком со значением, вам нужно использовать метод FindString() для определения значения, которое вы хотите отобразить, а затем присвоить свойству SelectedIndex, чтобы оно отображало это значение. Это боль в балу, но я могу построить эту логику в своем классе и не думать об этом снова. Спасибо за ваш вклад. -

Смежные вопросы