2009-05-23 2 views
0

У меня есть элемент управления NumericUpDown и вы хотите обновить его содержимое из реестра. До сих пор это то, что я получил:C# Чтение десятичного значения из реестра

this.apTime.Value = APRegsitry.GetValue("apTime").ToString(); 

Очевидно, что не будет работать, так как установить this.apTime на значение ключа реестра?

ответ

1

Я не совсем уверен, в чем проблема. У вас проблемы с преобразованием его в десятичную? Если это так, попробуйте Decimal.Parse

Object obj = APRegistry.GetValue("apTime"); 
String str = obj != null ? obj.ToString() : "0"; 
Decimal value = Decimal.Parse(str); 
this.apTime.Value = value; 

Если вы не можете подробнее рассказать о проблеме?

EDIT Обновленный код для учета нулевого возвращения из GetValue

+0

Десятичное значение = Decimal.Parse (APRegistry.GetValue ("apTime"). ToString()); Вы забыли добавить Decimal.Parse. :) Также вы можете попробовать Convert.ToDecimal (stringValue); –

+0

@Chris, Не стесняйтесь забыть о линии, на которой весь ваш ответ основан. Благодаря! – JaredPar

+0

Я продолжаю получать «Необработанное исключение типа« System.NullReferenceException »произошло в program.exe« с decimal.parse и convert.todecimal – 2009-05-23 17:26:22

1

Вы не должны доверять значение из реестра, поскольку пользователь может изменить его вне вашего приложения. Вы должны обращаться в следующих случаях:

  • ключ реестра не существует
  • ключ реестра существует, но имя/значение не существует (null)
  • вы ожидаете string, значение не string тип (например, это int или byte[])
  • значения является string, но не интерпретируемый в decimal ("", "abc")

Если ключ не существует, RegistryKey.OpenSubKey(name) возвращает null. Возможно, вы захотите обработать это и создать ключ. Если ключ существует, но не пара имя/значение, то RegistryKey.GetValue(name) возвращает null. Вы можете справиться с этим, передав значение по умолчанию для перегрузки RegistryKey.GetValue(name, defaultValue) или используя ??.

Теперь, если пара имя/значение существует, но имеет недопустимое значение ("", "abc"), вы получите исключение от Parse(). Методы Parse()int, decimal, DateTime и т. Д.) Были в значительной степени устарели от TryParse(). Они возвращают false вместо метания FormatException.

// passing the default value to GetValue() 
object regValue = APRegistry.GetValue("apTime", "0"); 
// ...same as... 
object regValue = APRegistry.GetValue("apTime") ?? "0"; 

decimal value; 

// regValue will never be null here, so safe to use ToString() 
if(decimal.TryParse(regValue.ToString(), out value)) 
{ 
    this.apTime.Value = value; 
} 
else 
{ 
    // Name/pair does not exist, is empty, 
    // or has invalid value (can't parse as decimal). 

    // Handle this case, possibly setting a default value like this: 
    this.apTime.Value = 0; 
} 
Смежные вопросы