8 messaggi dal 28 aprile 2005
go.to
Salve a tutti chissà se qualcuno riuscirà ad aiutarmi dopo aver posto lo stesso interrogativo su altri diversi forum specializzati in asp.net.

Sviluppando una web application mi è molto comodo un sistema di autosuggest (stile google). In rete ne ho trovato diversi tra cui mi sono imbattuto in uno molto carino all'indirizzo

http://www.codeproject.com/KB/ajax/AJAXAutoSuggest.aspx?msg=3470544#xx3470544xx

in cui è possibile definire un header con doppia colonna con dati prelevati da database SQL SERVER 2008.

In pratica il controllo risulta molto comodo e carino fino a quando integrandolo nella web application mi sono accorto che nel page_load vengono caricati tutti i dati e successivamente man mano che l'utente scrive vengono filtrati i dati. Il problema è che è impensabile come nel mio caso caricare 500000 record in partenza quindi volevo un consiglio su come modificare il controllo senza far caricare tutto il dataset in partenza. Ecco la porzione di codice significativa. Spero che finalmente qualcuno possa davvero aiutarmi a risolvere questo problema, grazie in anticipo

protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
CaricaDatiAnagrafica();
}
}

private DataTable _dtAnagrafiche
{
get { return (DataTable)Session["_dtAnagrafiche"]; }
set { Session["_dtAnagrafiche"] = value; }
}

private void CaricaDatiAnagrafica()
{
_dtAnagrafiche = new DataTable();
_dtAnagrafiche.Columns.Add(new DataColumn("NomeCognome", typeof(string)));
_dtAnagrafiche.Columns.Add(new DataColumn("CodiceAnagrafico", typeof(string)));

DataRow row = null;

SqlConnection conn = DataUtilityCore.BuildConnection.GetConn();
string Select = "SELECT * FROM ANAG_Anagrafiche";
SqlCommand Cmd = new SqlCommand(Select, conn);
conn.Open();
SqlDataReader ObjDR = Cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
while (ObjDR.Read())
{
row = _dtAnagrafiche.NewRow();
row["NomeCognome"] = ObjDR["NomeCognome"].ToString();
row["CodiceAnagrafico"] = ObjDR["CodiceAnagrafico"].ToString();
_dtAnagrafiche.Rows.Add(row);
}
ObjDR.Close();
conn.Close();
}

public void txtsearch_OnTextChanged(object source, Anthem.AutoSuggestEventArgs e)
{
DataView dv = new DataView(_dtAnagrafiche);
dv.RowFilter = string.Format("NomeCognome LIKE '%{0}%'", e.CurrentText);
txtsearch.DataSource = dv;
txtsearch.DataBind();
}
Modificato da terrix77 il 13 maggio 2010 12.13 -
Ciao, premetto che non conosco la soluzione in questione, in ogni caso mi sembra la tua una pessima scelta: invece di caricare tutto, puoi recuperare 10/15 risultati invocando una stored su quell'evento TextChanged.

Dal canto mio, comunque, ti consiglio di valutare soluzioni un po' più "standard" e comunemente utilizzate, per le quali esiste anche più supporto a livello di community. Un esempio? questo, basato su jQuery UI
http://jqueryui.com/demos/autocomplete/

m.
8 messaggi dal 28 aprile 2005
go.to
Grazie mille ho risolto stamane in questo modo e devo dire che va veramente molto molto bene. In pratica come giustamente hai suggerito ho agganciato la query con TOP 20 all'avento OnTextChanged in modo che vengano interrogati solo i primi risultati ordinati in modo decrescente. Chissà forse i guru potranno illustrami ulteriori ottimizzazioni, come ad esempio indicizzare la mia tabella tabella di 50000 o qualche altra finezza a livello di programmazione

public void txtsearch_OnTextChanged(object source, Anthem.AutoSuggestEventArgs e)
{
DataTable _dtAnagrafiche = new DataTable();
_dtAnagrafiche.Columns.Add(new DataColumn("Cliente", typeof(string)));
_dtAnagrafiche.Columns.Add(new DataColumn("CodiceFiscale", typeof(string)));

DataRow row = null;

SqlConnection conn = DataUtilityCore.BuildConnection.GetConn();
string Select = "SELECT TOP 20 ISNULL(Cognome,'') + ' ' + ISNULL(Nome,'') As Cliente, CodiceFiscale FROM V_COM_AnagraficaPersone WHERE Cognome LIKE '"+ e.CurrentText.ToString() +"%' ORDER BY Cognome DESC";
SqlCommand Cmd = new SqlCommand(Select, conn);
conn.Open();
SqlDataReader ObjDR = Cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
while (ObjDR.Read())
{
row = _dtAnagrafiche.NewRow();
row["Cliente"] = ObjDR["Cliente"].ToString();
row["CodiceFiscale"] = ObjDR["CodiceFiscale"].ToString();
_dtAnagrafiche.Rows.Add(row);
}
ObjDR.Close();
conn.Close();

DataView dv = new DataView(_dtAnagrafiche);
txtsearch.DataSource = dv;
txtsearch.DataBind();
}

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.