WPF DataGrid: как связать с источником с неизвестными полями
От: Belowzero  
Дата: 30.01.10 21:13
Оценка:
Задача такая – есть двумерная структура данных (отображение таблицы БД)
ArrayList, элементами которого являются коллекции Hashtable (структура может быть и другой, главное, она должна содержать данные таблицы)

Все это мне надо отразить в элементе DataGrid из WPF Toolkit. На стадии проектирования я не знаю состав полей таблицы и их имена и не могу объявить жесткую привязку к конкретным полям. Как быть?
Re: WPF DataGrid: как связать с источником с неизвестными по
От: _FRED_ Черногория
Дата: 30.01.10 21:25
Оценка:
Здравствуйте, Belowzero, Вы писали:

B>Задача такая – есть двумерная структура данных (отображение таблицы БД)

B>ArrayList, элементами которого являются коллекции Hashtable (структура может быть и другой, главное, она должна содержать данные таблицы)
B>Все это мне надо отразить в элементе DataGrid из WPF Toolkit. На стадии проектирования я не знаю состав полей таблицы и их имена и не могу объявить жесткую привязку к конкретным полям. Как быть?

Как быть с чем? Как писать ксамл для такого датагрида? Описать там только то, что известно. А что нет — состав стобцов, например, — добавлять во время выполнения из кода. Так же из кода можно создавать и привязки.
Help will always be given at Hogwarts to those who ask for it.
Re[2]: WPF DataGrid: как связать с источником с неизвестными
От: Belowzero  
Дата: 30.01.10 21:38
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, Belowzero, Вы писали:


B>>Задача такая – есть двумерная структура данных (отображение таблицы БД)

B>>ArrayList, элементами которого являются коллекции Hashtable (структура может быть и другой, главное, она должна содержать данные таблицы)
B>>Все это мне надо отразить в элементе DataGrid из WPF Toolkit. На стадии проектирования я не знаю состав полей таблицы и их имена и не могу объявить жесткую привязку к конкретным полям. Как быть?

_FR>Как быть с чем? Как писать ксамл для такого датагрида? Описать там только то, что известно. А что нет — состав стобцов, например, — добавлять во время выполнения из кода. Так же из кода можно создавать и привязки.


Весь вопрос в том, как создавать привязки. Например, я писал так

public class DBRowData
{
public class DBItems
{
Hashtable ht = new Hashtable();
public string this[string Key]
{
get { return ht[Key].ToString(); }
set { ht[Key] = value; }
}
}

DBItems items = new DBItems();

public DBItems Values { get { return items; } }
}
.....
ObservableCollection<DBRowData> Data = new ObservableCollection<DBRowData>();
..... Заполняем коллекцию Data...............

DataGridTextColumn Column1 = new DataGridTextColumn();
Column1.Header = "Наименование";
//Вот такой байндинг не работает, пишет что не найдено свойство Values["Name"], хотя в таблице такое поле есть
Column1.Binding = new Binding("Values[\"Name\"]");

dgCustomers.Columns.Add(Column1);
Re[3]: WPF DataGrid: как связать с источником с неизвестными
От: _FRED_ Черногория
Дата: 31.01.10 08:15
Оценка:
Здравствуйте, Belowzero, Вы писали:

_FR>>Как быть с чем?


B>Весь вопрос в том, как создавать привязки. Например, я писал так


Код надо выделять тегами
[c#]
B>public class DBRowData
…
[/c#]

Что является ItemsSource для грида? Вот это вот:
ObservableCollection<DBRowData> Data = new ObservableCollection<DBRowData>();
?
Что тогда должно происходить, если разные строки будут содержать разный набор (с разными ключами) данных с словарях? То есть если в первой DBRowData есть Values["A"] и Values["B"], а во второй — Values["B"] и Values["C"] Что должно происходить, когда во-вторую добавляют Values["D"]? Грид как-нибудь должен реагировать на это?

ИМХО, как-то криво сделана структура данных: на первый взгляд кажется, что её очень просто привести в несогласованное состояние.

Но если ответы на перечисленные выше вопросы есть, то вариантов несколько.

Первый: реализовать в "class DBRowData" интерфейс ICustomTypeDescriptor. В первую очередь его методы GetProperties(). "Свойства" для каждой из строк, используемые в механизмах биндинга, будут браться оттуда.

Второй: — читать Understanding the TypeDescriptor: A Metadata Engine for Designtime Code документацию и пробовать разбираться. Например, сделать свой класс-коллекцию <DBRowData> (например, наследник ObservableCollection<DBRowData>), в котором реализовать интерфейс ITypedList.
Help will always be given at Hogwarts to those who ask for it.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.