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


Автор: opozdaika 3.9.2008, 16:58
На форме есть грид DataGridView, привязанный к данным. Одна из колонок есть ComboBox, привязанный к одному из полю данных. В поле хранится ЧИСЛО (ключ), а в комбобоксе нужно видеть ТЕКСТ, соответствующий этому ключу. Например, 1 - это "Чай", 2 - "Кофе" 3 - "Сок". Я пробую создать класс MyItem, представляющий элемент списка, и в нем связать число и текст.

Код

      DataGridView MyGrid;  // Это грид на форме
      //...
      class MyItem  // Пытаюсь сделать класс-переходник для представления одного элемента списка
        {
            private string Name;  // Этот текст - одна строка списмка комбобокса
            public int Num;  //  Это число, которое хранится в данных вместо текста

            // Конструктор
            public MyItem(string Name_, int Num_)  {  Name = Name_;   Num = Num_;  }

           //  Чтобы видеть в строках комбобокса текст
            public override string  ToString() { return Name; }  
        }

       private void Init()  // Эта функция настраивает грид
        {
            MyGrid.DataSource = ... ;  // Привязали грид к данным

            MyGrid.Columns[1].DataPropertyName = "XXX";  // Привязали ComboBox-колону к полю данных (оно хранит ЧИСЛО, а не текст!!!)

            //   Заполняем строки комбобокса
            DataGridViewComboBoxCell.ObjectCollection Items = ((DataGridViewComboBoxColumn)MyGrid.Columns[1]).Items;
            Items.Clear();
            Items.Add(new MyItem("Чай" , 0));    // Хочу, чтобы вместо унылого "0" в гриде писалось веселое "Чай"
            Items.Add(new MyItem("Кофе", 1));
            Items.Add(new MyItem("Сок", 2));
        }

Но чего-то явно не хватает, т.к. я нигде не задал, что именно член Num должен быть связан с данными. Как сделать? Помогите!!!

Автор: Wanderer2019 3.9.2008, 18:37
а к чему такие извращения то?
Сделай выборку, где помимо id будет и название этого элемента (чай, кофе и т.д.) и подставляй себе на здоровье.

Автор: opozdaika 4.9.2008, 10:24
Цитата(Wanderer2019 @ 3.9.2008,  18:37)
Сделай выборку, где помимо id будет и название этого элемента (чай, кофе и т.д.) и подставляй себе на здоровье.

У меня источник данных - не SQL, а BindingList<>, поэтому  сделать выборку не так просто. Я хотел бы, чтобы был lookup на уровне UI

Автор: Wanderer2019 4.9.2008, 11:07
Ну пусть будет так. Тогда подпишись на событие RowBound этого грида и в момент добавления очередной строки подставляй туда что тебе хочется.

Автор: opozdaika 4.9.2008, 15:50
Цитата(Wanderer2019 @ 4.9.2008,  11:07)
подпишись на событие RowBound этого грида

В моем гриде DataGridView  .NET Framework 3.5 событие RowBound отсутствует

Автор: opozdaika 4.9.2008, 16:53
Я вот тут разобрался. Все правильно я делал. Не хватало только вот такого кода:
Код

         comboboxColumn.ValueMember = "NumProp";
         comboboxColumn.DisplayMember = "NameProp";

Автор: Reaf 8.9.2008, 17:37
Еще можно событие CellFormatting Грида использовать.

А потом, либо с помощью if, либо с помощью switch заполнять условия.

Код

if (row.Data == 1)
{
    e.Value = "Чай";
}
    
                        

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