Я недавно прошел через это, отделяя почти то же самое от нашего уровня пользовательского интерфейса.
Вы можете увидеть мой прогресс здесь и здесь .
По моему мнению, A DataTable
не не представляет бизнес-логику. В частности, это данные, извлекаемые непосредственно из базы данных. Бизнес-логика превращает эти данные в действительно полезный бизнес-объект.
Первый шаг - это отделение DataTable от бизнес-объекта.
Вы можете сделать это, создав объекты и List<object>
, которые составляют DataTables и Collections of DataTables, а затем вы можете создать ListView, который отображает эти объекты. Я описываю последние шаги в ссылках, которые я разместил выше. И первые шаги так же просты, как следующие:
- Создайте класс, который будет представлять ваш объект.
- итерация по вашей DataTable (или DataSet, или как вы извлекаете данные) и вставка этих полей в свойства этого объекта (или этого
List<T>
);
- вернуть этот список в Gridview или ListView для отображения.
Таким образом, ваш ListView или Gridview не будут тесно связаны с методом, которым вы извлекаете ваши данные. Что произойдет, если вы решите получить свои данные из запроса JSON или файла XML позже? Тогда вам придется встроить это туда.
Шаг 1 - Получение данных из базы данных
Существует несколько способов получения данных из базы данных, и я не могу просмотреть все их здесь. Я предполагаю, что вы уже знаете, как извлечь данные из базы данных, и если вы этого не сделаете, есть довольно много ссылок , чтобы следовать. Давайте представим, что вы подключились к базе данных и используете SQLDataReader
для извлечения данных. Мы заберем там.
Диаграмма классов
Foo
----
id
Name
Description
А вот и метод:
private void FillDefault(SqlDataReader reader, Foos foo)
{
try
{
foo.id = Convert.ToInt32(reader[Foo.Properties.ID]);
foo.Name = reader[Foo.Properties.NAME].ToString();
if (!string.IsNullOrEmpty(
reader[Foo.Properties.DESCRIPTION].ToString()))
foo.Description =
reader[Foo.Properties.DESCRIPTION].ToString();
else foo.Description = string.Empty;
}
catch (Exception ex)
{
throw new Exception(
string.Format("Invalid Query.
Column '{0}' does not exist in SqlDataReader.",
ex.Message));
}
}
Как только это произойдет, вы можете вернуть список, пройдя этот процесс в цикле while
, который нацелен на функцию SQLDataReader.Read()
.
Как только вы это сделаете, давайте представим, что ваш Foo
, возвращаемый вам, является списком. Если вы сделаете это и перейдете по первой ссылке, которую я дал выше, вы можете заменить Dictionary<TKey, TValue>
на List<T>
и добиться того же результата (с небольшими отличиями). Класс Properties
содержит только имена столбцов в базе данных, поэтому у вас есть одно место для их изменения (на случай, если вам интересно).
DataTable - обновление на основе комментария
Вы всегда можете вставить промежуточный объект. В этом случае я бы вставил бизнес-уровень между DataTable и пользовательским интерфейсом, и я обсудил, что я буду делать выше. Но DataTable не является бизнес-объектом; это визуальное представление базы данных. Вы не можете перенести это на уровень пользовательского интерфейса и назвать его разъединенным. Они говорят, что вы должны использовать DataTable, они говорят, что у вас есть для передачи этого DataTable в пользовательский интерфейс? Я не могу представить, что они будут. Если вы это сделаете, то вы никогда не будете разобщены. Вам всегда понадобится промежуточный объект между DataTable и слоем пользовательского интерфейса.