Laden...

Forenbeiträge von kunsti Ingesamt 89 Beiträge

09.03.2015 - 08:50 Uhr

Das habe ich auch gerade versucht. Das ertsellen der Textbox klappt auch. nun habe ich versucht den Wert zu binden, aber irgendwas mache ich falsch.


    <input type="text" value="model => model.MyProperty" readonly disabled size="10"/>
        <input type="text" data-bind="value:gate2Status" readonly disabled size="10" />
        <script type="text/javascript">
    var viewModel = {
        gate2Status:"Status"
    };
        </script>

Die erste Textbox erkennt den string auch als string an und nicht als DataBinding, also stehtd er Lambda-Ausdruck in der Textbox.
Bei der zweiten Textbox erscheint kein Text in der TextBox, ich dachte da würde "Status" erscheinen. Wenn das geklappt hätte hätte ich versucht den Wert der Property abzurufen.

06.03.2015 - 16:38 Uhr

Danke für die Antwort.
Habe ich das richtig verstanden, dass ich das so machen soll?


	public class GatesModel
	{
	public string MyProperty { get { return "Test"; }  }
         }
	}
 @Html.TextBoxFor( model => model.MyProperty, null, new { size = "10", @class = "text-box single-line readonly", @readonly = "readonly", disabled = "disabled" } )

Denn so funktioniert es nicht. Die TextBox ist weiterhin leer.

06.03.2015 - 15:39 Uhr

Hi,
ich versuche aktuell ein Projekt in ASP.NET MVC umzusetzen.
Nun versuche ich eine Read-Only TextBox zu erzeugen. Das hat auch schon geklappt.
Allerdings wird der Wert der Property nicht daran gebunden, wie ich es mir erhofft habe.

So erstelle ich die TextBox:

 @Html.TextBoxFor( model => model.Gates[0].Status, null, new { @class = "text-box single-line readonly", @readonly = "readonly", disabled = "disabled" } )

Mein Model sieht wie folgt aus:
Ja die Liste macht aktuell noch nicht wirklich sinn, da ich aktuell erst mal nur die Benutzeroberfläche aufbaue und die Logik nur Testdaten zurückgeben lasse.


	public class GatesModel
	{
		public List<Gate> Gates{
			get
			{
				return new List<Gate>(){
					new Gate("XX.XX.XX.XX")
				};
			}		
		}
	}

Die Property Status von Gate liefert lediglich einen Enumwert zurück.
Meine Fragen sind nun:
1.Wie schaffe ich es, dass der Wert des ersten Gates automatisch an die Textbox gebunden wird.
2.Ist es möglich die Property in einem bestimtmen Zeitraum wieder zu überprüfen, dass die Textbox sich automatisch aktualisiert?

Danke und Viele Grüße

03.03.2015 - 13:19 Uhr

Es gibt meiner Meinung nach zwei Möglichkeiten:

  1. Du befindest dich aus irgendeinem Grund bereits am Ende.
  2. Dein Stream ist leer. Vielleicht ist der Prozess noch nicht durchgelaufen und hat deshalb keinen Output? Was sagt der Debugger an der Stelle?
03.03.2015 - 08:14 Uhr

Lies dir den Artikel von Jamikus durch, debugge und schaue, ob in die if gesprungen wird. Wenn ja liegt es an Focus. Dann würde ich mal eine andere MEthode versuchen

02.03.2015 - 16:54 Uhr

Ansonsten kannst du auch googlen.
Das war das erste Eregbnis und hier werden noch weitere Möglichkeiten genannt. Eine davon funktiniert bestimmt.
http://stackoverflow.com/questions/1087786/press-enter-to-move-to-next-control

02.03.2015 - 09:30 Uhr

Hast du schon debugt und geschaut, ob schon der falsche Index ausgelesen wird?

Wieso konvertierst du einen Int-Wert in ein String und direkt wieder in ein Int?


index2 = Convert.ToInt32(dataGridView2.CurrentRow.Index.ToString());


index2 = dataGridView2.CurrentRow.Index;

30.01.2015 - 13:39 Uhr

Also erstellt wurde es schon mal, durch den Code
Hab mal einen Screenshot angehängt.

30.01.2015 - 13:06 Uhr

Danke für die Antwort.
Ich dachte das würde ich mit

  EventLog.CreateEventSource(source, logName );

machen. Oder habe ich da etwas falsch verstanden?

Leider habe ich deine Antwort zu spät gelesen und mir mittlerweile ein Workarround gebastelt.
Für alle die es interresiert:
Ich habe eine Klasse LogProvider. Diese enthält verschiedene ILoger. Je nachdem ob in einen Filegeloggt werden soll oder eine Email gesendet werden soll. Für jeden dieser Logger haber ich eine getter Methode.

