Недавно я использовал динамический интерфейс ASP.Net GridView и WinForms DataGridView для динамического отображения данных. В обоих случаях я использовал разные обобщенные списки в качестве источника данных (List<T>
). Когда этот список используется в виде набора типов с определенными свойствами, эти элементы управления не имеют проблем с привязкой к именованному свойству, а в случае DataGridView будут отображаться свойства как заголовки со значениями для каждого свойства в виде строк.Значения привязки привязки в элементах управления сетью C#
Однако, если у меня есть набор строк или ints, эти элементы управления имеют проблемы с привязкой к значениям, содержащимся в списках. Я создаю свой элемент управления 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>>()
любого типа значения, так что я может привязать его к элементу управления сеткой.
Теперь я что-то упустил или эти элементы управления просто не работают с коллекциями типов значений?
Извинения за длинный вопрос!
P.S. В качестве побочной заметки, если кто-нибудь знает, как создать столбец autonumber в 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
}
Хмммы ... Мое первоначальное решение кажется более элегантным и многоразовым, не слишком заинтересованы в строке контрольный идентификатор. Спасибо за ваш ответ! – James