Laden...

Anwendungskonfigurationsdatei Typ String Array

Erstellt von leb0rtran vor 14 Jahren Letzter Beitrag vor 12 Jahren 4.868 Views
L
leb0rtran Themenstarter:in
26 Beiträge seit 2008
vor 14 Jahren
Anwendungskonfigurationsdatei Typ String Array

hi,

ich versuchte atm verzweifelt in der Anwendungskonfigurationsdatei einen Wert als Array zu speichern.
Ich konnte den Typ Array aber nirgends finden ... (Bei Durchsuchen unter System ist er auch nicht ...)
ArrayList habe ich zwar gefunden, aber wenn ich der ArrayList einen Wert zuweißen will, kann ich nur leere Objekte zuweißen, und keine strings ....

Bin hier echt am verzweifeln ...
Hta jemand ne Idee. Schonmal THX im voraus

mfg

2.187 Beiträge seit 2005
vor 14 Jahren

Hallo leb0rtran,

Es gibt doch für sowas System.Collection.Spezialized.SpezializedStringCollection.

Gruß
Juy Juka

L
leb0rtran Themenstarter:in
26 Beiträge seit 2008
vor 14 Jahren

ok, mit dem gehts auch.
is halt n bissle blöd, immer umwandeln, nur zum speichern ...

warum gibtsn da kein normales Array?

6.911 Beiträge seit 2009
vor 14 Jahren

Hallo,

die vom Designer generierte Klasse für die Settings ist ein partielle Klasse. D.h. sie kann erweitert werden. Somit ist es möglich alles was serialisierbar (XML oder binär) in den Anwendungskonfigurationseinstellungen zu speichern.


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

namespace XXX.Properties
{
	/// <summary>
	/// Erweitert die vom Designer generierten Settings so dass 
	/// eine Liste gespeichert werden kann.
	/// </summary>
	partial class Settings
	{
		[UserScopedSetting()]
		[SettingsSerializeAs(SettingsSerializeAs.Xml)]
		[DefaultSettingValue("")]
		public List<string> MyList
		{
			get { return this["MyList"] as List<string>; }
			set { this["MyList"] = value; }
		}
	}
}

Auf diese Weise ist es auch möglich eigene Klasse zu speichern.

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!"

J
641 Beiträge seit 2007
vor 14 Jahren
Geht doch...

Also bei mir geht ein array, indem ich einfach bsp string[] als typ angebe! das geht aber nicht im settings designer (zumindest bei mir!). ich habe die settings datei mit notepad geöffnet das [] hinzugefügt und wieder gespeichert.

cSharp Projekte : https://github.com/jogibear9988

6.911 Beiträge seit 2009
vor 14 Jahren

Hallo jogibear9988,

wenn du danach eine Einstellung im Designer änderst (oder reicht schon das Öffnen der Datei) ist deine Modifikation futsch.

Daher ziehe ich die Erweiterung der Klasse vor.

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!"

J
641 Beiträge seit 2007
vor 14 Jahren
nein...

ne, ist nicht futsch...

ich kann dann sogar den designer benutzen um werte in das array einzufügen!!

cSharp Projekte : https://github.com/jogibear9988

5.299 Beiträge seit 2008
vor 14 Jahren

👍 👅

Der frühe Apfel fängt den Wurm.

A
30 Beiträge seit 2010
vor 13 Jahren

@gfoidl Danke für den Tipp mit neuer klasse hat mir auc geholfen, aber wie trage ich das in .config datei (xml) ein?
der nimmt das automatische nicht ein, deswegen muss ichw ohl manuell machen.



internal sealed partial class Settings {
        
      [UserScopedSetting()]
      [SettingsSerializeAs(SettingsSerializeAs.Xml)]
      [DefaultSettingValue("")]
      public Arraylist MyArrayList
      {
        get { return this["MyArrayList"] as Arraylist; }
        set { this["MyArrayList"] = value; }
      }
}


und bei App.config habe ihc folgendes selbst eingetragen


<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
      <section name="test1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup>
  </configSections>
  <applicationSettings>
    <test1.Properties.Settings>
      <setting name="MyArrayList"  serializeAs="System.Collections.ArrayList">
        <value> </value>
      </setting>
    </test1.Properties.Settings>
  </applicationSettings>
</configuration>

N
3 Beiträge seit 2009
vor 12 Jahren
Anwendungskonfigurationsdatei Typ String Array

