2011-03-11 19 views
60

Nghe có vẻ quá trival để hỏi và tôi làm điều tương tự như đề xuất trong bài viết, nhưng nó không hoạt động như mong đợi. Hy vọng ai đó có thể chỉ cho tôi đi đúng hướng.ConfigurationManager.AppSettings - Cách sửa đổi và lưu?

Tôi muốn lưu các cài đặt người dùng cho mỗi AppSettings.

Khi Winform bị đóng Tôi kích hoạt này:

conf.Configuration config = 
      ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 

if (ConfigurationManager.AppSettings["IntegrateWithPerforce"] != null) 
    ConfigurationManager.AppSettings["IntegrateWithPerforce"] = 
              e.Payload.IntegrateCheckBox.ToString(); 
else 
    config.AppSettings.Settings.Add("IntegrateWithPerforce", 
              e.Payload.IntegrateCheckBox.ToString()); 

config.Save(ConfigurationSaveMode.Modified); 

Vì vậy, lần đầu tiên khi doesnt nhập tồn tại, nó sẽ chỉ đơn giản là tạo ra nó, nếu không nó sẽ sửa đổi các mục hiện tại. Tuy nhiên điều này không tiết kiệm.

1) Tôi đang làm gì sai?

2) Tôi dự kiến ​​cài đặt ứng dụng cho cài đặt ứng dụng sẽ được lưu lại ở đâu? Có trong thư mục Debug hoặc trong thư mục C: \ Documents and Settings \ USERNAME \ Local Settings \ Application Data?

+1

thể trùng lặp của [Thực hành tốt nhất để lưu cài đặt ứng dụng trong một ứng dụng Windows] (http://stackoverflow.com/questions/453161/best-practice -to-save-application-settings-in-a-windows-application) – Richard

+0

Tham khảo: http://stackoverflow.com/questions/453161/best-practice-to-save-application-settings-in-a-windows -ứng dụng – Kumar

+0

Tôi thực sự không muốn sử dụng Settings.settings như được đề xuất ở đó. Nhưng bây giờ tôi nghĩ rằng cách tôi sử dụng nó, không phải là aproach chính xác sau khi tất cả, kể từ khi tiết kiệm các giá trị như cài đặt ứng dụng hơn là usersettings ... – Houman

Trả lời

15

Có lẽ bạn nên xem xét thêm tệp cài đặt. (Ví dụ App.Settings) Tạo tập tin này sẽ cho phép bạn làm như sau:

string mysetting = App.Default.MySetting; 
App.Default.MySetting = "my new setting"; 

Điều này có nghĩa bạn có thể chỉnh sửa và sau đó thay đổi mặt hàng, nơi các mục được đánh mạnh, và tốt nhất của tất cả các ... bạn không cần phải chạm vào bất kỳ xml nào trước khi bạn triển khai!

Kết quả là cài đặt theo ngữ cảnh của Ứng dụng hoặc Người dùng.

Có giao diện trong trình đơn "thêm mục mới" cho tệp cài đặt.

+1

Thêm tệp Cài đặt hoặc sử dụng tệp hiện có trong Thuộc tính/Cài đặt.settings tương tự như vậy ? Trong trường hợp sử dụng exsiting, tôi sẽ làm một cái gì đó như thế này: Properties.Settings.Default.IntegrateWithPerforce = _integrateCheckBox.Checked; Properties.Settings.Default.Save(); – Houman

+0

Rất có thể. Tôi đã luôn luôn chỉ sử dụng các tập tin riêng biệt như đã làm cho tôi tốt.Nếu đúng như vậy, tôi vừa mới học được điều gì đó – Dann

7

Thử thêm sau khi bạn lưu cuộc gọi.

ConfigurationManager.RefreshSection("appSettings"); 
+0

Điều này đặc biệt quan trọng nếu bạn đang viết rồi đọc đến cùng một ứng dụngĐặt nhanh chóng. – Trevor

57

Về cách thay đổi giá trị trong phần appSettings trong file app.config của bạn:

config.AppSettings.Settings.Remove(key); 
config.AppSettings.Settings.Add(key, value); 

hiện công việc.

Tất nhiên thực hành tốt hơn là lớp Cài đặt nhưng tùy thuộc vào bạn đang làm gì sau đó.

+3

Sau khi nhìn vào ba kajillion AppSettings sửa đổi ý tưởng ở đây và ở nước ngoài, đây là đơn giản nhất/tốt nhất, và (quan trọng) hoạt động ngay cả khi người dùng phá hủy nút downwitch

36

Ưu tiên <appSettings> đến <customUserSetting> phần. Đọc và viết dễ dàng hơn với Trình quản lý cấu hình (Web). ConfigurationSection, ConfigurationElement và ConfigurationElementCollection yêu cầu bạn lấy ra các lớp tùy chỉnh và thực hiện các thuộc tính ConfigurationProperty tùy chỉnh. Cách quá nhiều đối với những người chết hàng ngày IMO.

Dưới đây là một ví dụ về đọc và viết vào web.config:

using System.Web.Configuration; 
using System.Configuration; 

Configuration config = WebConfigurationManager.OpenWebConfiguration("/"); 
string oldValue = config.AppSettings.Settings["SomeKey"].Value; 
config.AppSettings.Settings["SomeKey"].Value = "NewValue"; 
config.Save(ConfigurationSaveMode.Modified); 

Trước:

<appSettings> 
    <add key="SomeKey" value="oldValue" /> 
</appSettings> 

Sau:

<appSettings> 
    <add key="SomeKey" value="newValue" /> 
</appSettings> 
6

Hãy nhớ rằng ConfigurationManager chỉ sử dụng một ứng dụng. config - một trong đó là trong dự án khởi động.

Nếu bạn đặt một số ứng dụng.cấu hình cho một giải pháp A và thực hiện một tham chiếu đến nó từ một giải pháp B sau đó nếu bạn chạy B, app.config từ A sẽ bị bỏ qua.

Vì vậy, ví dụ dự án thử nghiệm đơn vị phải có app.config riêng của họ.

21

là câu hỏi cơ bản là về hình thức chiến thắng ở đây là giải pháp: (Tôi chỉ cần thay đổi mã bằng cách user1032413 để rflect thiết lập WindowsForms) nếu đó là một khóa mới:

Configuration config = configurationManager.OpenExeConfiguration(Application.ExecutablePath); 
config.AppSettings.Settings.Add("Key","Value"); 
config.Save(ConfigurationSaveMode.Modified); 

nếu chìa khóa đã tồn tại :

Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath); 
config.AppSettings.Settings["Key"].Value="Value"; 
config.Save(ConfigurationSaveMode.Modified); 
43

