2009-11-12 64 views
0

我正在構建使用文件來配置某些字體的應用程序。它是這樣的:值不符合預期

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

Value does not fall within the expected

然後我有兩個問題:

  • 我該如何解決這個問題?
  • 如何使用浮點數來代替TextSize而不是Font方法中的浮點數?

謝謝。

回答

1

您可能還有數據轉換問題:Split()方法返回一個字符串數組,但TextSize是一個float,而TextStyle是一個枚舉(FontStyle)。雖然我們作爲人類可以很容易地看出數字12和字符串「12」至少是相關的,但編譯器很挑剔。

你可以試試這個爲TEXTSIZE:

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

處理的文字樣式可能會有點麻煩,因爲你必須要比較不同的枚舉值的字符串值。例如,要檢測「粗體」樣式,您可以編寫:

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

乾杯! 謙遜的程序員 ,,,^..^,,,

+0

謝謝你回答我的第二個問題李。 – 2009-11-12 21:00:43

1

您正在閱讀一行,但嘗試從中獲取三個值。看看評論:

// 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; 
    } 
} 
+0

謝謝Jon Skeet,你是​​那個人! – 2009-11-12 21:00:13

1

喬恩斯基特已經回答了你的第一個問題,所以你的第二個(如何解析的字體大小爲float):

float.Parse(s, CultureInfo.InvariantCulture); 

s是STRI ng包含字體大小。

+0

感謝回答我的第二個問題Brian。 – 2009-11-12 21:01:14