Андрей, твой файл скачал, но еще не смотрел.
Выкладываю немного дописанный файл DataTableSample.
Вот некоторые вырезки из кода:
Код: Выделить всё
#region Описание
/*
* Для добавления новой таблицы добавьте новый класс в проект BaseLibrary.
* Для добавления нового столбца добавьте новый параметр в необходимый
* класс проекта BaseLibrary, при этом уже имеющиеся данные останутся.
*/
#endregion
#region Метод запроса по определенному столбцу
/*
* Заполнение таблицы результата на запрос tableResult
* необходимо для вывода результата в форме поиска
* исключительно для наглядности. При отсутствии необходимости
* вывода результата для наглядности в виде таблицы, достаточно
* оставить только одну строку запроса такого формата:
* DataRow[] rows = table.Select("имя_столбца='значение'");
* либо, например, для вывода строк столбца 'Сила' со значением больше 10:
* DataRow[] rows = table.Select("Сила>10");
*/
public static DataTable Search(DataTable table, string parametr, string columnName)
{
//формируем запрос
string filter = string.Format("{0}='{1}'", columnName, parametr);
//объявляем новую таблицу для результата запроса
DataTable tableResult = new DataTable();
try
{
//выполняем запрос
var rows = table.Select(filter);
//заполняем таблицу результата столбцами
foreach (var column in rows[0].Table.Columns)
tableResult.Columns.Add(((DataColumn)column).ColumnName);
//заполняем таблицу результата строками
foreach (var row in rows)
{
DataRow r = tableResult.NewRow();
r.ItemArray = row.ItemArray;
tableResult.Rows.Add(r);
}
//возвращаем результат запроса в виде таблицы
return tableResult;
}
catch { return null; }
}
#endregion
#region Метод запроса по всем столбцам таблицы
public static DataTable Search(DataTable table, string parametr)
{
//создаем новую таблицу для результата запроса
DataTable tableResult = new DataTable();
//ЗАПОЛНЯЕМ СТОЛБЦЫ
//Выберите вариант заполнения
/*
// Вариант 1
// Заполнение с помощью List
List<DataColumn> columns = new List<DataColumn>();
columns.AddRange(table.Columns.Cast<DataColumn>());
tableResult.Columns.AddRange(columns.ToArray());
*/
/*
// Вариант 2
// Заполнение с помощью еще одного метода
var cols = (DataColumn[])table.Columns.Cast<DataColumn>().ToArray().Clone();
tableResult.Columns.AddRange(cols);
*/
// Вариант 3
// Заполнение с помощью цикла
foreach (var column in table.Columns)
tableResult.Columns.Add(((DataColumn)column).ColumnName);
//выполняем запрос по всем столбцам таблицы
foreach (var column in table.Columns)
{
try
{
var rows = (Search(table, parametr, ((DataColumn)column).ColumnName)).Rows;
for (int i =0;i<rows.Count;i++)
tableResult.Rows.Add(rows[I].ItemArray);
}
catch { continue; }
}
//возвращаем результат запроса в виде таблицы
return tableResult;
}
Как видно, для поиска значения в DataTable существует удобный метод Select, который возвращает массив строк DataRow[]. Теперь для изменения нужного нам параметра, достаточно написать:
rows[index]["параметр"] = значение;
Например, в таблице Planets нам надо изменить диаметр Земли, присвоив значение 1000. Скажем эта таблица принадлежит переменной table:
DataRow[] rows = table.Select("Имя='Земля'");
rows[0]["Диаметр"] = 1000;
А вот если, например, в таблице Planets нам надо изменить диаметр Земли, увеличив на 10, то число строк увеличится:
DataRow[] rows = table.Select("Имя='Земля'");
var value = (double)rows[0]["Диаметр"];
value += 10;
rows[0]["Диаметр"] = value;
Вот и все. А по поводу выборки из нескольких таблиц, напишу позже. Пора бежать...