tôi biết tôi đến muộn :) Nhưng điều này làm thế nào tôi làm điều đó:

public static void AddOrUpdateAppSettings(string key, string value) 
{ 
    try 
    { 
     var configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
     var settings = configFile.AppSettings.Settings; 
     if (settings[key] == null) 
     { 
      settings.Add(key, value); 
     } 
     else 
     { 
      settings[key].Value = value; 
     } 
     configFile.Save(ConfigurationSaveMode.Modified); 
     ConfigurationManager.RefreshSection(configFile.AppSettings.SectionInformation.Name); 
    } 
    catch (ConfigurationErrorsException) 
    { 
     Console.WriteLine("Error writing app settings"); 
    } 
} 

Để biết thêm thông tin, hãy xem MSDN

+0

Một điểm quan trọng cần lưu ý ở trên là nếu bạn đang chạy điều này từ trình gỡ rối (trong Visual Studio), sau đó tệp app.config sẽ được ghi đè mỗi khi bạn xây dựng. Cách tốt nhất để kiểm tra điều này là xây dựng ứng dụng của bạn và sau đó điều hướng đến thư mục đầu ra và khởi chạy tệp thực thi của bạn từ đó. --- từ http://vbcity.com/forums/t/152772.aspx –

2

Tôi nghĩ rằng vấn đề là trong studio gỡ lỗi trực quan không sử dụng exeName bình thường.

nó sử dụng indtead "NameApplication" .host.exe

nên tên của tập tin cấu hình là "NameApplication" .host.exe.config và không "NameApplication" .exe.config

và sau khi ứng dụng đóng - nó quay trở lại ứng dụng sau.config

vì vậy nếu bạn kiểm tra tệp sai hoặc bạn kiểm tra sai thời gian, bạn sẽ thấy rằng không có gì thay đổi.

3
public void ApplySettings(string key, string value) 
{ 

     var configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
     var settings = configFile.AppSettings.Settings; 
     if (settings[key] == null) 
     { 
      settings.Add(key, value); 
     } 
     else 
     { 
      settings[key].Value = value; 
     } 
     configFile.Save(ConfigurationSaveMode.Modified); 
     ConfigurationManager.RefreshSection(configFile.AppSettings.SectionInformation.Name); 
} 
0

Bạn có thể thay đổi nó bằng tay:

private void UpdateConfigFile(string appConfigPath, string key, string value) 
{ 
    var appConfigContent = File.ReadAllText(appConfigPath); 
    var searchedString = $"<add key=\"{key}\" value=\""; 
    var index = appConfigContent.IndexOf(searchedString) + searchedString.Length; 
    var currentValue = appConfigContent.Substring(index, appConfigContent.IndexOf("\"", index) - index); 
    var newContent = appConfigContent.Replace($"{searchedString}{currentValue}\"", $"{searchedString}{newValue}\""); 
    File.WriteAllText(appConfigPath, newContent); 
}