Diese war vorher public und ich habe sie aus anderen Klassen aufgerufen um ein ILog zu bekommen und dann zu loggen. Die getter sind nun private. Ich habe protected Methoden für die jeweiligen Level des loggens erstellt. Diesen übergebe ich zusätzlich zur Nachricht noch ein eigenes Enum um zu wissen, welchen Logger ich benötige.
Hier mal ein auszug aus dem Code:


		public enum LogType
		{
			LogToFile,
			SendEMail
		};

		private ILog loggerToLogTo;
		private ILog Logger
		{
			get
			{
				if( logger == null )
					logger = LogManager.GetLogger( this.GetType().Name );
				return logger;
			}
		}

		private ILog EmailLogger
		{
			get
			{
				if( emailLogger == null )
					emailLogger = LogManager.GetLogger( "Logger.EmailLogger" );

				return emailLogger;
			}
		}
                protected void LogError( string msg, LogType logType )
		{
			SetLoggerToLogTo( logType );
			if( loggerToLogTo.Logger.Repository.Configured )
				loggerToLogTo.Error( msg );
			else
				LogToEventLog( msg, EventLogEntryType.Error );

		}
		private void SetLoggerToLogTo(LogType type)
		{
			switch( type )
			{
				case LogType.LogToFile:
					loggerToLogTo = Logger;
					break;
				case LogType.SendEMail:
					loggerToLogTo = EmailLogger;
					break;
			}
		}
	}
                private void LogToEventLog (string msg, EventLogEntryType type)
		{			
			string source =  Process.GetCurrentProcess().MainModule.FileName;
			EventLog.WriteEntry( source, msg, type );
		}


30.01.2015 - 09:46 Uhr

Um dich mit LINQ-Abfragen zu beschäftigen würd eich dir das openbook vom ehemaligen Verlag GalileoComputing (mittlerwiel Rehinwekr Computing) empfehlen.
Um deine LINQ-Filter dynamisch zu generieren finde ich den Artikel Build Where Clause Dynamically in Linq gut.

Naja zum Beispiel kannst du deinen Code ja mit Visual Studio kompilieren. Da brauchst du keinen extra Code schreiben.
Von VS gibt es die Express-Version, die wenn ich mich nicht irre kostenlos ist.

30.01.2015 - 09:23 Uhr

Also habe ich mich für eine Quick and Dirty Version mit sturren Strings die SQL Anweisungen enthalten entschieden.

Schau doch mal nach LINQ to SQL und Dynamic LINQ ExpressionBuilder

Also du willst dein Tool kompilieren verstehe ich das richtig?
Wieso holst du dir zum kompilieren nicht einen Compiler?
Wenn du Fehlermeldungen hast, kopiere sie, wie du es hier getan, füge sie in google ein und schon wird dir eine mögliche Ursache der Probleme genannt 😉
Beispiel: Compiler Error CS0234

30.01.2015 - 08:35 Uhr

Guten Morgen,
ich komme mal wieder nicht weiter.
Ich habe einen Service der verschiedene Queues verwalten soll. Welche Queue das sind wird in .config festgelegt.
Wenn beim lesen der .config, ein Fehler auftritt soll der Dienst beendet werdem und eine Nachricht gelogt werden. Das schreiben der Einträge geschieht eigentlich in eine Textdatei. An bestimmten Stellen klappt das wunderbar, wenn man zum Beispiel in der Section, in der die Queues stehen ein ungültiges Element einfügt.

Nun kann die .config auch anders "kaputt" gemacht werden. Zum Beispiel, wenn "<" am Anfang von "configSection" entfernt. Dadurch können auch die log4net Einstellungen nicht mehr gelesen werden, die zum Schreiben benötigt werden.

Aus diesem Grund wird im Code ein DefaultLogger erstellt, wenn der Logger aus der .Config nicht erstellt werden konnte. Dieser Logger, soll dann in den EventLog schreiben. Eine Fehlermeldung erscheint nicht, allerdings wird auch nicht in die Ereignisanzeige geschrieben.

Hier mal der Code:


private ILog CreateDefaultLogger()
		{
			var hierarchy = (Hierarchy)LogManager.GetRepository();
			var logger = hierarchy.LoggerFactory.CreateLogger( "QueueManagerDefault" );
			logger.Hierarchy = hierarchy;

			logger.AddAppender( CreateFileAppender() );

			logger.Repository.Configured = true;
					
			hierarchy.Threshold = Level.All;
			logger.Level = Level.All;

			return new LogImpl( logger );
		}

		private IAppender CreateFileAppender()
		{
			//var appender = new RollingFileAppender
			//{
			//	Name = "defaultAppender",
			//	File = @"C:\QueueManager.DEV.log",
			//	AppendToFile = true,
			//	RollingStyle = RollingFileAppender.RollingMode.Composite,
			//	MaxSizeRollBackups = 9,
			//	MaximumFileSize = "10000KB",
			//	StaticLogFileName = true,
			//	Layout = new log4net.Layout.PatternLayout( "%date %5level %logger - %message%newline" )
			//};
			string logName= "EventLogNameQueueManagerDefault";
			string source =  Process.GetCurrentProcess().MainModule.FileName;
			if( !EventLog.SourceExists( source ))
			{
				EventLog.CreateEventSource(source, logName );
			}
			var appender = new EventLogAppender
			{
				Name = "NameQueueManagerDefault",
				Layout = new log4net.Layout.PatternLayout( "%date %5level %logger - %message%newline" ),
				LogName = logName,
				ApplicationName = "AppNameQueueManager"
			};
			appender.ActivateOptions();
			return appender;
		}

Debugt habe ich schon und es wird auch der im Code erstellte Logger verwendet.
Den Fehler vermute ich beim Erstellen des Appenders, da wenn ich einen Appender für ein RollingTextFile erstelle, geloggt wird.

Viele Güße und danke schon mal im vorraus.

25.01.2015 - 15:04 Uhr

Danke für den Tipp.
Werde ich mir mal anschauen.

23.01.2015 - 15:24 Uhr

@Plain: Ich muss das für alle ANR machen.. Dh die gesamte Liste iterieren.. Wenn ich das nun per Update machen würde, hätte ich folgendes Problem:

Mal angenommen ANR001 ist zwei Mal in der Zwischentabelle enthalten ANR001 Grp: 17 / ANR001 Grp: 20

Wenn ich nun das Update ausführe, wird er den ersten Datensatz auf ANR001 Grp: 1 ändern.. Wenn er nun versucht, den zweiten Datensatz auch auf ANR001 Grp: 1 zu ändern, bricht er ja mit einem Fehler ab (Wäre ja ein doppelter PK)..

Den Fehler hast du ja weiter oben so beschrieben.
Das könntest du aber lösen, in dem du in deinem Unterselect nach der ID von GRP sortierst. Dann ist das erste, wenn vorhanden mit der ID=1.

Erstelle doch eine Variable und weiße ihr mit einem Select den Wert von der ersten ID GRPID zu die es für die ANRID gibt.

Wenn du es für alle IDs machen musst, die es in Tabelle "1: Adressen und DisplayType" gibt und du es nicht manuell machen möchtest, solltest du mal nach Cursor suchen, das scheint das zu sein, was du brauchst.

http://stackoverflow.com/questions/18513986/how-to-write-a-foreach-in-sql-server

23.01.2015 - 13:30 Uhr

UPDATE ....
WHERE ID= BekannterWert AND ID2 = (SELECT TOP(1) ID2 FROM...WHERE...)

Oder statt mit einer Unterabfrage mit einem Join

23.01.2015 - 13:17 Uhr

Ich benutze WebForms.
Die Oberfläche ist an sich auch getrennt von der Logik, allerdings muss ich der Benutzeroberfläche doch mitteilen, dass sie auf das Event reagieren soll oder?

Da ich erst noch am einarbeiten habe ich es jetzt erst mal so als kleinen Test gemacht.
Geplant ist dann allerdings, eine Methode bzw. Skript aufzurufen, dass sich auserhalb von Site.Master befindet, sodass es wieder getrennt ist. Oder ich versuche eine Methode aus der Logik zu übergeben, falls das möglich ist. Da muss ich mich aber noch mehr einlesen.
Oder sollte man das auch nicht machen?

Das aktuell ist quasi mein Spielprojekt, zum Testen und besser verstehen, unabhängig von "schöner" Programmierung.

23.01.2015 - 13:11 Uhr

Wieso erstellt du nicht einfach eine Unterabfrage.
In der Unterabfrage suchst du nach deiner bekannten ANR und wählst davon nur die erste Zeile aus (Top(1)).

23.01.2015 - 12:51 Uhr

Das ganze mache ich aktuell nur etwas umm ich in ASP.NET einzuarbeiten.
Learning by burning.
Daher hatte ich den Code, so funktiniert er bei mir sowohl in Chrome als auch in FF.
Nach dem einfügen halt leider nicht.
Habe noch mehr rumprobiert und so läuft es:


<head runat="server">
  ....
    <script>
        function testFunction() {
            return "Any string value here forces a dialog box to \n" +
                 "appear before closing the window.";
        }
        window.onbeforeunload = testFunction;
    </script>
</head>
<body onbeforeunload=" return testFunction()">

Aber wieso, bei

 
<head runat="server">
....
 <script>
        function closeIt() {
            return "Any string value here forces a dialog box to \n" +
                 "appear before closing the window.";
        }
        window.onbeforeunload = closeIt;
</script>
    
</head>
<body onbeforeunload= "testFunction()">

   <script>
        function testFunction() {
            return "jojo";
        }
 
    </script>

Der String von testFunction genommen wird und nicht von closeIt verstehe ich immer noch nicht.
Naja. Es läuft ja jetzt irgendwie 😄
Danke für die Hilfe.

23.01.2015 - 12:27 Uhr

Danke für die Antwort.
Sow ie ich das verstanden habe müsste es ja wie folgt funktionieren:


<body onbeforeunload="testFunction()">

   <script>
        function testFunction() {
            return "jojo";
        }
    </script>

Wenn ich das script im Header aber weg lassen funktioniert es immer noch nicht. Auch Wenn ich


<body onbeforeunload="testFunction()">

   <script>
        function testFunction() {
            return "jojo";
        }
    </script>
window.onbeforeunload = testFunction;

einge. Läuft es nicht.
Was mich so verwirrt, ist, dass der Code im Header, doch eigentlich nichts damit zu tun hat oder?
Ich meine die fuction heißt anders, es wird ein anderer String zurück gegeben und trozdem erscheint der string der in "testFunction" zurück gegeben wird.

23.01.2015 - 11:53 Uhr

Hi,
ich habe aktuell ein Verständnisproblem.
Ich möchte fragen, ob die Website wirklich verlassen werden soll.
Nach kurzem googlen wusste ich, dass ich es mit onbeforeunload machen muss.
Also habe ich den body-Tag erweitert.


<body onbeforeunload=" return testFunction()">

   <script>
        function testFunction() {
            return "jojo";
        }
    </script>

