| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Разработка под ASP.NET > GridView и TemplateField |
| Автор: Pankon 3.7.2008, 15:38 | ||
Не работает строчка string col2Value = Bind("Col_2");. Как получить для переменной col2Value значение ячейки? |
| Автор: Bogdan1024 3.7.2008, 21:36 | ||
GridView, DetailsView и FormView - единственные элементы управления, где можно использовать Bind. Теоретически нужно ругнуться и на
Попробуй использовать Eval или Container.чтототам. Что вообще должен делать сей код? |
| Автор: Idsa 3.7.2008, 21:45 |
Должен динамически формировать template на основании значений свойств. У меня вообще большие сомнения по поводу того, можно ли вставлять код в template... |
| Автор: Idsa 5.7.2008, 12:20 | ||||||||||||||
| Pankon, вставлять inline код в темплейт нельзя. Есть 2 выхода. 1. Воспользоваться вспомогательным методом.
Свойство Text элемента Label теперь динамически формируется на основании значения Eval("Column1"). Стоит обратить внимание на то, что возвращаемое методом значение в любом случае интерпретируется как строка. Т. е. если бы метод возвращал, например, TextBox, выражение <%# this.MethodWhichReturnsTextBox() %> вернуло бы строку "System.Web.UI.WebControls.TextBox". В результате GridView состоял бы не из элементов TextBox, а из малосодержательных надписей. Это чем-то напоминает WinForms'овские ListBox и ComboBox. Там тоже в Items можно хранить любые объекты, но отображается object.ToString(). Весьма печальное зрелище. Слава Богу, на смену WinForms пришел WPF 2. Перехватить метод RowDataBound
Очевидно, этот метод гораздо более гибкий. Правда, есть недостаток - обращение к ячейкам и контролам по индексам: малейшее изменение разметки сделает этот обработчик нерабочим. С этим приходится мириться. Кстати, здесь есть еще одна интересная возможность. Можно вот так не паритсья:
, получая каждое значение по отдельности через Reflection. Можно просто привести тип e.Row.DataItem. В случае баиндинга таблицы тип будет DataRowView. Тогда можно обращаться вот так:
, не расходуя лишний раз процессорное время на Reflection. Хотя это не самый лучший пример. Гораздо более очевидным приведение e.Row.DataItem является при баиндинге коллекции пользовательских типов:
Все-все, закругляюсь P. S. Я изложил свои видение баиндинга к DataGridView. Если у кого-то есть дополнения, буду рад ознакомиться. |
| Автор: Pankon 7.7.2008, 17:45 | ||
Протестируйте такой код....
|
| Автор: Idsa 7.7.2008, 18:33 | ||
| Pankon, во как! Что-то я погорячился. Спасибо за поправку. +1. Вам стоит посетить вот http://forum.vingrad.ru/forum/topic-219046.html тему. Там есть несколько постов о том, что писать, используя <% , плохо (особенно в темплейтах). Подобную логику все-таки лучше реализовать в RowDataBound. А в тему того, почему не работает код в первом посте... Дело в том, что <% выполняется на этапе рендеринга. Баиндинг же происходит раньше. Поэтому неудивительно, что вот такой код:
вызывает InvalidOperationException с текстом "Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control.". Ну действительно, ведь Eval(string expression) - короткая запись DataBinding.Eval(object container, string expression)... а container определен только при binding'е. |