В шаблонах GridView есть несколько вариантов привязки данных к вложенным элементам управления.
Самый простой и единственный способ, которым я могу воспользоваться, - это использовать ObjectDataSource и связать вашивыпадающий список к этому.
Если это не вариант, то вы можете привязать событие RowDataBound.Пример на MSDN отсутствует, но если вы последуете этому примеру (C #) и там, где он говорит:
// Display the company name in italics.
e.Row.Cells[1].Text = "<i>" + e.Row.Cells[1].Text + "</i>";
У вас будет что-то вроде:
DropDownList ddlWhatever = e.Row.FindControl("ddlWhatever") as DropDownList;
if(ddlWhatever != null) { /* bind data to it and call ddlWhatever.DataBind(); */ }
Поскольку EditItemTemplate и InsertItemTemplate не отображаются одновременно, я обычно сохраняю имена элементов управления одинаковыми в каждом шаблоне, чтобы упростить событие привязки к базе данных в коде.Но ничто не мешает вам иметь ddlEditItems
и ddlInsertItems
и связывать их по-разному в событии с привязкой к данным.
Еще один прием, который я использовал ранее, - это привязка к DropDownList с помощью события OnInit объектападать.Например:
// web form
<asp:DropDownList id="ddlWhatever" AutoPostBack="True"
runat="server" OnInit="ddlWhatever_Init">
// Code behind
protected void ddlWhatever_Init(object s, EventArgs a)
{
object[] years = {
new { Year = 2009 }, new { Year = 2010 }
};
ddlWhatever.DataSource = years;
ddlWhatever.DataTextField = "Year";
ddlWhatever.DataValueField = "Year";
ddlWhatever.DataBind();
}
Некоторые люди говорили мне не делать этого последним способом (т.е. элемент управления не должен отвечать за привязку).Я не согласен и не помню, чтобы видел что-либо связанное с этим утверждением в Руководстве по разработке Microsoft Framework.Когда все сводится к этому, мне нравится последний способ, когда я не могу использовать ObjectDataSource, но мне также приходится кодировать до уровня приемлемости других разработчиков.: D
Правила, которые я обычно придерживаюсь:
- Используйте ObjectDataSource, когда это быстро и просто
- Используйте GridView RowDataBound, когда элементы вложенного элемента управления зависят от других значенийв GridView
- Используйте метод OnInit, если вы просто привязываете данные, помня, что вы не можете получить доступ к другим элементам управления, когда этот метод запущен (например, GridView, возможно, еще не был инициализирован)
Надеюсь, это поможет, я испытал подобное разочарование в связи с отсутствием в MSDN примеров GridView.