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

1

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

Теги:
gridview
rowdatabound
obout

2 ответа

1

Я ничего не знаю об 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.

  • 0
    Моя проблема заключается в том, что мне нужно получить значение из 1-го столбца, чтобы заполнить раскрывающийся список только разрешенными элементами списка. Как бы я мог получить значения при выполнении DataBinding?
  • 1
    @Alex Очень просто, во время события DataBinding вы можете просто сделать Eval чтобы получить значение из данных текущей строки, которые вы связываете. Пример: string yourColumnValue = Eval("YourColumnName").ToString()
Показать ещё 6 комментариев
0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню