Мне удалось переопределить Boundfield, чтобы отобразить выпадающий список, если я поместил его в Gridview.ASP.NET Boundfield переопределен для поддержки Dropdownlist отсутствует одна окончательная функция
protected override void InitializeDataCell(DataControlFieldCell cell, DataControlRowState rowState)
{
Control child = null;
Control cellControl = null;
if ((((rowState & DataControlRowState.Edit) != DataControlRowState.Normal) && !this.ReadOnly)
|| ((rowState & DataControlRowState.Insert) != DataControlRowState.Normal))
{
// If data cell is in edit mode, create DropDownList editor for this cell
// and set data properties.
DropDownList box = new DropDownList();
box.Items.Add(DefaultValueText);
box.DataSource = this.GetDataSource();
box.DataMember = this.BusinessObjectName;
box.DataTextField = this.DataTextField;
box.DataValueField = this.DataValueField;
box.AppendDataBoundItems = true;
box.ToolTip = this.HeaderText;
cell.Controls.Add(box);
box.DataBind();
// if in edit mode, prepare dropdown for binding
if ((this.DataField.Length != 0) && ((rowState & DataControlRowState.Edit) != DataControlRowState.Normal))
{
cellControl = box;
}
}
else if (this.DataField.Length != 0) // if in read only mode, prepare cell for binding
{
cellControl = cell;
}
if ((cellControl != null) && base.Visible)
{
cellControl.DataBinding += new EventHandler(this.OnDataBindField);
}
}
protected override void OnDataBindField(object sender, EventArgs e)
{
Control control = (Control)sender;
Control namingContainer = control.NamingContainer;
object dataValue = this.GetValue(namingContainer);
bool encode = (this.SupportsHtmlEncode && this.HtmlEncode) && (control is TableCell);
string str = this.FormatDataValue(dataValue, encode);
if (control is TableCell)
{
if (str.Length == 0)
{
str = " ";
}
((TableCell)control).Text = str;
}
else
{
//If data cell is in edit mode, set selected value of DropDownList
if (dataValue != null)
{
DropDownList dropDownList = (DropDownList) control;
ListItem itm = dropDownList.Items.FindByText(dataValue.ToString());
if (itm != null)
{
dropDownList.Text = itm.Value;
}
else
((DropDownList)control).Text = DefaultValueText;
}
}
}
Последняя особенность, которую я добавил это значение по умолчанию/дополнительный элемент для отображения, если ничего не было выбрано, как «выберите», например. Я могу установить это через свойство DefaultValueText в событии OnDataBind.
Теперь вот проблема я столкнулся:
В InitializeDataCell, если я изложу
box.AppendDataBoundItems = true;
и называют
box.DataBind();
DropDownList имеет все элементы, плюс дополнительные по умолчанию пункт. Он также прекрасно работает в событии OnDataBind, где теперь я могу выбрать значение по умолчанию, если элемент привязки данных не содержит значения.
Но когда DropDownList отображается в GridView, он содержит значение по умолчанию плюс все от источника данных ДВАЖДЫ, потому что я установил AppendDataBoundItems = TRUE, что приводит к ниспадающее меню, чтобы не ясно, что это элементы при добавлении пунктов gridview должен вызывать двойную привязку дважды, но она регистрируется только один раз в методе события OnDataBind. Я вижу только один звонок там, и в этот момент все в порядке, выпадающий список содержит элемент по умолчанию плюс один из каждого элемента из источника данных.
Любые предложения, где и как я могу обрабатывать привязку данных, чтобы иметь полный контроль над привязкой данных?
Единственный способ я вижу, чтобы повлиять на привязку данных является привязка обработчика события к DropDownList.DataBind ING. И это называется только один раз (из того, что я вижу в режиме отладки), так кто же копирует элементы во второй раз? Методы getModes(), связанные с выпадающим списком, получают количество обращений, эквивалентное количеству строк, которые у меня есть (один раз для каждого инициализированного списка выпадающего списка). Может ли это быть из вида? Думаю, я мог бы попытаться отключить это, если возможно –