Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Где хранить ID записи?


Автор: psiallon 2.9.2009, 14:12
Здравствуйте уважаемые форумчане. До этого программировал под Web, но недавно решил покурить WinForms, и возник вопрос.

Имеется ComboBox, который содержит данные поля из таблицы БД, есть кнопка при нажатии на которую выбранный в ComboBox элемент должен удалиться из базы данных. Проблема в том, что где-то надо хранить ID записи. Например программируя под Web, это делалось так:
Код

<select name="list">
<option value="1">Поле с ID=1</option>
<option value="2">Поле с ID=2</option>
</select>

Можно ли реализовать, что-то подобное в WinForms?

Сейчас храню идентификаторы в массиве, который имеет такой-же порядок элементов как и в ComboBox... Мне кажется это ужасным, наверняка есть какой-нибудь выход...

Спасибо.

Автор: diadiavova 2.9.2009, 18:55
Элементом в комбобоксе может быть объект любого типа. Соответственно он может иметь любые свойства и хранить любые данные. Отображаться при этом будет для каждого объекта значение свойства, имя которого надо указать в свойстве DisplayMember самого комбобокса. Если оно не указано, то выводится строка, которую возвращает метод ToString объекта.

Автор: Heinzz 2.9.2009, 18:56
проще всего использовать ArrayList или List<> , можно сказать что это массивы с переменной длинной, хотя это конечно производные от LinkedList. Доступ к членам возможен и по индексу.

Автор: diadiavova 2.9.2009, 19:24
Ну да, конечно, "городушки городить" оно всегда проще.

Автор: diadiavova 2.9.2009, 19:45
Код

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

        private void Form1_Load(object sender, EventArgs e)
        {
            var cb = new ComboBox();
            this.Controls.Add(cb);
            cb.Items.Add(new MyItem() { Id = 1, Value = "Поле 1" });
            cb.Items.Add(new MyItem() { Id = 1, Value = "Поле 2" });
            cb.DisplayMember = "Value";
           
            cb.SelectedIndexChanged += new EventHandler(cb_SelectedIndexChanged);
        }

        void cb_SelectedIndexChanged(object sender, EventArgs e)
        {
            var cb=((ComboBox)sender);
            var si=(MyItem)cb.SelectedItem;
            var dispText = string.Format("Selected Item\n\rValue = {0} \n\rId = {1}", 
                si.Value, si.Id.ToString());
            MessageBox.Show(dispText);
        }
    }
    public class MyItem
    {
        public string Value{get;set;}
        public int Id { get; set; }
    }

Автор: Heinzz 2.9.2009, 20:08
Цитата(diadiavova @  2.9.2009,  19:24 Найти цитируемый пост)
Ну да, конечно, "городушки городить" оно всегда проще. 

да, в радиокружке я был мастер "навесного монтажа" smile 

Автор: diadiavova 2.9.2009, 20:10
Цитата(Heinzz @  2.9.2009,  21:08 Найти цитируемый пост)
да, в радиокружке я был мастер "навесного монтажа"

 smile 

Автор: Любитель 2.9.2009, 20:22
Цитата(diadiavova @  2.9.2009,  18:55 Найти цитируемый пост)
Если оно не указано, то выводится строка, которую возвращает метод ToString объекта.

Не совсем - Convert.ToString, точнее smile 

Цитата(Heinzz @  2.9.2009,  18:56 Найти цитируемый пост)
ArrayList или List<>

Первое ныне бессмысленно.

Цитата(Heinzz @  2.9.2009,  18:56 Найти цитируемый пост)
ArrayList или List<> , можно сказать что это массивы с переменной длинной, хотя это конечно производные от LinkedList.

Никакого отношения к LinkedList они не имеют. Первые - массив, расширяемый по мере надобности, второе - связанный список.

Автор: Heinzz 2.9.2009, 20:27
Цитата(Любитель @  2.9.2009,  20:22 Найти цитируемый пост)
Никакого отношения к LinkedList они не имеют. Первые - массив, расширяемый по мере надобности, второе - связанный список. 

так LinkedList это ж и есть связанный список

наврал я  smile 
Цитата(MSDN)
Класс List<T> является универсальным эквивалентом класса ArrayList. Он реализует универсальный интерфейс IList<T> с помощью массива, размер которого динамически увеличивается по мере необходимости.


Автор: psiallon 2.9.2009, 20:34
Спасибо всем большое, очень помогли. smile 

Автор: Любитель 2.9.2009, 23:46
Цитата(Heinzz @  2.9.2009,  20:27 Найти цитируемый пост)
так LinkedList это ж и есть связанный список

Я ж написал, "первые". Всмысле ArrayList и его дженерик-аналог List<T>. А второй - LinkedList.

Автор: psiallon 3.9.2009, 08:57
Все таки нашел более элегантное решение с databinding:
Код

        private DataTestEntities data = new DataTestEntities();

        private void MainForm_Load(object sender, EventArgs e)
        {
            ComboBox cb = new ComboBox();
            cb.DropDownStyle = ComboBoxStyle.DropDownList;
            cb.DisplayMember = "Name";
            cb.ValueMember = "Id";
            cb.SelectedValueChanged += new EventHandler(cb_SelectedValueChanged);
            cb.DataSource = data.Products;
            Controls.Add(cb);
        }

        void cb_SelectedValueChanged(object sender, EventArgs e)
        {
            ComboBox cb = (ComboBox)sender;
            MessageBox.Show("ID = " + cb.SelectedValue);
        }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)