Заполнить DropDownList внутри столбца шаблона сетки

У меня есть выпадающий список внутри столбца шаблона на сетке. В настоящее время я заполняю раскрывающийся список при загрузке страницы с помощью 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 каждый раз равен нулю. Я пробовал множество способов получить это, и по какой-то причине не могу этого понять. Возможно, другой набор глаз или другие идеи могут помочь мне. Пожалуйста, дайте мне знать, что я делаю неправильно. Спасибо заранее

ОБНОВЛЕНИЕ: КОД ДАННЫХ О СОБЫТИИ

<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, потому что я не вижу другого способа вызвать событие привязки данных.

2 ответа

Я действительно ничего не знаю о obout элементы управления, но я должен предположить, что они действуют очень похоже на элементы управления asp.net и только что были расширены. Имея это в виду, я постараюсь ответить на ваш вопрос.

Ваш RowDataBound событие имеет несколько проблем с кодированием... например, я не уверен, почему вы определяете newDropDownList а затем пытается перезаписать его следующей строкой. Также похоже, что следующая строка возвращается 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 не работает

РЕДАКТИРОВАТЬ: изменил код для использования OboutDropDownList в DataBinding,

Вы можете найти множество примеров на базе знаний и примеров. Это должно помочь вам: http://www.obout.com/combobox/aspnet_integration_grid.aspx, http://www.obout.com/grid/aspnet_ajax_cascading_comboboxes.aspx

(они ссылаются на comboBox, но вы можете легко адаптировать их к ddl)

Другие вопросы по тегам