Ich habe mich ebenfalls lange Zeit mit diesem Thema beschäftigt. Nun habe ich eine mögliche Lösung dafür gefunden.

  1. Geht zum Solution Explorer
  2. Properties / Eigenschaften
  3. Settings / Einstellungen
  4. Wählt einen Namen z.B. Test
  5. Typ: System.Collections.ArrayList
  6. Scope: Application
  7. Value ganz rechts auf "..." klicken
  8. 1-2 Objekte hinzufügen
  9. Anwendung kompilieren
  10. Zum Programmverzeichnis wechseln und die .conf Datei editieren
  11. Fügt soviele Werte wie gewollt hinzu (mit anyType .. /anyType)

            <setting name="Test" serializeAs="Xml">
                <value>
                    <ArrayOfAnyType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
                        <anyType xsi:type="xsd:string">erster Eintrag</anyType>
                        <anyType xsi:type="xsd:string">zweiter Eintrag</anyType>
                    </ArrayOfAnyType>
                </value>
            </setting>

  1. Im Code können nun diese Werte ausgelesen werden:
    System.Collections.ArrayList arrayList = XXX.Properties.Settings.Default.Test;

In der arrayList befinden sich die Einträge "erster Eintrag", "zweiter Eintrag"
Fertig!

Hinweis von gfoidl vor 12 Jahren

ArrayList gehört in die Mottenkiste und sollte wie alle untypisierten Collections aus System.Collections nicht mehr benutzt werden. Verwende stattdessen List<T> und alle anderen typisierten Collections aus System.Collections.Generic.

N
3 Beiträge seit 2009
vor 12 Jahren

Nachtrag: Mag sein, dass ArrayList zur Mottenkiste gehört, in der Standardauswahl der möglichen Datentypen ist jedoch eine Auswahl von besseren Datentypen wie z.B. List<T> nicht möglich.

Wenn ausserdem die app.config editiert wird, und zurück zu den Einstellungen des Projekts gewechselt wird, werden die getätigten Einträge von Visual Studio automatisch zu den Standardeinstellungen hinzugefügt:


        [global::System.Configuration.ApplicationScopedSettingAttribute()]
        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.Configuration.DefaultSettingValueAttribute(@"<?xml version=""1.0"" encoding=""utf-16""?>
<ArrayOfAnyType xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
  <anyType xsi:type=""xsd:string"">eins</anyType>
  <anyType xsi:type=""xsd:string"">zwei</anyType>
  <anyType xsi:type=""xsd:string"">drei</anyType>
  <anyType xsi:type=""xsd:string"">vier</anyType>
</ArrayOfAnyType>")]
        public global::System.Collections.ArrayList Test {
            get {
                return ((global::System.Collections.ArrayList)(this["Test"]));
            }
        }

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo nfsragnar,

ArrayList hat den Nachteil, dass sie untypisiert ist. Darüber brauchen wir hier im generellen nicht diskutieren, denn das wurde im Forum schon zur Genüge behandelt.

Es ist schade dass der Designer hier wohl veraltet ist und keine generischen Collections anbietet/zulässt, aber das sollte kein Hindernis darstellen. Weiter oben hab ich gezeigt wie es typisiert mit einer List<string> möglich ist. Hier können auch Standardwerte angegeben werden. Siehe


partial class Settings
{
	[ApplicationScopedSettingAttribute]
	[SettingsSerializeAs(SettingsSerializeAs.Xml)]
	[DefaultSettingValue(
"<?xml version=\"1.0\"?>"+
"<ArrayOfString xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">"+
	"<string>erster Eintrag</string>"+
	"<string>zweiter Eintrag</string>"+
	"<string>dritter Eintrag</string>"+
"</ArrayOfString>")]
	public List<string> MyList
	{
		get { return this["MyList"] as List<string>; }
	}
}

Wenn ausserdem die app.config editiert wird, und zurück zu den Einstellungen des Projekts gewechselt wird, werden die getätigten Einträge von Visual Studio automatisch zu den Standardeinstellungen hinzugefügt:

Das ist zwar das einzige Argument das für ArrayList übrig bleibt, aber ein Grund für die Verwendung der ArrayList ist dennoch nicht. Beim typisierten List<T> hab ich sogar den zusätzlichen Vorteil, dass ich nur 1 Stelle bearbeiten muss und mir der Designer nicht in die Arbeit pfuscht.

Es bleibt also bei der allgemeinen Empfehlung die ArrayList in der Mottenkiste zu lassen.

Hallo arakhsh_j,

deine Frage hab ich gar nicht bemerkt, zu dem damaligen Zeitpunkt war ich "Winterschlaf".

aber wie trage ich das in .config datei (xml) ein?

Bei den User-Settings ist nichts einzutragen. Sobald Änderungen gegenüber den Standardwerten vorliegen schreibt es .net automatisch in die user.config. Diese kannst du dir ansehen wie der Aufbau ist und ggf. in die app.config eintragen, aber wie gesagt nötig ist es nicht.
Für die Application-Settings siehe oben. Alternativ zur Angabe eines XML-Strings können die Listeneinträge auch im Konstruktor der Settings-Klasse erstellt werden.

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!"