Laden...

String in .resx Datei bearbeiten

Erstellt von Chacky vor 14 Jahren Letzter Beitrag vor 14 Jahren 2.551 Views
C
Chacky Themenstarter:in
2 Beiträge seit 2009
vor 14 Jahren
String in .resx Datei bearbeiten

Hallo,
ich suche nun schon 2 Tage danach, hab aber nichts gefunden (bin wahrscheinlich einfach nur zu blöd ^^)

Also: Ich habe eine .resx Datei mit verschiedenen Strings und ihren Werten...ich möchte aber diese Werte während der Laufzeit des Programms ändern und speichern, so, dass sie nicht verloren gehen, wenn ich das Programm schließe. Ist das irgendwie möglich?

Liebe Grüße

U
105 Beiträge seit 2004
vor 14 Jahren

In deinem kompilierten Programm sind die Ressourcen dann in einer Anwendung oder Bibliothek. Ich bezweifle, dass das geht.

C
Chacky Themenstarter:in
2 Beiträge seit 2009
vor 14 Jahren

Sowas habe ich mir schon fast gedacht, aber hätt ja trotzdem sein können (:

Vielen dank trotzdem

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Chacky,

selbst wenn das ginge, wäre es eine sehr schlechte Idee. Verwende besser [Tutorial] Das neue Konfigurationsmodell im .NET Framework 2.0.

herbivore

6.911 Beiträge seit 2009
vor 14 Jahren

Ich habe eine .resx Datei mit verschiedenen Strings und ihren Werten...ich möchte aber diese Werte während der Laufzeit des Programms ändern und speichern, so, dass sie nicht verloren gehen, wenn ich das Programm schließe. Ist das irgendwie möglich?

Über einen Umweg ist das möglich.

Die geänderten Ressourcen werden in den Anwendungseinstellungen (user.config) gespeichert.

Dazu muss ein Ressource-Manager erstellt werden der zuerst schaut ob die geforderte Ressource in den Anwendungseinstellungen vorhanden ist* und wenn nicht lädt er sie aus den Anwendungs-Ressourcen.

* um die Leistung zu steigern können die Ressourcen gecached werden.

Damit die Ressource in den Anwendungseinstellungen zugreifbar ist sollten die Ressourcen in einem Dictionary mit Key = Ressourcen-Name gespeichert werden.

Da die vom Designer bereitgestellten Anwendungeinstellungen kein Dictionary anbieten muss auch dies selbst implementiert werden.

So, genug der Theorie -> ein Beispiel.

  1. Erweiterung der vom Designer erstellen Anwendungseinstellungen damit ein Dictionary verwendet werden kann. Es wird ein speziellen Dictionary verwendet das nur String-Ressourcen zulässt. Wenn als Typ für die Werte object verwendet wird können alle Ressourcen verwendet werden.

using System.Collections.Generic;
using System.Configuration;

namespace WindowsFormsApplication1.Properties
{
	partial class Settings
	{
		/// <summary>
		/// Das Dictionary zum Speichern der Ressourcen.
		/// Da IDictionary implementiert muss als Serialisierungsart
		/// Binary gewählt werden.
		/// </summary>
		[UserScopedSetting]
		[DefaultSettingValue("")]
		[SettingsSerializeAs(SettingsSerializeAs.Binary)]
		public Dictionary<string, string> MyRessource
		{
			get { return this["MyRessource"] as Dictionary<string, string>; }
			set { this["MyRessource"] = value; }
		}
	}
}

  1. Der Ressourcen-Manager mit dem in der Anwendung auf die Ressourcen zugegriffen werden soll. Es wird angenommen dass die Ressourcen im Designer erstellt worden sind - d.h. dass über Properties.Ressources darauf zugegriffen werden kann.

using System.Collections.Generic;

namespace WindowsFormsApplication1
{
	internal class RessourcenManager
	{
		/// <summary>
		/// Cache.
		/// </summary>
		private Dictionary<string, string> _ressourcenCache;
		//---------------------------------------------------------------------
		// Singleton.
		private static readonly RessourcenManager _instance = new RessourcenManager();
		public static RessourcenManager Instanz
		{
			get { return _instance; }
		}
		//---------------------------------------------------------------------
		private RessourcenManager()
		{
			_ressourcenCache = Properties.Settings.Default.MyRessource;

			if (_ressourcenCache == null)
				_ressourcenCache = new Dictionary<string, string>();
		}
		//---------------------------------------------------------------------
		/// <summary>
		/// Indexer.
		/// </summary>
		/// <param name="name">Name der Ressource.</param>
		/// <returns>String-Ressource.</returns>
		public string this[string name]
		{
			get
			{
				string ressourcenString = string.Empty;

				// Im Cache vorhanden?
				if (_ressourcenCache.ContainsKey(name))
					ressourcenString = _ressourcenCache[name];
				else
				{
					// Da nicht im Cache aus der Ressourdendatei lesen:
					ressourcenString = (string)
						Properties.Resources
						.ResourceManager.GetObject(name);

					// Dem Cache hinzufügen:
					_ressourcenCache[name] = ressourcenString;
					OnRessourcenCacheChanged();
				}
				return ressourcenString;
			}
			set
			{
				_ressourcenCache[name] = value;
				OnRessourcenCacheChanged();
			}
		}
		//---------------------------------------------------------------------
		private void OnRessourcenCacheChanged()
		{
			Properties.Settings.Default.MyRessource = _ressourcenCache;
		}
	}
}

Verwendet wird das Ganz dann so wie dieses Beispiel zeigt Form1.cs:

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
	public partial class Form1 : Form
	{
		public Form1()
		{
			InitializeComponent();
		}
		//---------------------------------------------------------------------
		protected override void OnLoad(EventArgs e)
		{
			base.OnLoad(e);

			textBox1.Text = RessourcenManager.Instanz["Name"];
		}
		//---------------------------------------------------------------------
		protected override void OnFormClosing(FormClosingEventArgs e)
		{
			base.OnFormClosing(e);

			Properties.Settings.Default.Save();
		}
		//---------------------------------------------------------------------
		private void button1_Click(object sender, EventArgs e)
		{
			RessourcenManager.Instanz["Name"] = textBox1.Text;
		}
	}
}

mfG Gü

PS: Am Code kann sicher noch gefeilt werden, aber es ist ein Erstentwurf.

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo gfoidl,

ich finde das etwas unglücklich. Man kann und sollte die Werte einfach direkt aus der user.config laden bzw. darin speichern, ohne zu tun, als wären sie Ressourcen.

herbivore

6.911 Beiträge seit 2009
vor 14 Jahren

Hallo herbivore,

dieser Meinung bin ich grundsätzlich auch. Ich hab mir dazu auch überlegt ob ich dazu überhaupt das Beispiel erstellen soll.

Letzendlich hab ich mich entschieden das Beispiel zu erstellen (sonst wärs ja nicht da 😉
Aber warum?
Ich stellte mir eine lokalisierte Software vor in welcher der Benutzer die String-Ressourcen anpassen kann. Diese Möglichkeit ist mit den Konfigurationsdateien aufwändiger (für jede Sprache ein Abschnitt, ...).
Ob es Sinn macht die String-Ressourcen vom Benutzer änderbar zu machen weiß nicht - es ließe sich sicherlich ein konkreter Anwendungsfall finden.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"