У меня есть DataTable с 3 столбцами: URL [string], Date [DateTime], DestinationFile [string]
Используя метод, я подключаюсь к Интернету и заполняю первые два столбца (URL, Дата) со списком URL-адресов и датой их загрузки
Используя другой метод, мне нужно заполнить третий столбец (DestinationFile) строковым массивом, включающим конкретный путь для каждого файла. Строковый массив имеет тот же размер, что и количество строк DataTable.
Можно ли заполнить третий столбец DataTable массивом строк (в данном случае, но может быть любого типа)?
Там нет никакого способа сделать это непосредственно в один шаг, так что вам придется изменить значения вручную в цикле, используя Ряды коллекцию DataTable и индексатор имущества в DataRow:
DataTable dt = ...
String[] destinationFiles = ...
Int32 destinationFileColumnIndex = 2;
if (dt.Rows.Count != destinationFiles.Length)
throw new Exception("Lengthes are inconsistent");
for (int i = 0; i < destinationFiles.Length; i++)
{
dt.Rows[i][destinationFileColumnIndex] = destinationFiles[i];
}
Если destinationFiles
имеет тип, отличный от String
, то необходимо изменить либо столбец DataTable, чтобы иметь соответствующий тип, либо вам нужно преобразовать значения этого типа в строку.
Чтобы достичь этого, вы должны либо вызвать .ToString()
, если он правильно реализован:
SomeType[] destinationFiles = ...
// ...
dt.Rows[i][destinationFileColumnIndex] = destinationFiles[i].ToString();
или вручную сформировать строку для установки:
SomeType cur = destinationFiles[i];
dt.Rows[i][destinationFileColumnIndex] = String.Format("{0} and {1}",
cur.Prop1,
cur.Prop2);
РЕДАКТИРОВАТЬ:
Прямой метод, к сожалению, отсутствует, но существует такая вещь, как методы расширения:
public static class DataColumnExtensions
{
// Will work with both the arrays and lists
public static void SetValues<T>(this DataColumn column, IList<T> values)
{
if (column == null)
throw new ArgumentNullException("column");
if (values== null)
throw new ArgumentNullException("values");
DataTable dt = column.Table;
if (dt.Rows.Count != values.Count)
throw new Exception("Lengths are inconsistent");
for (int i = 0; i < values.Count; i++)
{
dt.Rows[i][column] = values[i];
}
}
}
и используйте его так:
dt.Columns[2].SetValues(new String[] {....});
Просто поместите его в то же пространство имен, что и ваш код, или, как лучше, поместите его в какое-то подходящее пространство имен и сделайте using AppropriatelyNamedNamespace;
только когда вам это нужно.