2017-07-08 1 views
1

lorsque je l'exécute pour filtrer mon fichier xml, il renvoie toutes les lignes, même celles qui sont supérieures au montant donné.Le filtre de ligne de la grille de données renvoie moins de

DataSet ds = new DataSet(); 



ds.ReadXml("Database.xml"); 

string filter = ""; 
filter = "Dayvisited <= '20'"; 

DataView dv = new DataView(ds.Tables[0]); 
dv.RowFilter = filter; 
dataGridView2.DataSource = dv; 
dataGridView2.Columns[4].Visible = false; 

ceci est mon xml

<root> 
    <place> 
    <Name /> 
    <Location /> 
    <Info /> 
    <Dayvisited /> 
    <userdata /> 
    </place> 
    <place> 
    <Name>home</Name> 
    <Location>x-292 z 277</Location> 
    <Info>home</Info> 
    <Dayvisited>100</Dayvisited> 
    <userdata>u</userdata> 
    </place> 
    <place> 
    <Name>base</Name> 
    <Location>x868 z986</Location> 
    <Info>stuff</Info> 
    <Dayvisited>20</Dayvisited> 
    <userdata>u</userdata> 
    </place> 
    <place> 
    <Name>town</Name> 
    <Location>x 990 z-2485</Location> 
    <Info>gas station</Info> 
    <Dayvisited>12</Dayvisited> 
    <userdata>u</userdata> 
    </place> 
    <place> 
    <Name>crossing</Name> 
    <Location>x 90 z-2998</Location> 
    <Info>working stiff</Info> 
    <Dayvisited>11</Dayvisited> 
    <userdata>u</userdata> 
    </place> 
    <place> 
    <Name>home</Name> 
    <Location>x-280 z 277</Location> 
    <Info>home and more stuff</Info> 
    <Dayvisited>125</Dayvisited> 
    <userdata>u</userdata> 
    </place> 
</root> 

comment puis-je faire revenir seulement ceux qui ont Dayvisited moins de 20 à la grille de données ?. Je pensais que l'utilisation de la zone de texte pour la valeur était déroutant quelque chose, donc je l'ai changé pour simplement utiliser 20 et il le fait encore et je ne sais pas pourquoi.

comment j'ajouter l'entrée d'utilisateur au fichier

try 
{ 

DataRow dr = ds.Tables[0].NewRow(); 
dr["Name"] = Nametb.Text; 
dr["Location"] = Locationtb.Text; 
dr["Info"] = Infotb.Text; 
dr["Dayvisited"] = dayvisitcb.Text; 
dr["userdata"] = "u"; 
ds.Tables[0].Rows.Add(dr); 
ds.WriteXml("Database.xml"); 

} 
catch (Exception) 
{ 
throw; 
} 
+0

avez-vous essayé '" Dayvisited <= 20 "'? – Alberto

+0

oui il dit ceci, "Impossible d'effectuer l'opération <=" sur System.String et System.Int32. " –

+0

Pouvez-vous ajouter le code qui lit les données dans le 'DataSet'? Il semble que vous stockiez la valeur de 'DayVisited' en tant que chaîne. Cela conduit à "100" étant inférieur à "20" dans l'ordre alphabétique. C'est pourquoi tous les enregistrements sont affichés. – Markus

Répondre

1

Le problème de base est que vous lisez la valeur de DayVisited comme une chaîne. Donc, une comparaison de "100" < "20" s'avère être vrai dans une comparaison de chaîne. Cela conduit à inclure la ligne dans le résultat.

Afin de comparer la valeur correctement, vous devez le convertir en un entier avant:

filter = "Convert(Dayvisited, System.Int32) <= 20" 

Cependant, en tant que votre fichier XML contient une ligne sans données pour DayVisited au début, vous devez préparer pour les données invalides. Ainsi, vous devez vérifier la longueur de la chaîne avant d'exclure la ligne invalide:

filter = "IIF(LEN(DayVisited) = 0, FALSE, Convert(Dayvisited, System.Int32) <= 20)" 

Si vous souhaitez inclure la ligne vide dans le résultat, modifiez le FALSE-TRUE.

+0

il voit encore des nombres comme 10,18,15,101,10240 comme ci-dessous 2 –

+0

Comment créer le datatable? La lisez-vous dans une base de données ou la configurez-vous manuellement? On dirait qu'il fait toujours une comparaison de chaînes. – Markus

+0

pouvez-vous expliquer votre question plus s'il vous plaît? –