Ви також можете використовувати типи 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>();
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());
DataPropertyName
Колони повинна бутиValue