2016-05-17 115 views
0

我的WinForm程序保存了用戶設置的xml副本,我遇到的問題是將其重新加載回來。從XML中加載用戶設置並將其設置爲對象。未將對象設置爲對象實例

我已經從博客複製此代碼:Code Snippet

錯誤發生的歷史,其中發生在下面的代碼註釋。

無法導入設置。對象引用未設置爲對象的實例 。

[更新]我剛纔注意到,它運行在Visual Studio 2013程序時的實際工作,但是並沒有從Windows資源管理器運行時。

[Update2]我想是因爲這是我第一次從桌面運行這個,我是一個不同的用戶,我的用戶設置配置文件尚未創建,這是問題。

try{ 
    var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal); 

    // returns "[MyApplication].Properties.Settings"; 
    string appSettingsXmlName = Properties.Settings.Default.Context["GroupName"].ToString(); 
    // Open settings file as XML 
    var import = XDocument.Load(filename); 
    // Get the whole XML inside the settings node 
    var settings = import.XPathSelectElements("//" + appSettingsXmlName); 

    //***Error occurs in the following code*** 
    config.GetSectionGroup("userSettings") 
     .Sections[appSettingsXmlName] 
     .SectionInformation 
     .SetRawXml(settings.Single().ToString()); 

    config.Save(ConfigurationSaveMode.Modified); 
    ConfigurationManager.RefreshSection("userSettings"); 

    appSettings.Reload(); 
} 
catch (Exception ex) 
{ 
    MessageBox.Show("Could not import settings. " + ex.Message); 
} 

下面是XML文件:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
     <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > 
      <section name="DropLib.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" /> 
     </sectionGroup> 
    </configSections> 
    <userSettings> 
     <DropLib.Properties.Settings> 
      <setting name="ORG_SETTINGS" serializeAs="Xml"> 
       <value> 
        <ArrayOfString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
         <string>ORG1-||-server1-||-Proj 94-||[email protected]|||-Server-|-Server-|-Folder$-|-http://server1/proj-|-c:\inetpub\wwwroot\proj\</string> 
         <string>ORG2-||-server2-||-Proj 94-||[email protected]|||-Server-|-Server-|-Folder$-|-http://server2/proj-|-c:\inetpub\wwwroot\proj\</string> 
        </ArrayOfString> 
       </value> 
      </setting> 
     </DropLib.Properties.Settings> 
    </userSettings> 
</configuration> 

回答

1

看來你是,如果你從VS或從桌面運行取決於不同的用戶。

當我第一次從桌面運行程序時,還沒有創建user.config文件。

解決方案:添加了一個檢查,看是否已創建user.config,如果不執行用戶設置的保存,將創建它。

新代碼:

try 
{ 
    var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal); 
    //Check user.config exists 
    if (!File.Exists(config.FilePath)) 
    { 
     [EDIT] 
     DropLib.Properties.Settings.Default.MY_SETTING = ""; 
     [/EDIT] 
     DropLib.Properties.Settings.Default.Save(); 
     config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal); 
    } 

    // returns "[MyApplication].Properties.Settings"; 
    string appSettingsXmlName = Properties.Settings.Default.Context["GroupName"].ToString(); 

    // Open settings file as XML 
    var import = XDocument.Load(filename); 

    // Get the whole XML inside the settings node 
    var settings = import.XPathSelectElements("//" + appSettingsXmlName); 

    config.GetSectionGroup("userSettings") 
     .Sections[appSettingsXmlName] 
     .SectionInformation 
     .SetRawXml(settings.Single().ToString()); 

    config.Save(ConfigurationSaveMode.Modified); 
    ConfigurationManager.RefreshSection("userSettings"); 

    appSettings.Reload(); 
} 
catch (Exception ex) 
{ 
    MessageBox.Show("Could not import settings. " + ex.Message); 
    appSettings.Reload(); // from last set saved, not defaults 
} 
+0

我已經改變了這種解決方案一點,看來你至少必須初始化保存工作之前的設置之一。 – Hank

相關問題