Недавно я использовал как ASP.Net GridView Control, так и WinForms DataGridView для динамического отображения данных. В обоих случаях я использовал различные общие списки в качестве источника данных (List<T>
). Когда этот список представляет собой набор типов с определенными свойствами, эти элементы управления не имеют проблем с привязкой к именованному свойству, а в случае DataGridView свойства будут отображаться в виде заголовков, а значения для каждого свойства - в виде строк.
Однако, когда у меня есть коллекция строк или целых, например, эти элементы управления имеют проблемы с привязкой к значениям, содержащимся в списках. Я создаю свой элемент управления ASP GridView динамически, поэтому он не определен на странице, пока он не понадобится, поэтому я не думаю, что здесь будет работать выражение привязки, хотя я новичок в выражениях привязки, поэтому могу ошибаться:
GridView grid = new GridView();
grid.AutoGenerateColumns = false;
grid.CssClass = "summaryTable";
grid.Columns.Add(new TemplateField { HeaderText = "Error No.", ItemTemplate = new DataGridAutoNumber(grid) });
grid.Columns.Add(new BoundField { HeaderText = "Error Description", DataField="Value" });
grid.DataSource = validator.ValidationErrors;
grid.DataBind();
В приведенном выше примере validator.ValidationErrors представляет собой список строк. Чтобы GridView связывал строковые значения, мне пришлось обернуть их в созданный мной тип:
public class ValueItem<T>
{
T value;
public ValueItem(T valueIn) { value = valueIn; }
public T Value { get { return value; } }
}
Этот тип работает как для GridView, так и для DataGridView и позволяет мне создать List<ValueItem<T>>()
любого типа значения, чтобы я мог связать его с элементом управления типа Grid.
Теперь я что-то здесь упускаю или эти элементы управления просто не работают с коллекциями типов значений?
Извиняюсь за длинный вопрос!
P.S. В качестве примечания, если кто-нибудь знает, как создать столбец автономного номера в GridView в коде, а не в скрипте, пожалуйста, дайте мне знать. Мое решение было таким:
public class DataGridAutoNumber : ITemplate
{
GridView grid;
public DataGridAutoNumber(GridView gridIn) { grid = gridIn; }
#region ITemplate Members
public void InstantiateIn(Control container)
{
container.Controls.Add(new Label{ Text=(grid.Rows.Count+1).ToString()});
}
#endregion
}