2009-11-12 5 views
0

Je crée une application qui utilise un fichier pour configurer certaines polices. Il est comme ça:La valeur ne correspond pas à la valeur attendue

Font = Verdana 
Size = 12 
Style = Bold 

Et mon code est comme ceci:

openDialog.ShowDialog(); 
string file = openDialog.FileName; 
StreamReader reader = new StreamReader(file); 
while (reader.Peek() <= 0) 
{ 
    string line = reader.ReadLine(); 
    string[] data = Split(new[] { '=' }); 
    // property is in data[0] 
    // value is in data[1] 
    TextFont = data[1]; 
    TextSize = data[3]; 
    TextSt = data[5]; 
} 
reader.Close(); 
reader.Dispose(); 

Et en utilisant comme ceci:

textBox1.Font = new System.Drawing.Font(TextFont, 12F, FontStyle.Bold); 

Mais quand je l'exécute j'eu cette erreur:

ArgumentException

Value does not fall within the expected

Ensuite, j'ai deux questions:

  • Comment puis-je résoudre ce problème?
  • Comment puis-je utiliser à la place d'une chaîne pour TextSize utiliser un flottant pour l'implémenter dans la méthode Font?

Merci.

Répondre

1

Vous pouvez également avoir des problèmes de conversion de données: la méthode Split() renvoie un tableau de chaînes, mais TextSize est un flottant, alors que TextStyle est une énumération (FontStyle). Alors que nous, en tant qu'êtres humains, pouvons facilement dire que le nombre 12 et la chaîne "12" sont au moins liés, les compilateurs sont beaucoup plus sélectifs.

Vous pouvez essayer cela pour la TextSize:

float fSize; 
if (float.TryParse(data[3], out fSize)) 
    TextSize = fSize; 

Manipulation du TextStyle peut-être un peu plus délicat, parce que vous aurez à comparer la valeur de chaîne contre les différentes valeurs énumérées. Par exemple, pour détecter le style "gras", vous écrivez:

if (String.Compare("Bold", data[5]) == 0) // true if equal 
    TextStyle = FontStyle.Bold; 

À votre santé! Humble Programmer ,,,^..^,,,

+0

Merci de répondre à ma deuxième question Lee. –

1

Vous lisez une seule ligne, mais vous essayez d'en extraire trois valeurs. Regardez le commentaire:

// property is in data[0] 
// value is in data[1] 

Vous êtes alors en utilisant des données [1], les données [3] et des données [5] ...

Vous voulez probablement quelque chose comme:

openDialog.ShowDialog(); 
string file = openDialog.FileName; 
string[] lines = File.ReadAllLines(file); 
foreach (string line in line) 
{ 
    string[] data = line.Split('='); 
    string property = data[0].Trim(); 
    string value = data[1].Trim(); 
    switch (property) 
    { 
     case "Font": TextFont = value; break; 
     case "Size": TextSize = value; break; 
     case "Style": TextSt = value; break; 
     default: 
      // Whatever you want to do here for properties you don't recognise 
      break; 
    } 
} 
+0

Merci Jon Skeet, vous êtes le gars! –

1

Jon Skeet déjà répondu à votre première question, donc pour votre deuxième (comment analyser la taille de la police comme un flotteur):

float.Parse(s, CultureInfo.InvariantCulture); 

où s est le STRI ng contenant la taille de la police.

+0

Merci de répondre à ma deuxième question Brian. –