możesz również użyć linq i typów anonimowych, aby osiągnąć ten sam wynik przy znacznie mniejszej ilości kodu, jak opisano tutaj .
AKTUALIZACJA: blog nie działa, oto treść:
(..) Wartości pokazane w tabeli reprezentują długość łańcuchów zamiast wartości łańcuchowych (!) Może się to wydawać dziwne, ale tak domyślnie działa mechanizm wiązania - dany obiekt będzie próbował dowiązać się do jego pierwszej właściwości obiekt (pierwsza właściwość, jaką może znaleźć). Po przekazaniu instancji klasa String jest powiązana z właściwością String.Length, ponieważ nie ma innej właściwości, która zapewniłaby sam ciąg.
Oznacza to, że aby uzyskać prawidłowe powiązanie, potrzebujemy obiektu opakowującego, który ujawni rzeczywistą wartość ciągu jako właściwość:
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);
Chociaż to rozwiązanie działa zgodnie z oczekiwaniami, wymaga kilku wierszy kodu (głównie do konwersji listy ciągów do listy opakowań ciągów).
Możemy ulepszyć to rozwiązanie za pomocą LINQ i typów anonimowych - użyjemy zapytania LINQ, aby utworzyć nową listę opakowań ciągów (w naszym przypadku opakowanie ciągu będzie typem anonimowym).
var values = from data in testData select new { Value = data };
Table1.SetDataBinding(values.ToList());
Ostatnią zmianą, jaką zamierzamy wprowadzić, jest przeniesienie kodu LINQ do metody rozszerzenia:
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();
}
W ten sposób możemy ponownie użyć kodu, wywołując pojedynczą metodę na dowolnej kolekcji ciągów:
Table1.SetDataBinding(testData.CreateStringWrapperForBinding());
DataPropertyName
Kolumny musi byćValue