Leider hatte dies immer noch nicht funktiniert. Erst nachdem ich im Header folgendes einfüge funktioniert es:


<script>
        function closeIt() {
            return "Any string value here forces a dialog box to \n" +
                 "appear before closing the window.";
        }
        window.onbeforeunload = closeIt;
</script>

Dann wird die NAchricht "jojo" angezeigt und ich werde gefragt, ob ich die Seite verlassen möchte.
Entferne ich einens der beiden Codeteile werde ich nicht mehr gefragt.
Wieso? Kann mir das einer erklären oder kennt eine Quelle?

Viele Grüße

26.08.2014 - 15:52 Uhr

Oh man 8o, wieblöd. Danke.
Dann suche ich mal nach einer Möglichkeit zusätzlich zur Wildcard nach null zu suchen, falls kein Suchkriterium eingetragen wurde.

26.08.2014 - 15:01 Uhr

Hallo zusammen, aktuell schreibe ich ein Tool, dass auf eine Lokale Datenbank zugreift, die ich mit Visual Studio 2012 erstellt habe.
Ich habe erst mal ein paar Testdaten per Handeingefügt um den Hauptteil des Programmes zu entwickeln. Die Daten befinden sich im Anhang.
Ich versuche eine Suche mit LINQ to SQL durchzuführen.
Wird bei einem Suchbegriff nichts angegeben wird nach allem, also "%" gesucht.
Es kann nach CompanyName und VocationalArea gesucht werden, welche sich bei in der Tablle Workplacements befinden.
Außerdem kann nach Group gesucht werden, wasin der Tabelle Students vorhanden ist.
Nun habe ich als Suchkriterium "Com1" eingegeben, wobei mir als eEgebniss der Arbeitsplatz mit der ID 2 zurückgegeben wird, was auch korrekt ist. Suche ich nun nach"Com2" wird kein Ergebniss zurück geliefert. Jetzt weiß ich leider nicht woran es liegt. Debugt habe ich schon und auch da SQL Statement mitgelogt.

ELECT [t0].[WorkplacementID], [t0].[CompanyName], [t0].[PostalCode], [t0].[City], [t0].[Street], [t0].[ContactPerson], [t0].[Department], [t0].[Vocational Area] AS [VocationalArea]
FROM [Workplacements] AS [t0]
WHERE ([t0].[CompanyName] LIKE @p0) AND ([t0].[Vocational Area] LIKE @p1) AND ([t0].[WorkplacementID] IN (@p2, @p3, @p4, @p5))
-- @p0: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [com1]
-- @p1: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [%]
-- @p2: Input Int (Size = -1; Prec = 0; Scale = 0) [2]
-- @p3: Input Int (Size = -1; Prec = 0; Scale = 0) [2]
-- @p4: Input Int (Size = -1; Prec = 0; Scale = 0) [3]
-- @p5: Input Int (Size = -1; Prec = 0; Scale = 0) [5]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.18408

Der Code der bei der Suche mit "com2" gelogt wird ist der folgende:

SELECT [t0].[WorkplacementID], [t0].[CompanyName], [t0].[PostalCode], [t0].[City], [t0].[Street], [t0].[ContactPerson], [t0].[Department], [t0].[Vocational Area] AS [VocationalArea]
FROM [Workplacements] AS [t0]
WHERE ([t0].[CompanyName] LIKE @p0) AND ([t0].[Vocational Area] LIKE @p1) AND ([t0].[WorkplacementID] IN (@p2, @p3, @p4, @p5))
-- @p0: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [com2]
-- @p1: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [%]
-- @p2: Input Int (Size = -1; Prec = 0; Scale = 0) [2]
-- @p3: Input Int (Size = -1; Prec = 0; Scale = 0) [2]
-- @p4: Input Int (Size = -1; Prec = 0; Scale = 0) [3]
-- @p5: Input Int (Size = -1; Prec = 0; Scale = 0) [5]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.18408

Er unterscheidet sich eigenlich nicht, von der ersten Abfrage. Mache ich gerade einen Denkfehler, oder habe ich etwas falsch verstanden?
Hier auch noch der Code, wie ich das SQL-Statement zusammensetzte:

 Table<Workplacement> wpTable = db.GetTable<Workplacement>();
            IQueryable<Workplacement> resultWP = from wp in wpTable
                                                 where SqlMethods.Like(wp.CompanyName, companyName)&&
                                              SqlMethods.Like(wp.VocationalArea,area)&&
                                             resultWorkplacmentsIDList.Contains(wp.WorkplacementID)
                                               select wp;

Danke schon mal im vorraus.

23.07.2014 - 09:18 Uhr

Wieso verwendest du bei Möglichkeit 2 imnmer noch zwei foreach schleifen und löschst diese nicht direkt in deiner ersten schleife?
Weitere Möglichkeit : LINQ

21.07.2014 - 08:19 Uhr

Im ersten Code änderst den Zustand deiner bool Variable nur dann, wenn du einen Text zugewiesen hast. Bei deinem zweiten hingegen erhöhst du i nach jedem click, auch wenn der Text nicht geändert wurde. Istdas vielleicht der Fehler?
Also i++ quasi hinter das else setzen?


if (e.LeftButton == MouseButtonState.Pressed)
                        {
                            if (i%2 == 1)
                            {

                                TxtCoordX.Text = string.Format("X: {0}", x);
                                TxtCoordY.Text = string.Format("Y: {0}", y);
                                TxtCoordZ.Text = string.Format("Z: {0}", z);
                            }
                            else
                            {
                                TxtCoordX2.Text = string.Format("X: {0}", x);
                                TxtCoordY2.Text = string.Format("Y: {0}", y);
                                TxtCoordZ2.Text = string.Format("Z: {0}", z);
                            }
                            i++
                        }

16.07.2014 - 13:04 Uhr

Hast du mal geschaut, was in deiner XmlNodeList data alles drin ist? Vielleicht ist da ja schon der Fehler.

16.07.2014 - 10:51 Uhr

Klappt es wenn du auf ein Rectangle zeichnest und dann, wenn du den Text nicht mehr benötigst die Visibility auf hidden setzt?

14.07.2014 - 10:43 Uhr

Wenn ich es richtig verstanden habe, dann hat das Framework ja nur Auswirkungen auf das aussehend er Elemente. Also müssten die Methoden für z.B. Forms die gleichen sein.
Ruf doch beim schließen der Form2 Activate oder Focus auf.

11.07.2014 - 12:29 Uhr

Wie du RGBdaten eines Bildes einliest findest du in how can I read image pixels' values as RGB into 2d array?
Wie man sie ändert steht im MSDN Color.FromRgb-Methode
Das war zwei Minuten gegoogle

09.07.2014 - 13:04 Uhr

Ich würde den ersten String nehmen und in ein char-Array zerlegen. Dann durch das Array gehen und die einträge in ein Dictionary speichern bzw. hochzählen.
Dann durch jeden Eintrag gehen und mit Regex überprüfen, ob der Character genauso oft im zweiten String vorkommt, wie im Dictionary gespeichert.

09.07.2014 - 12:44 Uhr

Kannst du die Line-Klasse verwenden?
Ansonsten findest du hier vielleicht etwas.

09.04.2014 - 08:34 Uhr

Danke schon mal für deine Antwort
Es würde eine Null-Reference-Exception kommen, da

 QueueLogic.QueueCollection section2 = (QueueLogic.QueueCollection)ConfigurationManager.GetSection( "queueCollection" ); 

null liefert und ich mit section2 weiterarbeiten müsste, um die gewünschten Daten zu erhalten.
Ich habe leider keinen Ansatz, woran es liegen könnte, deshalb habe ich das ganze von einem anderen Programm nachgebaut, in dem es funktioniert, leider wird auch dort null zurück gelierfert.
Habe mich dabei an dem Post App.Config and Custom Configuration Sections orientiert.

Habe gesehen, dass ich folgenden Teil in der App.Config vergessen habe.


<section name="queueCollection" type="QueueChecker.Logic.QueueLogic.QueueCollection, QueueChecker.Logic"/>

Es ist allerddings keine Änderung. section2 ist weiterhin null

Hab es auch mal mit den AppSettings versucht, da ich die später auch noch benötige.
Also siet meine xml jetzt wie folgt aus:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<configSections>
	<!--
      name = This needs to match the name of the section that the settings are stored
      type = is a 2 part value.  Part 1 is the full path (namespace to the class that will hold
      this data).  Part 2 is the name of the assembly this class is found in.      
    -->
	<section name="queueCollection" type="QueueChecker.Logic.QueueLogic.QueueCollection, QueueChecker.Logic"/>
	</configSections>
	
	<queueCollection>
		<queueList>
			<add path ="path" interval ="5" maxMessages ="20"/>
		</queueList>
	</queueCollection>
	
	<appSettings>
		<add key ="sender" value = "a"/>
		<add key ="addressee" value = "b"/>
	</appSettings>	
	
</configuration>

Diese wollte ich dann mit

ConfigurationManager.AppSettings["sender"]

auslesen. Aber hier kommt ebenfalls null.

Habe auch noch mal die App.config aus dem Tutorial verwendet. Und die Klasse so kopiert und die namespaces angepasst. Auch hier wird null zurück geliefert

Habe die Lösung gefunden. Für alle die es auch mal benötigen.
Ich hatte die Logik, mit dem einlesen der .config und der config selbst in einer eigenen Klassenbibliothek.
Als ich dann die App.config als Link in mein Startprojekt eingefügt habe, hat es funktioniert

08.04.2014 - 16:43 Uhr

Ich versuche gerade die App.Config auszulesen.
Das hatte in einem anderen Programm schon mal geklappt aber in diesem leider nicht.
Habe es auch mal versucht genau so nachzu bilden wie in dem anderen Programm, wollte aber dennoch nicht.
Meine Config sieht wiefolgt aus

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<queueCollection>
		<queueList>
			<add path ="path" interval ="5" maxMessages ="20"/>
		</queueList>
	</queueCollection>	
</configuration>

Um das nun auszulesen habe ich folgende Klassen erstellt

Für QueueCollection

	internal class QueueCollection : ConfigurationSection
	{
		[ConfigurationProperty( Strings.NODE_QUEUELIST )]
		internal QueueList QueueList
		{
			get { return ( (QueueList)( base[Strings.NODE_QUEUELIST] ) ); }
		}
	}

Für QueueList

[ConfigurationCollection( typeof( Queue ) )]
	internal class QueueList : ConfigurationElementCollection
	{
		protected override ConfigurationElement CreateNewElement()
		{
			return new Queue();
		}
		protected override object GetElementKey( ConfigurationElement element )
		{
			return ( (Queue)element ).Path;
		}

		internal Queue this[int idx]
		{
			get { return (Queue)BaseGet( idx ); }
		}
	}

Und für die eigentliche Queue, also "add"

class Queue : ConfigurationElement
	{
		[ConfigurationProperty(Strings.ATTRIBUTE_PATH, IsKey = true, IsRequired = true )]
		internal string Path
		{
			get{return ( (string) (base[Strings.ATTRIBUTE_PATH]));}
			set { base[Strings.ATTRIBUTE_PATH] = value; }
		}

		[ConfigurationProperty( Strings.ATTRIBUTE_INTERVAL, IsKey = false, IsRequired = true )]
		internal string Interval
		{
			get { return ( (string)( base[Strings.ATTRIBUTE_INTERVAL] ) ); }
			set { base[Strings.ATTRIBUTE_INTERVAL] = value; }
		}

		[ConfigurationProperty( Strings.ATTRIBUTE_MAXMESSAGES, IsKey = false, IsRequired = true )]
		internal string MaxMessages
		{
			get { return ( (string)( base[Strings.ATTRIBUTE_MAXMESSAGES] ) ); }
			set { base[Strings.ATTRIBUTE_MAXMESSAGES] = value; }
		}
	}

Die Sektion versuche ich dann mit

QueueLogic.QueueCollection section2 = (QueueLogic.QueueCollection)ConfigurationManager.GetSection( "queueCollection" );

auszulesen. Allerdings kommt da immer null raus weshalb ich nicht weiter arbeiten kann.

Die Strings habe ich in folgender Klasse gespeichert

internal class Strings
	{
		//Names from Attributes from Queues
		internal const string ATTRIBUTE_PATH = "path";
		internal const string ATTRIBUTE_INTERVAL = "interval";
		internal const string ATTRIBUTE_MAXMESSAGES = "maxMessages";

		//Nodenames
		internal const string NODE_QUEUELIST = "queueList";
08.04.2014 - 16:33 Uhr
Thread thread2 = new Thread( delegate(){ScanPorts(1);} );
06.11.2013 - 16:06 Uhr
foreach( DataGridViewRow row in dataGridView1.Rows )
			{
				DataGridViewComboBoxCell cell = (DataGridViewComboBoxCell)row.Cells[0];
				BindingList<string> list = new BindingList<string>();
				cell.DataSource = list;			
				list.Add( row.Index.ToString() );
			}

Ich bin in diesem Fall einfach durch jede Reihe des Grid gegangen um habe für jede ComboBoxZelle eine eigene DataSource hinzugefügt. Der Liste habe ich zum überprüfen den Zeilenindex zugewiesen.

06.11.2013 - 15:46 Uhr

Hallo, ich habe folgende XSD Datei mit der ich eine XML Datei validieren möchte.

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="BookList" type ="Media">

</xs:element>
		<xs:complexType name ="Media">	
			<xs:choice maxOccurs="unbounded" minOccurs="0">		
				<xs:element name="Book" maxOccurs="unbounded" minOccurs="0" >
					<xs:complexType>
						<xs:choice>
							
							<xs:element name="ISBN" minOccurs="0" maxOccurs="1">
								<xs:simpleType>
									<xs:restriction base="xs:string">
										<!--ISBN-13 '|' means "or nothing"-->
										<xs:pattern value="([0-9]{3}[\-][0-9]{1,5}[\-][0-9]{2,7}[\-][0-9]{2,7}[\-][0-9]{1})|"/>
										<!--ISBN-10 '|' "means or nothing"-->
										<xs:pattern value="([0-9]{1,5}[\-][0-9]{2,7}[\-][0-9]{2,7}[\-][0-9Xx]{1})|"/>
									</xs:restriction>
								</xs:simpleType>
							</xs:element>
							<xs:element type="NonEmptyString" name="Author" minOccurs="1" maxOccurs="1" nillable="false"/>
							<xs:element type="NonEmptyString" name="Title" minOccurs="1" maxOccurs="1" nillable="false"/>
							<xs:element  name="YearOfPublication" minOccurs="0" maxOccurs="1" nillable="true">
								<xs:simpleType>
									<xs:restriction base="xs:string">
										<xs:pattern value="\s*[0-9]*"/>
									</xs:restriction>
								</xs:simpleType>
							</xs:element>
							<xs:element type="xs:string" name="Genre" minOccurs="0" maxOccurs="1" nillable="true"/>
							<xs:element type="xs:string" name="Bond" minOccurs="0" maxOccurs="1" nillable="true"/>
							<xs:element type="xs:string" name="Catchword" minOccurs="0" maxOccurs="unbounded" nillable="false"/>							
						</xs:choice>					
					</xs:complexType>				
				</xs:element>



				<xs:element name="CD" maxOccurs="unbounded" minOccurs="0" >
					<xs:complexType>
						<xs:choice >
							<xs:element type="NonEmptyString" name="Interpret" minOccurs="1" maxOccurs="1" nillable="false"/>
							<xs:element type="NonEmptyString" name="Title" minOccurs="1" maxOccurs="1" nillable="false"/>
							<xs:element  name="YearOfPublication" minOccurs="0" maxOccurs="1" nillable="true">
								<xs:simpleType>
									<xs:restriction base="xs:string">
										<xs:pattern value="\s*[0-9]*"/>
									</xs:restriction>
								</xs:simpleType>
							</xs:element>
							<xs:element type="xs:string" name="Genre" minOccurs="0" maxOccurs="1" nillable="true"/>
							<xs:element type="xs:string" name="Catchword" minOccurs="0" maxOccurs="unbounded" nillable="false"/>
						</xs:choice>
					</xs:complexType>
				</xs:element>
			</xs:choice>
		</xs:complexType>

	<!-- Non-empty string -->
	<xs:simpleType name="NonEmptyString">
		<xs:restriction base="xs:string">
			<xs:whiteSpace value="collapse"/>
			<xs:minLength value="1" />
			<xs:pattern value=".*[^\s].*" />
		</xs:restriction>
	</xs:simpleType>
</xs:schema>




Da die Reihenfolget der Elemente egal sein soll habe ich choice genommen. Das Funktioniert auch solange ich maxoccurs auf unbounded setze. Dabei wird allerdings maxouccurs der elemente nicht mehr berücktsicht. Wenn ich in meiner XML Datei zum Beispiel zwei Titel habe, sollte die Validierung fehlschlagen.
Lösche ich das aus choice raus, so schlägt die Validierung fehl, auch wenn die XML Datei korrekt ist.

Hier mal eine XML Datei die gültig sein soll:

<BookList>
  <Book>
    <ISBN>333-33-33-X</ISBN>
    <Author>Joanne K. Rowling</Author>
    <Title>Harry Potter und die Kammer des Schreckens</Title>
    <YearOfPublication>1999</YearOfPublication>
  </Book>
  <Book>
    <ISBN>444-44-44-x</ISBN>
    <Author>Joanne K. Rowling</Author>
    <Title>Harry Potter und der Gefangene von Askaban</Title>
  </Book>
  <Book>
    <ISBN>111-111-11-11-1</ISBN>
    <Author>Joanne K. Rowling</Author>
    <Title>Harry Potter und der Stein der Weisen</Title>
    <YearOfPublication>1998</YearOfPublication>
    <Genre>Fantasy</Genre>
    <Catchword>spannend</Catchword>
  </Book>
  <Book>
    <Author>Joanne K. Rowling</Author>
    <Title>Harry Potter und der Halblutprinz</Title>
    <YearOfPublication>1999</YearOfPublication>
  </Book>
</BookList>

Meine Frage ist nun ob ich die Reihenfolge der Elemente beliebige halten kann, ohne maxoccurs und so zu überschreiben.

Gruß
kunsti

04.11.2013 - 12:50 Uhr

Das is Frame hat sich erledigt, ich wollte es nur stehen lassne, vielleicht bringt es jemanden auf den richtigen Gedanken.

Danke für eure Antorten.

@TH69 
Ich habe es wie beschrieben versucht, leider hat es nicht funktioniert. 
Im Beispiel wird als Ausgabe 
[xml]<Employee xsi:type = "Manager">
        <Name>Ann</Name>
        <Level>3</Level>
    <Employee>[/xml] 
angegeben. 
In meiner Datei verwende ich aber kein type =....
Kann das damit zusammenhängen?
Allerdings habe ich in dem Artikel gelesen, dass man zum erstellen eines Flachen Arrays auch 
[csharp] [XmlElement][/csharp]
verwenden kann.
Dies habe ich auch versucht, zuerst mal nur für Bücher, also sieht es jetzt wie folgt aus:
[csharp][XmlElement("Book")]
public Medium[] allMedia;[/csharp]
Damit bin ich schon mal einen Schritt weiter gekommen und es werden die Bücher erkannt. Die dazugehörigen Attribute werdne allerdingsnur dann erkannt, wenn man diese markiert. Ich dachte, wenn die Probertyname gleich mit dem Attribut ist müsste man dies nicht machen.

[csharp]public class Medium
	{

		public List<string> Catchwords
		{
			get;
			set;
		}
		[XmlElement( "Title" )]
		public string Name
		{
			get;
			set;
		}
		[XmlElement ("Author")]
		//[XmlAttribute( "Interpret" )]
		public string Publisher
		{
			get;
			set;
		}
		[XmlElement( "YearOfPublication" )]
		public string YearOfPublication
		{
			get;
			set;
		}
		[XmlElement( "Genre" )]
		public string Genre
		{
			get;
			set;
		}
	}[/csharp]

[csharp]	[XmlRootAttribute ("BookList")]
	public class MediumList
	{		
		[XmlElement("Book")]		
		public Medium[] allMedia;
	}[/csharp]

Nun bleibt die Frage wie ich es für Bücher, als auch CD machen kann. Und ISBN und Bindung ebenfalls als Knoten erkannt werdne, da diese im Moment noch nicht erkannt werden.
Ich habe versucht zwei XMLElemente hintereinander zuzuweisen, was leider nicht funktioniert.
[csharp][XmlElement("Book"), XmlElement("CD")][/csharp]
Es wird eine Exception geworfen.


@Gnozo
Strukturen wollte ich nicht verwenden, da im eigentlich Programm noch einge Methoden hinzukommen. Dafür werden im MSDN dann wieder Klassen empfohlen.

Gruß
kunsti


Ok, nun habe ich die Lösung gefunden und werde sie eich natürlich nicht vorenthalten. Vielleicht gibt es ja jemanden der ein ähnliches Problem hat.

[XmlRootAttribute ("BookList")]
	public class MediumList
	{
		[XmlElement( ElementName= "Book", Type = typeof(Book))]
		[XmlElement( ElementName= "CD", Type = typeof( CD ) )]
		public Medium[] allMedia;

		
	}

Den Rest habe ich wie oben gepostet gelassen.

So nun habe ich auch für mein anderes Problem eine Lösung gefunden.

Ausschnit aus der Klasse CD

[XmlElement( ElementName = "Interpret" )]
		public string Interpret
		{
			get { return this.Publisher; }
			set { this.Publisher = value; }
		}

Ausschnitt aus der Klasse Book

[XmlElement( ElementName = "Author" )]
		public string Author
		{
			get { return this.Publisher; }
			set { this.Publisher = value; }
		}	

Ausschnit aus der Klasse Medium

[XmlIgnoreAttribute]
		public virtual string Publisher
		{
			get;
			set;
		}
04.11.2013 - 11:25 Uhr

Hallo,
ich habe ein Programm erstellt, welches eine Liste von Büchern erstellt. Diese werden in einer .xml-Datei gespeichert. Das hat soweit auch alles geklappt. Nun soll ich aber noch CDs hinzufügen, die in der glechen Datei verwaltet werden. Das läuft eigentlich auch, allerdings lese ich im Augenblick die .xml Datei über den XMLReader ein mit

while( reader.Read() )

ein und prüfen dann die Knoten auf ihren Namen und weise dann je nachdem was es für ein Knoten ist einen bestimmt Wert zu. Am Ende erstelle ich ein Objekt von benötigten Typ.

Meine XML Datei sieht so aus:

<BookList>  
  <Book>
    <ISBN>111-111-11-11-1</ISBN>
    <Author>Joanne K. Rowling</Author>
    <Title>Harry Potter und der Stein der Weisen</Title>
    <YearOfPublication>1998</YearOfPublication>
    <Genre>Fantasy</Genre>
    <Bond>Hardcover</Bond>
    <Catchword>zauberhaft</Catchword>
  </Book>
  <CD>
    <Interpret>Die Toten Hosen</Interpret>
    <Title>Strom</Title>
    <YearOfPublication>1998</YearOfPublication>
    <Genre>Rock</Genre>
    <Catchword>toll</Catchword>
	 <Catchword>super</Catchword>
  </CD>
</BookList>

CD hat eigentlich die gleichne Attribute wie Book, auser ISBN und Bond. Interpret und Author sind eigentlich das gleiche, ich habe es nur wegen der Übersichtlichkeit anders benannt.

Nun hätte ich es gerne etwas Variabler gestaltet. Und bin auf deserialisieren gestoßen. Dies klappt aber leider nicht so wie ich es gerne hätte.

Ich besitze eine Klasse Medium, welche die Basisklasse von CD und Book ist. Als Publisher hätte ich gerne, je nachdem ob es ein Buch ist oder nicht ein Interpret oder Author.

public class Medium
	{

		public List<string> Catchwords
		{
			get;
			set;
		}
		public string Name
		{
			get;
			set;
		}
		[XmlAttribute ("Author")]
		[XmlAttribute( "Interpret" )]
		public string Publisher
		{
			get;
			set;
		}
		public string YearOfPublication
		{
			get;
			set;
		}
		public string Genre
		{
			get;
			set;
		}
public class Book :Medium
	{

		public string ISBN
		{
			get;
			set;
		}
		public string Bond
		{
			get;
			set;
		}
	}
public class CD :Medium
	{
	}

Außerdem habe ich zum einlesen die Klasse MediumList, in der alle Medien der XML-Datei gespeichert werden sollen.

[XmlRootAttribute ("BookList")]
	public class MediumList
	{

		[XmlArrayAttribute( "BookList" )]
		public Medium[] allMedia;
	}
protected void Read( string filename )
		{
			XmlSerializer serializer = new XmlSerializer( typeof( MediumList ) );		
			serializer.UnknownNode += new XmlNodeEventHandler( serializer_UnknownNode );
			serializer.UnknownAttribute += new XmlAttributeEventHandler( serializer_UnknownAttribute );
			FileStream fs = new FileStream( filename, FileMode.Open );
			MediumList ml;
	
			ml = (MediumList)serializer.Deserialize( fs );

			Medium [] alleMedia = ml.allMedia;
			foreach( Medium m in alleMedia )
			{
				Book b;
				CD c;
				if( m.GetType().Name == "Book" )
				{
					b = (Book)m;
					Console.WriteLine( b.ISBN, b.Bond );
				}
				
				Console.WriteLine( m.Genre, m.Name, m.Publisher, m.YearOfPublication );
			}
		}

Das Problem ist, dass er die Knoten nicht erkennt und das Array allMedia = null ist.

Kann ich das ganze realisieren ohne den Aufbau der .xml-Datei zu realsieren oder muss ich diese überarbeiten?
Oder ist es ein Fehler in meinem Code?

Danke schonmal für die Hilfe

Gruß
kunsti