2014-10-29 2 views
1

У меня есть DataGrid (назначение) с CountryId колонком, это переплетено в DropDownList, чтобы просмотреть страны. У меня есть страны и countryGroups таблицы тоже, где countries.countryGroupId = countryGroups.countryGroupId. Список должен быть отформатирован поэтому я использую SqlDataSource, чтобы получить форматированный список:Заменить SqlDataSource с EntityDataSource

SELECT c.countryID, cg.countryGroupName+': '+c.CountryName as Name 
FROM  countries AS c INNER JOIN 
     countries_groups AS cg ON c.countryGroupID = cg.countryGroupID 
ORDER BY cg.Sort, c.CountryName 

вот DropDownList изначально переплетен в SqlDataSource:

<asp:DropDownList ID="ddlCountryID" runat="server" Width="160px" DataSourceID="dsCountries" 
    AppendDataBoundItems="true" DataTextField="Name" DataValueField="countryID" 
    SelectedValue='<%# Bind("countryID") %>'> 
    <asp:ListItem Value="" Text="Select"></asp:ListItem> 
</asp:DropDownList> 

Я хотел бы заменить SqlDataSource на EntityDataSource для страны поле. Я создал следующий ProductionModel

ProductionModel.edmx

VS2010 был создан разделяемым классу публичной ProductionEntities: ObjectContext ...
Я создал EntityDataSource:

<asp:EntityDataSource ID="EntityDataSource1" runat="server" 
    ConnectionString="name=ProductionEntities" 
    DefaultContainerName="ProductionEntities" EntitySetName="countries" 
    Include="" 
    onquerycreated="EntityDataSource1_QueryCreated" 
    ContextTypeName="ASPWebApp.Datasource.ProductionEntities"> 

Мой вопрос, Какие еще шаги необходимы для окончательного связывания с EntityDataSource?
Заранее благодарим!

UPDATE: Решение стало быть следующим (благодаря @Gaurav Jain)

protected void ddlCountryID_OnInit(object sender, EventArgs e) { 
    DropDownList ddlCountryID = sender as DropDownList; 
    ddlCountryID.DataSource = (from c in db.suppliers_countries 
          join cg in db.suppliers_countries_groups on c.countryGroupID equals cg.countryGroupID 
          orderby cg.Sort, c.CountryName 
          select new { 
            c.countryID, 
            Name = cg.countryGroupName + ": " + c.CountryName 
          }); 
} 

и DropDownList стал быть:

<asp:DropDownList ID="ddlCountryID" runat="server" Width="160px" AppendDataBoundItems="true" 
        SelectedValue='<%# Bind("countryID") %>' **OnInit="ddlCountryID_OnInit"** 
        DataTextField="Name" DataValueField="countryID"> 
        <asp:ListItem Value="" Text="Select"></asp:ListItem> 
</asp:DropDownList> 
+0

Похоже, все сделано (только я не вижу строку подключения в web.config). Для повышения производительности я могу посоветовать использовать хранимую процедуру вместо запроса Sql. –

+0

Обязательно ли использовать веб-формы? Почему бы вам не использовать html select с помощью Knockjout.Js + WebApi? –

+0

Нет, это еще не все. Он пропускает JOIN от entitydatasource, между странами и странами_группами. Это основная незавершенность. Да, обязательным является использование веб-форм. Я хотел бы иметь бизнес-логику на стороне сервера вместо javascript. – Franziee

ответ

2

вы можете использовать этот запрос.

 ProductionEntities db = new ProductionEntities(); 
     ddlCountryID.DataSource = (from c in db.countries 
            join cg in db.countries_groups on c.countryGroupID  
            equals cg.countryGroupID 
            select new 
            { c.countryID, 
            Name = cg.countryGroupName + " " + c.CountryName,cg.Sort}) 
            .OrderBy(w => new {w.countryID,w.sort });  
     ddlCountryID.DataTextField = "Name"; 
     ddlCountryID.DataValueField = "countryID"; 
     ddlCountryID.DataBind(); 
+0

Я только что изменил код, и это решит проблему. –

+0

Где я должен поместить этот код в snipet? Например, Form_Load? – Franziee

+0

привяжите вид сетки во время page_load. и после этого вставьте этот код в это. –

Смежные вопросы