У меня есть раскрывающийся список внутри столбца шаблона в сетке obout. В настоящее время я заполняю выпадающий список при загрузке страницы с помощью sqldatasource. Однако теперь мне нужно загрузить выпадающий список, зависящий от значения определенного столбца. Например: Если status = 1, я закрою раскрывающийся список списком доступных параметров, относящихся к статусу 1.
<obout:Column ID="colStatus" DataField="wf_status_id" Align="center" HeaderText="Status" HeaderAlign="center" Width="130px" Wrap="true" runat="server" AllowGroupBy="true" AllowFilter="true">
<TemplateSettings EditTemplateId="tmpStatusIDEdit" TemplateId="tmpStatusID" />
</obout:Column>
<obout:GridTemplate runat="server" ID="tmpStatusID" >
<Template>
<%# Container.DataItem["Status"]%>
</Template>
</obout:GridTemplate>
<obout:GridTemplate runat="server" ID="tmpStatusIDEdit" ControlID="ddlStatus" ControlPropertyName="value">
<Template>
<obout:OboutDropDownList runat="server" ID="ddlStatus" Width="100%" Height="200" MenuWidth="215" DataSourceID="sdsStatus" DataTextField="wf_status_text" DataValueField="wf_status_id" />
</Template>
</obout:GridTemplate>
public void OnGridRowDataBound(object sender, Obout.Grid.GridRowEventArgs e)
{
if (e.Row.RowType == Obout.Grid.GridRowType.DataRow)
{
DropDownList ddlStatus = new DropDownList();
ddlStatus = (DropDownList)e.Row.FindControl("ddlStatus");
//LOAD DROP DOWN HERE//
}
}
Когда я пытаюсь выполнить этот код, он показывает, что ddlStatus имеет значение null каждый раз. Я попробовал множество способов получить это и по какой-то причине не могу получить его. Возможно, мне может помочь другой набор глаз или других идей. Пожалуйста, дайте мне знать, что я делаю неправильно. Спасибо вам заранее
ОБНОВЛЕНИЕ: КОД ДАННОГО СОБЫТИЯ
<obout:OboutDropDownList runat="server" ID="ddlStatus" Width="100%" Height="200" MenuWidth="215" OnDataBinding="ddlStatus_DataBinding" DataSourceID="sdsStatus" DataTextField="wf_status_text" DataValueField="wf_status_id" />
protected void ddlStatus_DataBinding(object sender, EventArgs e)
{
Obout.Interface.OboutDropDownList ddl = (Obout.Interface.OboutDropDownList)(sender);
string statusID = Eval("wf_status_id").ToString();
}
Я добавил DataSource, потому что не вижу другого способа запуска события привязки данных.
Я ничего не знаю об obout
управления, но я должен предположить, что они очень похожи на элементы управления asp.net и только что были расширены. Учитывая это предположение, я постараюсь ответить на ваш вопрос.
В вашем событии RowDataBound
есть несколько проблем с кодированием... например, я не уверен, почему вы определяете new
DropDownList
а затем пытаетесь перезаписать его следующей строкой. Также звучит так, что следующая строка все равно возвращает null
.
Прежде всего, я предлагаю не использовать событие DataBound
на уровне строки. Используйте событие управления DataBinding
поскольку оно значительно улучшит локализацию кода, потому что вы можете отключить конкретный элемент управления DataBinding
и, следовательно, не искать его. Если ваш код изменяется (разметка или кодовое слово), это также намного легче изменить, поскольку это не повлияет на другие вещи, и есть меньше возможностей для введения ошибок.
Поэтому я бы сделал следующие изменения, чтобы решить эту проблему:
Измените определение DropDownList
для реализации DataBinding
:
<obout:OboutDropDownList runat="server" ID="ddlStatus" Width="100%" Height="200"
MenuWidth="215" OnDataBinding="ddlStatus_DataBinding" />
Затем выполните событие OnDataBinding
(избавьтесь от своего события DataBound
если вы не использовали его ни для чего другого):
protected void ddlStatus_DataBinding(object sender, System.EventArgs e)
{
// This will point to ddlStatus on the current row that is DataBinding so you
// don't have to search for it.
OboutDropDownList ddl = (OboutDropDownList)(sender);
// Now you can fill the DropDownList and set the default value how ever you like
...
}
Вы также можете увидеть этот другой вопрос, на который я ответил, давным-давно, чтобы узнать, помогает ли он, поскольку он делает то же самое, но с Repeater
но это почти то же самое, что и сетка:
Заполнение DropDownList внутри Repeater не работает
EDIT: Изменен код для использования OboutDropDownList
в DataBinding
.
вы можете найти множество образцов на базе знаний и примерах. Они должны помочь вам: http://www.obout.com/combobox/aspnet_integration_grid.aspx, http://www.obout.com/grid/aspnet_ajax_cascading_comboboxes.aspx
(они относятся к comboBox, но вы можете легко адаптировать их к ddl)
DataBinding
вы можете просто сделатьEval
чтобы получить значение из данных текущей строки, которые вы связываете. Пример:string yourColumnValue = Eval("YourColumnName").ToString()