Есть количество вариантов привязки данных вложенных co ntrols в шаблонах GridView.
Самый простой и тот, который я использую, когда могу, - использовать ObjectDataSource и привязать к нему свой раскрывающийся список.
Если это не вариант, вы можете связать его в событии RowDataBound.example on 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. Когда все сводится к этому, мне нравится последний способ, когда я не могу использовать ObjectDataSource, но я также должен кодировать уровень принятия решений другими разработчиками. : D
правила я обычно придерживаться:
- Использование ObjectDataSource, когда это быстро и легко
- Использование GridView RowDataBound, когда элементы вложенного элемента управления зависят от других значений в GridView
- Используйте OnInit, если вы просто привязываете данные, имея в виду, что вы не можете получить доступ к другим элементам управления при запуске этого метода (например, GridView еще не был инициализирован)
Надеюсь, что это поможет, я столкнулся с таким же разочарованием в связи с отсутствием примеров MSID GridView.
@Jim Schubert см. Мой ответ выше, это именно то, для чего используется метод OnDataBinding, я бы не рекомендовал использовать OnInit. Использование «RowDataBound» на мой взгляд не очень хорошо, потому что оно не локализует код для самого элемента управления. Я думаю, что большинство людей делают это с помощью 'RowDataBound', потому что мало кто понимает, как использовать' OnDataBinding'. – Kelsey
@ Kelsey, это справедливый аргумент, но OnDataBinding предполагает, что источник данных уже предоставлен, и 'DataBind' уже вызван. Выполняя свою привязку в этом методе, не сдвигает ли он * поток событий управления? Из MSDN: «Этот метод уведомляет серверный элемент управления о выполнении любой логики привязки данных, связанных с ним». Данные привязки в этом случае инкапсулируют связь, привязку и логику для элемента управления. –
Кроме того, из MSDN относительно Control.Init: 'Контроллеры сервера должны выполнять любые шаги инициализации, необходимые для создания и настройки экземпляра.' Я думаю, что конечная точка заключается в том, что вы можете привязать элемент управления практически в любом месте. –