2012-08-31 1 views
3

J'ai un datatable (.Net) avec plusieurs colonnes. Une des colonnes indique que RollNo est de type chaîne mais contient des données numériques. Par exemple. 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14. J'essaie de faire un tri en utilisant ce qui suit:Tri d'une colonne particulière de type chaîne de caractères contenant des données numériques

string sql = 
    "Select StudentID, RollNo, AdmissionID,(FirstName + Space(1) + Isnull(MiddleName,'') + Space(1) + Isnull(LastName,'')) as Name," + 
    " PermState as State from Students where ClassId = '" + ddlClass.SelectedValue + "'" + 
    " order by RollNo"; 

DataTable dt = bl.GetDataSet(sql);  
dt.DefaultView.Sort = "RollNo"; 

Mais après triage j'obtenir le résultat en tant que 1, 10, 11, 12, 13, 14, 2, 3, 4, 5, 6, 7, 8 , 9.

Comment le résoudre?

Répondre

7

Vous pouvez utiliser Linq-To-DataSet et jeter le string à int: que vous pouvez omettre le CopyToDataTable si vous ne

DataTable ordered = dt.AsEnumerable() 
         .OrderBy(r => int.Parse(r.Field<String>("RollNo"))) 
         .CopyToDataTable(); 

Vous devez ajouter une référence à System.Data.DataSetExtensions.dll et using System.Linq;

Remarque besoin, je l'ai montré juste pour montrer comment obtenir un DataTable du IEnumerable<DataRow>.

+0

Fantastique! Tim, Merci pour votre soutien. Mais que se passe-t-il si le champ RollNo contient également des données alphanumériques et numériques? – Mahbub

+0

Cela dépend du format. En général, 'Regex' est votre ami. Vous pouvez utiliser n'importe quel type de code dans Linq. –

+0

Pouvez-vous s'il vous plaît fournir un exemple de code pour cela? – Mahbub

1

Ne le faites pas si votre base de données est grande. Vous devez soit faire une conversion "chaîne en numérique" dans votre instruction SQL (ce qui signifie sur le serveur DB), ce qui est coûteux, ou avoir à lire toute la table en mémoire et faire ce genre là qui est également coûteux.

Je créer un nouveau champ numérique (colonne) et effectuer cette conversion une fois en tant que processus par lots.

0
 DataTable dt = GetData(); 
     dt.Columns.Add("RollNo1", typeof(Int32)); 
     foreach (DataRow item in dt.Rows) 
     { 
      item["RollNo1"] = item["RollNo"]; 
     } 
     dt.DefaultView.Sort = "RollNo1"; 
     dt.Columns.Remove("RollNo"); 
     dataGridView1.DataSource = dt; 
Questions connexes