c#
  • asp.net
  • .net
  • sharepoint
  • 2012-10-01 13 views 14 likes 
    14

    Sto cercando di ottimizzare il codice per la web part SharePoint. Ho un controllo ripetitore:HashSet as DataSource

    <asp:Repeater ID="CountryOptionsRepeater" runat="server"> 
        <ItemTemplate> 
         <option value='<%#Eval("CountryName") %>'><%#Eval("CountryName") %></option> 
        </ItemTemplate> 
    </asp:Repeater> 
    

    sto riempiendolo con i dati-tavolo

    countriesList = countriesList.Distinct<String>().ToList<String>(); 
    countriesList.Sort(); 
    //var noDupsCountriesList = new HashSet<String>(countriesList); 
    
    DataTable dt = new DataTable(); 
    dt.Columns.Add("CountryName"); 
    
    foreach (String countryName in countriesList) 
    { 
        DataRow dr = dt.NewRow(); 
        dr["CountryName"] = countryName; 
        dt.Rows.Add(dr); 
    } 
    
    CountryOptionsRepeater.DataSource = dt; 
    CountryOptionsRepeater.DataBind(); 
    this.DataBind(); 
    

    Esiste un modo per legare direttamente HashSet oggetto (noDupsCountriesList) per DataSource con la stessa configurazione del ripetitore, al fine per ottenere l'ottimizzazione?

    Qualcosa di simile:

    //countriesList = countriesList.Distinct<String>().ToList<String>(); 
    //countriesList.Sort(); 
    var noDupsCountriesList = new HashSet<String>(countriesList); 
    
    CountryOptionsRepeater.DataMember = "CountryName"; // ?? 
    CountryOptionsRepeater.DataSource = noDupsCountriesList; 
    CountryOptionsRepeater.DataBind(); 
    this.DataBind(); 
    
    +0

    Perché è necessario DataTable o HashSet? 'CountryOptionsRepeater.DataSource = countriesList;' Non fare il trucco? – paul

    +0

    Potrebbe essere possibile eseguire il binding direttamente a 'HashSet <>', ma non ti darà i Paesi in ordine alfabetico, che dal tuo codice sembra essere necessario. – MiMo

    +1

    @MiMo, grazie aggiungerei l'istruzione 'OrderBy' (supponendo che' initializaiton + OrderBy' di HashSet sia molto più ottimizzato di Call List <> 's Distinct() + ToList() + Sort() ') .. – Annie

    risposta

    6

    penso che questa linea potrebbe sostituire il secondo blocco di codice:

    CountryOptionsRepeater.DataSource = 
        countriesList 
        .Distinct() 
        .OrderBy(c => c) 
        .Select(c => new { CountryName = c }) 
        .ToList(); 
    
    +1

    Si sta generando un errore: Impossibile trovare il nome della colonna 'CountryName'. Dovrei usare '' nel file ascx (dato che l'elenco non ha l'intestazione della colonna)? – Annie

    +1

    Il DataMember deve essere lasciato vuoto se si utilizza un tipo primitivo. DataMember ha lo scopo di specificare una proprietà sul tipo. – Shelakel

    Problemi correlati