Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: WPF DataGrid и массивы  (Прочитано 4800 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Dmitry
Помогающий

ru
Offline Offline

« : 11-11-2011 19:15 » 

Нужно привязать к таблице коллекцию, элементы которой являются массивами. Т.е. каждый столбец таблицы соответствует позиции в массиве.
WPF только осваиваю, поэтому пока решение в лоб:

Код: (C#)
class Data
    {
        public string[] S { get; set; }
    }

//////////////////

    List<Data> list = new List<Data>(2);

    Data d = new Data { S = new string[] { "aaa1", "bbb1", "ccc1" } };
    list.Add(d);

    d = new Data { S = new string[] { "aaa2", "bbb2", "ccc2" } };
    list.Add(d);

    DataGridTextColumn c;
    Binding b;

    for (int i = 0; i < 3; i++)
    {
        c = new DataGridTextColumn();
        c.Header = i.ToString();
        b = new Binding("S");
        b.Converter = new MyConverter(i);
        c.Binding = b;
        dataGrid1.Columns.Add(c);
    }

    dataGrid1.ItemsSource = list;

//////////////////

    class MyConverter : IValueConverter
    {
        private int column;
        public MyConverter(int column)
        {
            this.column = column;
        }
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {            
            return ((string[])value)[column];
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotSupportedException();          
        }
    }        

И для поддержки редактирования нужно ещё в конверторе хранить ссылку на DataGrid.

Добавлено через 3 дня, 14 часов, 30 минут и 30 секунд:
Ещё такая проблема. Есть класс - оболочка для коллекции, например, List<Person>. Хочу, чтобы его можно было привязать к гриду через ItemsSource. Для этого реализую в своём классе интерфейс IEnumerable:
Код: (C#)
class PersonCollection : IEnumerable
{
     List<Person> list;

     IEnumerator Ienumerable.GetEnumerator()
     {
          return ((IEnumerable)list).GetEnumerator();
     }

     public List<Person> GetList()
     {
         return list;
     }
}

Однако, не работает, грид пустой (точнее, добавляются пустые строки) -

Код: (C#)
      dataGrid2.ItemsSource = collection;

C данными всё ок, т.к. такой вариант, естественно, пашет
Код: (C#)
 dataGrid.ItemsSource = collection.GetList();

В чём тут дело?





« Последнее редактирование: 15-11-2011 09:45 от Dmitr » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 15-11-2011 11:18 » 

Dmitry, а как твой грид узнаёт, что именно ты хочешь видеть в строчках применительно к Person?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dmitry
Помогающий

ru
Offline Offline

« Ответ #2 : 15-11-2011 11:40 » 

Dimka, У грида стоит AutoGenerateColumns="true", т.е. имеет место быть автоматическая генерация столбцов и грид отображает все открытые свойства Person. А узнаёт, видимо, с помощью рефлексии.
Ещё раз отмечаю, что второй способ работает, когда ItemsSource устанавливается непосредственно на список, через GetList(). Хотя в первом случае ItemsSource получает тот же самый перечислитель. Вроде бы..

С авто генерация столбцов - это было временно. Сейчас убрал её, явно привязал столбцы к свойствам, и всё заработало как надо.
А в этой автогенерации всё-таки где-то собака зарыта Улыбаюсь
« Последнее редактирование: 15-11-2011 12:17 от Dmitry » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines