Значение не соответствует ожидаемому - PullRequest
0 голосов
/ 12 ноября 2009

Я создаю приложение, которое использует файл для настройки некоторых шрифтов. Это так:

Font = Verdana
Size = 12
Style = Bold

И мой код такой:

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();

И используя это так:

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

Но когда я выполняю его, я получаю эту ошибку:

ArgumentException

Значение не соответствует ожидаемому

Тогда у меня два вопроса:

  • Как я могу решить эту проблему?
  • Как я могу использовать вместо строки для TextSize использовать float для реализации в методе Font?

Спасибо.

Ответы [ 3 ]

1 голос
/ 12 ноября 2009

Джон Скит уже ответил на ваш первый вопрос, поэтому на ваш второй (как разобрать размер шрифта как число с плавающей запятой):

float.Parse(s, CultureInfo.InvariantCulture);

где s - строка, содержащая размер шрифта.

1 голос
/ 12 ноября 2009

У вас также могут возникнуть проблемы с преобразованием данных: метод Split () возвращает массив строк, но TextSize - это число с плавающей запятой, а TextStyle - перечисление (FontStyle). В то время как мы, люди, можем легко сказать, что число 12 и строка «12», по крайней мере, связаны друг с другом, компиляторы более разборчивы.

Вы можете попробовать это для TextSize:

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

Обработка TextStyle может быть немного сложнее, потому что вам придется сравнивать строковое значение с различными перечисляемыми значениями. Например, чтобы определить стиль "Bold", вы должны написать:

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

Ура! Скромный программист ,,, ^ .. ^ ,,,

1 голос
/ 12 ноября 2009

Вы читаете одну строку, но затем пытаетесь извлечь из нее три значения. Посмотрите на комментарий:

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

Затем вы используете данные [1], данные [3] и данные [5] ...

Возможно, вы хотите что-то вроде:

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;
    }
}
...