2008-12-01 5 views
0

У меня есть DataGrid, который выглядит следующим образом (немного упрощенным здесь):DataBound DropDownList в DataGrid - порядок связывания

<asp:DataGrid ID="grdQuotas" runat="server" AutoGenerateColumns="False"> 
    <HeaderStyle CssClass="quotas-header" /> 
    <Columns> 
     <asp:TemplateColumn> 
      <HeaderTemplate> 
       Max order level</HeaderTemplate> 
      <ItemTemplate> 
       <asp:DropDownList ID="ddlMaxOrderLevel" runat="server" DataSourceID="xdsOrderLevel" 
        DataTextField="Text" DataValueField="Value" SelectedValue='<%# Bind("MaxOrderLevel") %>'> 
       </asp:DropDownList> 
      </ItemTemplate> 
     </asp:TemplateColumn> 
    </Columns> 
</asp:DataGrid> 

<asp:XmlDataSource ID="xdsOrderLevel" runat="server" DataFile="~/App_Data/OrderLevels.xml"> 
</asp:XmlDataSource> 

В моем обработчике события Page_Load Я создаю DataTable, содержащие значения по умолчанию и DataBind ИНГ его DataGrid.

Проблема заключается в том, что это происходит до тогоDropDownListddlMaxOrderLevel была привязана к своему DataSource, так что я получаю сообщение об ошибке выполнения говорил мне, что SelectedValue не может быть установлен.

Если ddlMaxOrderLevel не в DataGrid я мог бы просто позвонить DataBind() на него. Однако я не могу этого сделать в этом сценарии - так как он находится в ItemTemplate.

Может ли кто-нибудь предложить обходной или альтернативный подход?

ответ

0

Создать другой DataSource и привязать его к DataGrid. Если SelectMethod вернет значения по умолчанию в простой объект.

Тогда все обязательные условия должны радостно работать вместе.

1

Вы можете выполнить привязку данных к DropDownlist в событии Databound DataGrid.

Edit: Я дам вам пример того, что я испытал:

protected void dg_ItemDataBound(object sender, DataGridItemEventArgs e) 
    { 
     if (e.Item.ItemType != ListItemType.Header && e.Item.ItemType != ListItemType.Footer) 
     { 
      DropDownList dl = (DropDownList)((DataGridItem)e.Item).FindControl("ddlMaxOrderLevel"); 

      dl.DataSource = levels; 
      dl.DataBind(); 

      dl.SelectedValue = ((DataRowView)e.Item.DataItem)["number"].ToString(); 


     } 

    } 
+0

К сожалению, это не сработает по той же причине, что и в моем первоначальном вопросе: DropDownList находится внутри ItemTemplate, поэтому не существует как экземпляр элемента управления, с которым вы можете ссылаться –

+0

Но вы можете использовать DataGridItem.FindControl для поиска DDL по ID и DataGridItem.DataItem для получения «MaxOrderLevel». Затем вы можете установить выбранное значение списка с тем же свойством, которое вы получили в разметке. –

+0

Plz скажите мне, помогло ли это вам или если вы нашли лучший ответ – netadictos