Вы также можете использовать linq и анонимные типы для достижения того же результата с гораздо меньшим количеством кода, как описано здесь .
ОБНОВЛЕНИЕ: блог закрыт, вот содержание:
(..) Значения, показанные в таблице, представляют длину строк вместо строковых значений (!)
Это может показаться странным, но именно так механизм связывания работает по умолчанию - при наличии объекта он будет пытаться привязаться к первому свойству этого объекта (первое свойство, которое он может найти).
Когда передается экземпляр класса String, свойство, с которым он связан, является String.Length, поскольку нет другого свойства, которое обеспечивало бы саму строку.
Это означает, что для правильного связывания нам необходим объект-обертка, который будет представлять фактическое значение строки как свойство:
public class StringWrapper
{
string stringValue;
public string StringValue { get { return stringValue; } set { stringValue = value; } }
public StringWrapper(string s)
{
StringValue = s;
}
}
List<StringWrapper> testData = new List<StringWrapper>();
// add data to the list / convert list of strings to list of string wrappers
Table1.SetDataBinding(testdata);
Хотя это решение работает должным образом, оно требует довольно много строк кода (в основном для преобразования списка строк в список упаковщиков строк).
Мы можем улучшить это решение, используя LINQ и анонимные типы. Мы будем использовать запрос LINQ для создания нового списка упаковщиков строк (в нашем случае это будет анонимный тип строки).
var values = from data in testData select new { Value = data };
Table1.SetDataBinding(values.ToList());
Последнее изменение, которое мы собираемся сделать, - это переместить код LINQ в метод расширения:
public static class StringExtensions
{
public static IEnumerable CreateStringWrapperForBinding(this IEnumerable<string> strings)
{
var values = from data in strings
select new { Value = data };
return values.ToList();
}
Таким образом, мы можем повторно использовать код, вызывая единственный метод для любой коллекции строк:
Table1.SetDataBinding(testData.CreateStringWrapperForBinding());