23 messaggi dal 07 luglio 2004
Ciao a tutti,

ho un problema con l'ordinamento di numeri all'interno di una GridView.
Il datasource della griglia ha i campi interessati di tipo int pero' quando vado ad ordinarli mi viene fuori una cosa del genere

98767
98
967
89765
87
865555

Praticamente come se non riconoscesse il formato numerico.

Qualcuno potrebbe aiutarmi?

Grazie in anticipo :)

Andrea
72 messaggi dal 04 agosto 2008
Ciao Andrea,
effettivamente dovrebbe dipendere dal datasource e non dalla SortExpression. Se mandi un po' di codice magari si trova la magagna.
Potrebbe non dipendere da codice .NET; giusto come esempio, se ho:

<asp:GridView ID="GridView1" runat="server" AllowSorting="True"
AutoGenerateColumns="False" DataSourceID="SqlDataSource1">
<Columns>
<asp:BoundField DataField="StringaOIntero" HeaderText="StringaOIntero"
SortExpression="StringaOIntero" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:provaConnectionString %>"
SelectCommand="SELECT [StringaOIntero] FROM [Table_1]"></asp:SqlDataSource>

l'ordinamento segue il significato testuale o numerico in funzione del fatto che sulla tabella Table_1 di SQL Server il campo StringaOIntero sia di tipo nvarchar(50) o int. Ciò senza nessuna modifica sulla pagina aspx.

Ciao
Salvo
23 messaggi dal 07 luglio 2004
Ciao Salvo,

grazie per la risposta.....
Allora ti metto unpo di codice e ti spiego un po la cosa.... :)
Intanto mi ricavo i dati da una query fatta su DB2 dove il dato è di tipo INT, e mi riempio un dataset che mi ritorna da questa funzione, dove a scanso di equivoci "acsto" il dato che mi interessa con int.parse (DIFRETR è il campo che mi interessa:

/**********************************************
try
{
using (cmd = new OleDbCommand(sSQL2 + Where, conn))
{
OleDbDataReader oReader = null;
conn.Open();
oReader = cmd.ExecuteReader();
Cumuli oCumuli2;

if (oReader.HasRows == true)
{
while (oReader.Read())
{
oCumuli2 = new Cumuli();
oCumuli2.NTOTDM10 = int.Parse((string)oReader["NTOTDM10"].ToString());
oCumuli2.NRTOTCI = int.Parse((string)oReader["NRTOTCI"].ToString());
oCumuli2.DIFRETR = int.Parse((string)oReader["DIFRETR"].ToString());
oCumuli2.DIFIVS = int.Parse((string)oReader["DIFIVS"].ToString());oCumuli2.ITOTDM10 = long.Parse((string)oReader["ITOTDM10"].ToString()) cumuli.Add(oCumuli2);
}
}
}
}
catch {
.................
}
/**********************************************

Nella classe ho il seguente codice per il sort della colonna contenente quel dato:

/***********************************************
try
{
if (dt != null)
{
DataView dv = new DataView(dt);

if (_SortDirection.Equals("ASC"))
{
_SortDirection = "DESC";
}
else
{
_SortDirection = "ASC";
}

dv.Sort ="DIFRETR",_SortDirection;
DTG_Griglia.DataSource = dv;
DTG_Griglia.DataBind();

ViewState["_Direction_"] = _SortDirection;
ViewState["_Campo_"] = "DIFRETR";
}
}
catch (Exception ex)
{}
/***********************************************



Spero sia tutto chiaro.....a grandi linee ovviamente :)

Andrea
72 messaggi dal 04 agosto 2008
Ciao Andrea,
sospettavo che il mio esempio fosse troppo banale...

Ho provato a ricreare una situazione simile a quella del codice che hai postato e il problema potrebbe essere quello della mancata dichiarazione del tipo della colonna nel datatable; questo pezzo di codice però non c'è per cui ti riporto ancora i frammenti del mio:

DataTable myDataTable = new DataTable();

Se aggiungo una colonna dichiarando il tipo:
myDataTable.Columns.Add("StringaOIntero", typeof(int));

quando aggiungo il rigo alla tabella:
myDataTable.Rows.Add(int.Parse(myReader[0].ToString()));

l'ordinamento del DataView funziona correttamente.

Se, invece, aggiungo la colonna senza dichiarare il tipo:
myDataTable.Columns.Add("StringaOIntero");

anche se aggiungo il rigo eseguendo il cast come prima:
myDataTable.Rows.Add(int.Parse(myReader[0].ToString()));

l'ordinamento del DataView avviene come se si trattasse di stringhe.

Ti riporto in calce il frammento di codice.
Spero che questo ti aiuti a trovare la soluzione.
Ciao
Salvo

DataTable myDataTable = new DataTable();
//così funziona
//myDataTable.Columns.Add("StringaOIntero", typeof(int));
//così, ovviamente no
//myDataTable.Columns.Add("StringaOIntero", typeof(string));
//ma così neanche - come se fosse typeof(string)
myDataTable.Columns.Add("StringaOIntero");

SqlConnection myConnection = new SqlConnection();
myConnection.ConnectionString = ConfigurationManager.ConnectionStrings["provaConnectionString2"].ToString();

string sqlString = "SELECT [StringaOIntero] FROM [Table_1]";
SqlCommand comandoSql = new SqlCommand(sqlString, myConnection);

try
{
myConnection.Open();
SqlDataReader myReader = comandoSql.ExecuteReader(CommandBehavior.CloseConnection);
if (myReader.HasRows)
{
while (myReader.Read())
{
//myDataTable.Rows.Add(int.Parse(myReader[0].ToString()));
//myDataTable.Rows.Add(myReader[0].ToString());
myDataTable.Rows.Add(int.Parse(myReader[0].ToString()));

}
}
}
catch (Exception exe)
{
//Console.WriteLine(exe.Message + " - " + sqlString);
}
finally
{
myConnection.Close();
}

DataView myDataView = new DataView(myDataTable);

myDataView.Sort = ordine;
23 messaggi dal 07 luglio 2004
Ciao Salvo,

non so come ringraziarti :)
Il tuo post ha risolto i miei problemi :)

Grazie mille e buona giornata,

Andrea

Andrea

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.