Добавление данных в ComboBox (не связанные данные) - PullRequest
6 голосов
/ 03 июня 2011

Я хочу добавить данные в комбинированный список, но не уверен в правильности метода, в котором это сделать.Данные поступают из необработанного оператора SQL.

Я посмотрел на данные привязки непосредственно из базы данных, но не ясно, как все эти привязки и наборы данных работают для меня, поэтому я решил пропустить это и вставить данные в поле ввода самостоятельно (с вашей помощью)).

Код, который я вижу в Интернете, выглядит следующим образом:

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) не добавляется.

Есть идеи?

Большое спасибо, Ричард

Ответы [ 4 ]

9 голосов
/ 05 июня 2011

ИСТОЧНИК: http://tipsntricksbd.blogspot.com/2007/12/combobox-is-one-of-most-common-gui.html

ComboBox является одним из наиболее распространенных элементов графического интерфейса.Он используется для предоставления пользователю возможности выбора элемента из списка или ввода нового текста.Здесь я покажу вам некоторые общие и полезные функции ComboBox в 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");

Sorted List:

Обычно пользователи ожидают, что параметры будут показаны в отсортированном порядке.Для этого нам нужно добавить одну строку кода -

myComboBox.Sorted = true;

DropDownStyle:

В ComboBox пользователь может либо ввести текст, либо просто выбратьпункт из списка.Поэтому разработчик должен установить свой стиль.Доступно 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));

Но если вы теперь видите список ComboBox, вы заметите, что все элементы одинаковы, и они являются именами классов этих объектов.Фактически, элементы - это не что иное, как результат функции 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;
}
}

Вы можете получить выбранное значение следующим образом -

int selectedValue = ((ComboBoxItem)myComboBox.SelectedItem).Value;
1 голос
/ 03 июня 2011

Я вижу, что значение всегда 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 голосов
/ 03 июня 2011

Нет, вам не нужно создавать свой собственный класс ... но это имеет смысл с тем, что вы делаете. В вашем приложении полезно иметь тип класса, представляющий сущность вашей базы данных. Переопределите метод ToString () вашего класса сущностей. Затем вставьте эти типы классов непосредственно в ComboBox. 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 голосов
/ 03 июня 2011

Нет, вам не нужно создавать новый класс для добавления данных в ComboBox, вы можете просто добавить строки, если хотите.Классы для удобства, и они, конечно, кажутся здесь удобными - зачем вам их избегать?(Возможно, я не совсем понимаю ваш вопрос ...)

Если все, что вы собираетесь делать, это выполнять строковые операции и постоянно использовать ToString() в классе, не обращаясь к отдельным свойствамтогда нет смысла его иметь - просто отформатируйте его в строку и используйте это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...