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
In deinem kompilierten Programm sind die Ressourcen dann in einer Anwendung oder Bibliothek. Ich bezweifle, dass das geht.
Sowas habe ich mir schon fast gedacht, aber hätt ja trotzdem sein können (:
Vielen dank trotzdem
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
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.
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; }
}
}
}
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!"
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
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!"