Laden...

Forenbeiträge von slide Ingesamt 49 Beiträge

03.08.2010 - 09:50 Uhr

Hallo,
mein ViewModel habe ich von INotifyPropertyChanged abgeleitet. Das Problem ist jedoch dass ich nicht direkt auf das ViewModel binden kann.

Ich hatte die Eingangs und Ausgangs-Liste im ViewModel als ObservableCollection angelegt, wenn ich diese allerdings binden wollte:

<ctrl:MyChooser Width="150" HorizontalAlignment="Left" Input="{Binding Source={x:Static Member=mdls:DataSource.Items}}"/>

bekam ich die Fehlermeldung:
Der 'MyChooser'-Typ enthält keine 'Input'-Eigenschaft.

Ich hatte dann auch versucht diese mit Properties und get/set im UserControl weiterzugeben:

public ObservableCollection<ItemClass> Input
        {
            get { return VM.Input; }
            set { VM.Input= value; }
        }
        public ObservableCollection<ItemClass> Output
        {
            get { return VM.Output; }
        }

Dann bekam ich jedoch die Meldung:
"Binding" kann nicht für die Eigenschaft "Input" vom Typ "MyChooser" festgelegt werden. "Binding" kann nur für eine "DependencyProperty" eines "DependencyObject" festgelegt werden."}

Und ich habe wirklich schon einige Sachen ausprobiert, jedoch kommt immer wieder irgendwo eine Fehlermeldung die mir sagt dass es so nicht geht. Die Beispiele die ich finde sind entweder keine UserControls, oder wenn es UserControls sind verwenden sie keine ViewModels oder es sind UserControls ohne Ein- und Ausgänge.

Den Link den du geschrieben hast, kenne ich und habe ich als Hilfe/Anleitung zum Erstellen der Komponente verwendet.

02.08.2010 - 16:15 Uhr

Hallo,
ich habe einen Block gebaut, der aus einer Liste von Elementen mit Hilfe einiger Optionen eine Auswahl trifft. Diesen hatte ich bisher als Ansammlung von Einzelteilen in einem MainWindow mit ViewModel im Einsatz (zum testen). Nun da er funktioniert wie ich möchte, würde ich dieses Teil gerne als UserControl erstellen, um es einfacher in einer richtigen Anwendung zu benutzen.

Ich finde jedoch trotz stundenlanger Recherche keine Möglichkeit wie die Liste aller Elemente(Eingang) sowie die Liste der ausgewählten Elemente (Ausgang), die im ViewModel bereits so existieren, nach außen bekannt mache, so dass ich diese beide Listen binden kann, wenn ich das UserControl einsetze.

Zum binden brauche ich DependencyProperties in der UserControl Klasse. Wenn ich jedoch deren nicht-readonly Properties an das ViewModel übergebe sind dies nur die Ergebnisse des GetValue der UserControl Klasse und somit neue Instanzen. Wenn ich also zu den ausgewählten elementen welche hinzufüge, füge ich sie nur dieser Instanz hinzu und die DependencyProperty bleibt unverändert.

Wenn ich das ViewModel von DependencyObject ableite und dort die DependencyProperties erstelle kann ich diese nicht nach oben durchgeben, da sie sonst dort nicht als DependencyProperty angesehen werden, da die registriereung ja in der Klasse des ViewModels stattgefunden hat.

Eingentlich möchte ich eine meiner Meinung nach sehr triviale Aufgabe lösen, jedoch finde ich nirgends einen Hinweis darauf wie das zu bewerkstelligen ist.

Wie bekomme ich ein UserControl mit bindbaren Listen, welche mit denen im ViewModel synchron sind?

Vielen Dank für jegliche Hilfe.

26.03.2010 - 10:59 Uhr

Hallo,
ich habe bei einer Seite ein Hilfesystem eingebaut, dass per Javascript(JQuery) ein Hilfefenster auf der Seite einblendet.
Um den entsprechenden Hilfetext anzuzeigen, dachte ich mir, es wäre das einfachste für jeden Controller (evtl. auch jede Kombination Controller/Action) eine Action anzulegen, welche den Hilfetext zurückgibt.
Jedoch weiss ich nicht, wie ich den controller und action namen dem Javascript bekannt mache.
Relative Urls gehen nicht, da server.de/ gleichzeitig auch server.de/Home und server.de/Home/Index entspricht. Direkt die Url an den Link zu übergeben, der das Fenster aufruft geht auch nicht, da die Funktion erst per JQuery mit $().toggle hinzugefügt wird.

Hat einer eine Idee? Oder gibt es sowieso eine bessere Möglichkeit, auf jeder Seite ein mögliches Hilfefenster anzuzeigen?

Vielen Dank,
slide

03.03.2010 - 13:02 Uhr

Leider hilft mir die HierarchyID nicht weiter. Sie wird nur verwendet um eine Hirarchie innerhalb einer Tabelle herzustellen.
Ich möchte die Daten schon in getrennten Tabellen haben. Alleine schon aus Performance-Gründen beim späteren Auslesen, sowie auch zur Übersichtlichkeit.
Das darüber geht eher in die Richtung dessen, was ich machen will.

Wobei mich dabei wundert, dass sie nicht wie ich:

INSERT INTO XYZ VALUES (Wert1,Wert2)
SET @ID = SCOPE_IDENTITY();

machen, sondern:

SELECT @ID = MAX(ID)+10 FROM XYZ;
INSERT INTO XYZ VALUES (@ID,Wert1,Wert2);

Das ist doch sehr gefährlich, wenn evtl. mehrere Einträge parallel eingefügt werden sollen. Oder verstehe ich da etwas nicht richtig? Oder sehen die es als so unwahrscheinlich an, dass da etwas dazwischen kommt, dass sie es ignorieren?

03.03.2010 - 10:48 Uhr

verwendetes Datenbanksystem: MS SQL Server 2008
verwendete Entwicklungsumgebung: Visual Studio 2010 RC

Hallo.
Ich suche die schnellste Möglichkeit einen Datensatz einer speziellen Struktur in die Datenbank einzupflegen.
Ich habe in einem .NET Programm einen Objektbaum mit ungefähr folgender Struktur(Bsp.):


Bericht
--Ersteller
  --Name
  --Abteilung
  --XYZ
--Datum
--Unterbericht1
  --Ersteller
  --Daten
    --XYZ
    --ZJY
    --???
      ...
--Unterbericht2
  --Ersteller
  --Daten
    --XYZ
    --ZJY

Nun möchte ich diesen möglichst performant in die Datenbank eintragen.
Aufgrund Tatsache, dass die Elemente aufeinander referenzieren müssen, wären normal sehr viele einzelne Anfragen nötig.

Satz "Ersteller" eintragen, Personen-ID bekommen,
Satz "Bericht" eintragen mit Referenz auf Personen-ID, dadurch Bericht-ID bekommen,
Sätze "Daten" eintragen, IDs bekommen,
Sätze "Unterbericht" erstellen mit Referenz auf die Sätze "Daten" und den übergeordneten "Bericht".
...
Bei entsprechend vielen Ebenen sind dass sehr viele Roundtrips an den Server.
Nur frage ich mich, geht es besser?
Ich habe bereits die Idee, bei einzelnen Unterknoten, die Daten für diesen direkt mit an die stored procedure zu übergeben.
Diese erstellt dann die eigentliche Entität, sowie die Untergeordnete mit einem Aufruf.
z.B. dbo.CreateReport(Datum, Erstellername, ErstellerAbteilung,...)
Dadurch kann ich ein paar Roundtrips verhindern. Gibt es eine noch bessere Möglichkeit?

Vielen Dank,
slide

02.03.2010 - 10:29 Uhr

Hallo,
ich habe heute mal etwas ausgiebiger getestet und das Verhalten ist bei weitem nicht mehr so stark ausgeprägt gewesen wie gestern. Das Problem ist, dass die Werte selbst bei gleicher Methode sehr stark schwanken. Wobei mir die ohne Parameter dennoch etwas schneller vorkommt.

Den Code kann ich leider nicht rausgeben. Ich habe ein Beispiel nachgebaut, bei dem der Unterschied allerdings nochmal sehr viel geringer ist. Bzw. sich ab und zu auch umkehrt.

Wahrscheinlich hatte ich gestern nur per Zufall längere Zeiten bei der Methode mit Parametern. Wobei man bei dieser Methode nicht mehrere Prozeduren mit einer Anforderung schicken kann, oder?

01.03.2010 - 17:26 Uhr

verwendetes Datenbanksystem: MS SQL-Server 2008

Hallo,
ich arbeite gerade am Datenbankzugriff eines Projekts. Über stored procedures werden verschiedene Objekte in der DB gespeichert. Verwendet wird C# und ein SqlCommand.

Durch mehrere Tests bin ich auf folgendes Verhalten gestoßen:
User mit Zusatzinformationen anlegen, 1 Row mit ca. 20 Columns.
Die stored procedure leitet bisher nur die Parameter an einen Insert-Befehl um.

Mit SqlCommand.CommandType = CommandType.StoredProcedure
und Parametern in SqlCommand.Parameters: 8ms

Mit SqlCommand.CommandType = CommandType.Text und
'EXEC UserCreate ...' im CommandText: 1ms

Das interessante ist jedoch, dass ich sogar 4 User per Text-Aufruf erstellen kann, und noch bei 1ms bleibe.

Gemessen wurde mit Stopwatch nur die Zeit des SqlCommand.ExcecuteNonQuery();

Nun die Frage: Wieso dauert der einmalige Aufruf mit Parametern 8mal so lang, wie der 4fache Aufruf ohne Parameter?

Kann man das beschleunigen?

Vielen Dank,
slide

24.02.2010 - 12:25 Uhr

Ja, die bisherige Lösung ist in LinqToXml geschrieben. Jedoch soll die Performance erhöht werden, was ja mit einem XmlTextReader möglich sein sollte.

24.02.2010 - 12:00 Uhr

Hallo.
Ich möchte ein Objekt mit den Daten aus einer Xml füllen. Dieses Objekt hat wiederrum Unter-Objekte.

Mini-Besipiel: (Tatsächliches Problem einiges Komplexer)
Xml:

<Book ID="100" Name="TestBook">
<Author ID="150" Name="TestAuthor"/>
</Book>

Und die Klassen:

class Book
{
  public long ID;
  public string Name;
  public Author BAuthor;
}
class Author
{
  public long ID;
  public string Name;
}

Für das Beispiel ist davon auszugehen, dass in der XML nur ein Buch steht.

In den Beispielen zum XmlTextReader wird immer eine große while(reader.read()) Schleife verwendet. Jedoch scheint mir das für diesen Zweck unpassend, da ja sowieo in der festen Reihenfolge der XML-Datei vorgegangen werden muss.
Bisher mache ich das daher ca. so:

reader.MovetoContent();

Book NBook = new Book();

reader.MoveToNextAttribute();
NBook.ID = reader.ReadContentAsLong();
reader.MoveToNextAttribute();
NBook.Name = reader.Value;

NBook.Author = new Author();
reader.read()
reader.MoveToNextAttribute();
NBook.Author.ID = reader.ReadContentAsLong();
reader.MoveToNextAttribute();
NBook.Author.Name = reader.Value;

Nun die Frage. Ist das so gut? Kennt ihr eine bessere/schnellere/kürzere Lösung für eine solche Aufgabe? Würdet ihr so etwas mit einer großen While-Schleife wie in den Beispielen lösen, und wenn ja, warum? Es kommt mir auf eine möglichst performante Lösung an.

Auserdem kommt mir das wie recht viel Code für das übertragen so weniger Daten vor. Ich muss ja noch Code schreiben um evtl. fehlende (optionale) Einträge abzufangen.

17.12.2009 - 14:48 Uhr

Hallo.
Ich habe ein ASP MVC Projekt, in dem ich einige Seiten per custom Membership- und RoleProvider über FormsAuthentication und mit Hilfe des [Authorize] Attributes vor unerlaubtem Zugriff schütze.

Dabei tritt jedoch das Problem auf, dass es so scheint, als würde der User nur einmal (beim einloggen) überprüft (ValidateUser).
Wird der User im Adminpanel gesperrt (IsLocked = true), kann der Nutzer trotzdem noch bis zum Ablauf des Cookies weiter jegliche Seite anschauen.

Dies ist in meinem Fall unerwünscht.
Ich hätte es gerne so, dass der User, sobald die IsLocked Eigenschaft in der DB gesetzt wird, keine Seite mehr angezeigt bekommt.
Jedoch wird beim Seitenaufruf keine der Methoden des MembershipProviders aufgerufen (ValidateUser oder GetUser) mit der die Webanwendung prüfen könnte, ob der User gelockt ist.

Wie kann ich das bewerkstelligen, ohne auf jeder Seite den User manuell zu überprüfen?

Vielen Dank schonmal,
slide

19.11.2009 - 14:13 Uhr

wie gesagt: prinzipiell und von den Signaturen her sehe ich kein Prob

  
      private class SqlUser { }  
      private class User { }  
      private class SqlComment { }  
      private class Comment { }  
      private void DoSqlMap<T, Tsql>(T entity, Tsql sqlEntity) { }  
      public void Create<T>(T entity) {  
         if(entity is User) DoSqlMap(entity, new SqlUser());  
         else if(entity is Comment) DoSqlMap(entity, new SqlComment());  
      }  

Ja, das ist nicht schlecht. Jedoch brauche ich noch eine Referenz auf das Sql-Object, um es später in die DB einzufügen.
Ich habe es jetzt ca. so gelöst:

public void Create<T>(T entity) {
         object SqlEntity = null;
         if(entity is User){
                  SqlEntity = new SqlUser();
                  DoSqlMap(entity, SqlEntity as SqlUser);
         }
         else if ...

Danke für die Hilfe

19.11.2009 - 10:14 Uhr

Ich kenne mich mit LinqToSQL jetzt zuwenig aus um dir einen besseren Weg vorzuschlagen. Warum überträgst du die Werte von einem "normalen" Objekt in ein LinqToSQL-Objekt?

Da ich dann per
DataContext.InsertOnSubmit(SqlUser); DataContext.SubmitChanges();
den User in die Datenbank eintragen kann.

Das erspart einem die Arbeit mit DataSets oder selbst generierten SQL-Abfragen. Meine Software ist nach SOA entwickelt und daher verwende ich intern 'normale' Objekte und in meinem DataService die LinqToSql Objekte die eben zum arbeiten mit LinqToSql nötig sind. Somit kann ich später auch einen anderen DataService entwickeln, der mit den selben 'normalen' Objekten arbeitet, diese jedoch z.B. in einen anderen Datenbanktyp einträgt.

Um das Kernproblem nochmal zu beschreiben:
Ich habe Momentan für jedes Entity(habe ca. 10 Stück) eine Methode die außer den Typen eigentlich identisch mit den anderen ist.

D.h. 10x 40 Zeilen Code die sich jeweils nur durch 3-4 Wörter unterscheiden.
Diese Wörter sind eben die Typangaben.
Bei der einen kommt ein User rein, ein SqlUser wird erstellt und ein Mapping wird durchgeführt.
Bei der anderen kommt ein Comment rein, ein SqlComment wird erstellt und ein Mapping wird durchgeführt.
Mein Ziel ist es jetzt nur noch eine Methode zu haben, die dann von mir aus auch 10 Zeilen mehr hat. Einfach der Wartbarkeit halber.

Viele Grüße,
slide

18.11.2009 - 15:45 Uhr

Hallo.
Ich habe bisher bei der Datenbankarbeit in meinem aktuellen Projekt für jeden Typ eine Methode, die folgendes macht:

  1. Erstelle LinqToSql-Objekt
  2. Übertrage Werte von Original-Object in LinqToSql-Objekt.
  3. Speichere LinqToSql-Objekt in Datenbank.

Nun, da ich die zig Funktionen, die alle ziemlich gleich aussehen allerdings durch eine generische Methode ersetzen will stehe ich vor folgendem Problem:
Ich muss den entsprechenden SqlTyp zum Original-Typ finden, und ein Objekt dieses Typs erstellen.

Mein bisheriger Ansatz:

public void Create<EntityType>(EntityType Entity)
{
   Type NewType;
   if (typeof(EntityType) == typeof(User)) NewType = typeof(SqlUser);
   ... 
   
   object SqlEntity = Activator.CreateInstance(NewType);
   
   DoSqlMap(Entity, SqlEntity);
   ...
}

Die Methode DoSqlMap ist generisch und für alle möglichen Kombinationen implementiert.
Jedoch hat das Objekt SqlEntity den Typ 'object' und nicht den "NewType".

Wie kann ich dies ändern?

Ein einfacher Cast (NewType)SqlEntity funktioniert nicht. Ebenso funktioniert ein System.ComponentModel.TypeConverter auch nicht. Dieser teilt mir dann nämlich lustigerweise mit, dass ein SqlUser nicht in einen SqlUser konvertierbar ist.

Wenn man schon generische Klassen hat, muss es doch auch möglich sein, darin ein Objekt eines bis zur Laufzeit unbekannten Typs zu erstellen. Oder etwas nicht?

Vielen Dank schonmal für jegliche Hilfe,
slide

20.10.2009 - 14:45 Uhr

Hallo.
Ich arbeite an einem Projekt, bei dem ich Daten aus einer XML importieren muss.
Viele der XML-Werte sind von einem Typ, der nicht string ist.
Die sichere umwandlung fällt mir da schwer, vor allem ohne if etc. zu verwenden.(Und das geht innerhalb des Linq Ausdrucks nunmal nicht)

Das ganze findet innerhalb einer Linq Abfrage statt:

from Person in XDoc.Elements("Person")
select new PersonObj{
ID = ...
DayOfBirth = ...
...
...
}

Bsp:
Xml-Feld DateOfBirth:
Kann "Nicht vorhanden" sein.
Kann leer sein.
Wenn vorhanden und nicht leer, ist es Datetime mit speziellem Format.

Bisher wandle ich wie folgt, was ich allerdings etwas hässlich finde:

DayOfBirth = Person.Element("DOB") == null? DateTime.MinValue : String.IsNullOrEmpty(Person.Element("DOB").Value)? DateTime.MinValue : DateTime.ParseExact(Person.Element("DOB").Value, DateFormat, FProvider)

Ähnlich sieht es selbst bei einfachen typen aus. Z.B. short
ID = Person.Element("ID") == null? -1 : String.IsNullOrEmpty(Person.Element("ID"))? -1 : (short) Person.Element("ID")

Selbst wenn ich die Typen durch nullable Typen ersetze fällt die Prüfung nicht einfacher aus. Denn die Typwandlung zu z.B. short? funktioniert nicht mit einem leeren String. Um aber zu prüfen ob er leer ist, muss ich auf Element.Value zugreifen, und dazu muss ich prüfen, ob Element null ist.

Kann man irgendwie recht einfach diese Prüfung machen? :
Element nicht vorhanden oder string darin leer, dann dieser wert
sonst Typumwandlung von vollem string zu ... Typ

Danke schonmal,
slide

15.10.2009 - 10:40 Uhr

Hallo.
Ich bin dabei ein Projekt in eine serviceorientierte Architektur umzuwandeln.
Die ersten Services sind erstellt. Die Services sind in einzelnen Projekten angelegt, da man so besser einzeln daran arbeiten kann und damit ich eben die einzelnen dlls exportieren kann. Es soll später möglichst nur die Haupt-Webapplication im Verzeichnis des Webservers liegen und die Services als signierte dlls im Global Assemlby Cache. Nun stellt sich jedoch die Frage, wie ich diese Services am einfachsten miteinander verwenden kann.

Konkret:
Ich habe ein Projekt Entities in dem meine Entities definiert sind, ein Projekt SqlDataService in dem eine gleichnamige Klasse existiert die ein Interface IDataService implementiert. In einem dritten Projekt habe ich eine Klasse AspNetMembershipProvider, die wie der Name sagt einen custom MembershipProvider implementiert.
Das Hauptprojekt ist eine MVC Anwendung.

Die Entities kann ich einfach per using einbinden. Diese benötigen ja auch keinerlei Konfiguration. Probleme habe ich jedoch mit dem SqlDataservice. Dieser benötigt einen Connectionstring zur DB. Diesen soll er irgendwie aus der web.config der Hauptanwendung bekommen. Ebenfalls muss dem MembershipProvider mitgeteilt werden, dass er eben diesen DataService verwenden soll.

Vorstellen würde ich mir das ähnlich wie die Providerkonfiguration(PseudoXml):

<Dataservices>
<add name="DataServiceSql" type="xxx.yyy.SqlDataService" connectionString="..." ... >
<add name="DataServiceXzy" type="xxx.yyy.XzyDataService" ... >
</Dataservices>
<Membership>
<Providers>
<add name="..." type="..." dataservice="DataServiceSql">
</Providers>
</Membership>

Ist das so möglich, und wenn ja wie?
Und falls nicht, wie konfiguriere ich dann die verschiedenen Services?

Vielen Dank für jegliche Hilfe,
slide

06.10.2009 - 11:48 Uhr

Hallo,
ich verwende in meinem Projekt Custom Providers für Membership- und Role-Management. Dabei stört mich jedoch das Exception-Handling.

Ich habe meine Anwendung komplett so aufgebaut, dass Exceptions von unten nach oben weitergegeben werden, und dabei in jeder Stufe in eine neue gepackt werden.

Somit habe ich dann im Controller dann z.B. eine Exception "Fehler:Bitmapgenerierung" mit innerException "Fehler:Kann auf Datenbank nicht zugreifen" mit innerException "SQLException XY"
So sollte man meines Wissens nach Exception-Handling auch machen.

Nur geht dass bei den Providern nicht immer so. Bei validateUser geht es gut, da ich die Methode selber aufrufe, jedoch habe ich Seiten die ich z.B. mit [Authorize] vor Zugriff schütze.

Dort führt der Webserver dann von sich aus z.B. die GetRolesForUser-Methode aus. Wenn in dieser nun ein Datenbankfehler geschieht, und ich eine Exception dafür werfe, wird diese nicht behandelt und erzeugt eine hässliche Standard-ASP-Fehlerseite.

Gibt es irgendwie eine Möglichkeit, diese Fehler abzufangen und an den Controller oder notfalls auch eine andere Funktion weiterzugeben um dort dann selbst eine Fehlerseite zu generieren?

Wie funktioniert das dann, wenn ich die Provider per IIS Management Konsole verwende. (Keine Fehlerseite darstellbar)

Oder gehe ich an die Sache irgendwie ganz falsch ran?

Vielen Dank schonmal,
slide

01.10.2009 - 14:32 Uhr

Hallo,
ich habe für mein Projekt einen eigenen Role und MembershipProvider geschrieben. Beide sind vom Original abgeleitet und funktionieren (z.B. in der ASP.NET Konfiguration des Visual Studio).

Nun möchte ich diese gerne im IIS7 Manager als Provider für die Benutzerverwaltung nutzen.
Da dies aber (laut anderen Foren, aus Sicherheitsgründen) nicht mehr so einfach geht,
brauche ich etwas Hilfe.

Der IIS Manager sagt, dass man um das Feature nutzen zu können, den Provider in die Datei Administration.config als vertrauenswürdig hinzufügen muss, und sie einen starken Typ aufweisen und im globalen Assembly Cache sein muss.

Nach der folgenden Anleitung:

To work around this, you can compile the provider into a strongly-named signed assembly, and register it in the GAC. Then, use the full assembly-qualified type in the provider's configuration to identify this provider. This will allow you to use IIS Manager, which is by far the easiest way to create and manage Membership users.

Von hier: http://forums.iis.net/t/1147661.aspx

habe ich dann die Provider in ein extra Projekt gepackt, die Signierung eingeschaltet, kompiliert, und die DLL auf dem Server in die globale Assembly Cache installiert.

Jedoch kann ich die Provider im IIS nicht auswählen und auch die direkte Angabe in der web.config funktioniert nicht.

Die Assembly der Provider heißt CustomProviders und darin befinden sich 2 Klassen:
CustomMembershipProvider und CustomRoleProvider

In der web.config habe ich type="CustomProviders.CustomMembershipProvider" angegeben.

Habe ich etwas falsch gemacht, oder ist dass nur nicht der "full assembly-qualified type" ?

Vielen Dank für jede Hilfe,
slide

01.10.2009 - 14:15 Uhr

Hallo,
ich habe es zum funktionieren gebracht. Ich habe einfach eine neue MVC-Anwendung erstellt und in der web.config daraus meine einstellungen eingetragen.

Komisch ist daran nur, dass ich die web.config meines eigentlichen Projekts außer bei den Sections Provider und appsettings meines Wissens nach nicht verändert hatte.

Naja, aber jetzt tut es ja. Lag wohl an den Handlern und Modules.

Trotzdem Danke,
slide

30.09.2009 - 15:41 Uhr

Naja, ich wär ja schon froh, wenn sie auf einem IIS7 mit integriertem Modus läuft.

Da diese Anwendung eh ihren eigenen Webserver bekommt, ist es auch nicht so wichtig ob es auf anderen läuft.

Jedoch funktioniert bei mir das Routing ja nicht einmal mit IIS7 mit integriertem Modus. Obwohl ich inzwischen bei zig Seiten gelesen habe, dass dies "ohne weitere Konfiguration" möglich sein soll.

Ich habe auch schon eine Skriptzuordnung in den Handlerzuordnungen erstellt (was auf mehreren Seiten empfohlen wird), jedoch ohne Wirkung.

Es kann doch nicht so schwer sein eine MVC Anwendung auf einem IIS7 zum laufen zu bekommen.

Trotzdem schonmal vielen Dank für die Hilfe.

30.09.2009 - 15:04 Uhr

Wenn ich diese Sections nicht entferne bekomme ich folgende Fehlermeldung:

HTTP Error 500.22 - Internal Server Error
An ASP.NET setting has been detected that does not apply in Integrated managed pipeline mode.

Most likely causes:
This application defines configuration in the system.web/httpModules section.

Wenn es funktionieren würde, hätte ich sie drinne gelassen.

30.09.2009 - 13:35 Uhr

Hallo,
ich habe ein Problem mit dem MVC Routing mit dem IIS7.

Ich habe eine Webseite mit Visual Web Developer entwickelt. Dort funktioniert sie einwandfrei.

Um die Seite zu publizieren habe ich sie nun auf einen Windows Server 2008 mit IIS7 hochgeladen. Jedoch habe ich dort Probleme mit dem Routing.

Nach dem ich einige Sachen dazu gelesen habe, habe ich den Pipeline-Modus auf integriert gestellt und (da dass dann nötig ist) die Sections httpHandlers und httpModules aus der web.config entfernt. Dies hat jedoch nicht komplett geholfen.

Nun funktioniert zumindest die Hauptseite. Jedoch die Routings trotzdem noch nicht.
Wenn ich eine Url aufrufe, will IIS mir den entsprechenden physikalischen Pfad anzeigen.
Also "site.de/Login/Login" -> "wwwroot\site\Login\Login" der natürlich nicht existiert.

Ich habe nur die Standard Route {controller}/{action}/{id} mit Namen Default

Was muss ich ändern, damit es funktioniert?

11.09.2009 - 12:07 Uhr

Out of the box nicht, aber du kannst das selber verändern:

Naja, die dort genannten Lösungen verwenden auch entweder pures HTML oder Javascript wenn ich nicht etwas übersehen habe. Die Kauf-Lösung finde ich nicht sonderlich ansprechend.

Nein, Visual Studio hat damit nichts zu tun.

Naja, Visual Studio erstellt den Code. Von demher könnte es wohl schon Warnen, falls Javascript benötigt wird, obwohl ich es nicht will.

Wenn dir die Kontrolle überhaupt nicht reicht, kannst du dir ja mal ASP.NET MVC angucken.

Habe ich soeben gemacht. Ist interessant, jedoch finde ich es Schade dass somit die ViewState-Kontrolle und andere Sachen weg sind.
Man muss sehr viel selber machen, z.B. eben auch Zustandsverwaltung über die Session hinweg. Wie wird das ASP MVC eigentlich weiterentwickelt? Ist das ein großes Projekt von MS oder nur mal nen Versuch... Ich will schliesslich in ein paar Jahren noch damit arbeiten können.

11.09.2009 - 09:38 Uhr

Hallo.
Ich erstelle zur Zeit eine ASP Seite die ohne Javascript funktionieren soll.
Jedoch stoße ich dabei auf das Problem, dass ASP nur eine Server-<form> erlaubt und bei mehreren Submit-Möglichkeiten darin Javascript nutzt um zwischen den Absendern zu unterscheiden.

Ist es bei ASP wirklich nicht möglich ohne Javascript zwei unabhängige Buttons auf die Seite zu bekommen? Ich meine, ich will nichts besonderes. Einfach eine Seite, bei der es oben ein Login-Formular/Logout-Button geben soll. Und unten ein Formular zum Daten eintragen.

Ich denke es wäre möglich etwas in der Art in reinem HTML in die aspx Datei zu schreiben, aber dann ist die gesamte code-behind struktur nutzlos.

Und noch was: Bisher schaue ich persönlich nach, ob Javascript Code erstellt wird. Gibt es eine Möglichkeit Visual Studio mitzuteilen, dass er kein Javascript erstellen soll und falls es nötig wäre eine Fehlermeldung zu bringen?

Danke schonmal,
slide

08.09.2009 - 11:39 Uhr

Hi,
ich frage mich gerade wie man mit Linq eine Schrittweise Selektion durchführen kann.

Wenn man eine Abfrage hat, die oft keine Ergebnisse hat(weil z.b. entsprechendes Objekt nicht in der DB ist), könnte man so meiner Ansicht nach die Performance erhöhen.

Beispiel: Prüfen ob ein ähnliches Objekt schon in der DB ist.
Objekt ist ähnlich, wenn Name und 10 andere Eigenschaften identisch sind.
Wenn Name nicht identisch ist, muss nicht weitergeprüft werden.


var Treffer = (from BigThing in dc.BigThings
               where BigThing.Name == "Test"
               select BigThing.ID);
if (Treffer.Count() > 0)
{
var NeueTreffer = (from BigThing in db.BigThings
                   where Bighting.BigProperty.Name="Test2" &&
                    ....
                    ....
                    ....
                    Treffer.Contains(BigThing.ID)
                    select BigThing);
}

Allerdings ist das Treffer.Contains() nicht möglich da man die Fehlermeldung erhält:
"Abfragen mit lokalen Auflistungen werden nicht unterstützt."

Nun Frage ich mich warum, und wie man es anderst machen kann.
Ich fände eine Anwendung wie im Code oben nämlich sinnvoll und auch einfach in SQL umzusetzen.

Ebenfalls habe ich noch die Frage, ob es eine andere Möglichkeit gibt, eine ähnliche Funktion zu erreichen.

Mfg,
slide

04.09.2009 - 14:02 Uhr

verwendetes Datenbanksystem: MS-SQL 2008 Express

Hi,
gibt es eigentlich eine einfache Möglichkeit Linq dazu zu bringen ein Objekt + dessen Eigenschaften zu ersetzen?

Beispiel:

Tabelle Person (PerosnID,PersonNick,PersonName)
Tabelle Data(DataID,UniqueKey,DataString,Person->Person.PersonID)

Durch den VS-Assistenten wurden die entsprechenden Linq-Klassen definiert.

Aus Xml wurde eingelesen:
NewData(null,"Unique123","DATASTRING",NewPerson)
mit
NewPerson(null,"MyNick","MyName")

Also Newdata ist Objekt der Klasse Data mit Referenz auf Objekt NewPerson.

Da ich nun per Test herausgefunden habe, das es bereits Data mit dem UniqueKey 123 gibt, will ich den existierenden Datensatz Data durch den neuen ersetzen. Jedoch so, dass die zugehörige Person auch gleich geändert wird.

Wie kann man so etwas machen?

So funktioniert es jedenfalls nicht:


var OldData = (from DBData in db.Data
where DBData.UniqueKey == "Unique123"
select DBData); 

OldData = NewData;
db.SubmitChanges();

Mir ist klar dass es in diesem Fall einfach wäre die beiden getrennt zu ändern. Jedoch soll dies nur ein Beispiel sein. In meinem Fall geht es um ein großes Objekt mit Verweisen auf mindestens 10 Objekte die wieder auf 3-4 Objekte Verweisen.
Ich müsste also einen ganzen Baum ändern, wenn das Linq nicht irgendwie alleine kann.

Mfg,
slide

03.09.2009 - 14:40 Uhr

Das ist die Aufgabenstellung und die wird gelöst.

Wenn der Benutzer in der DB mit eine Leer-String angelegt wird dann gehts. Null würde ich ohnehin dafür nicht verwenden.

Die Aufgabenstellung wird eben nur gelöst für den fall, dass alle undefinierten felder leere strings sind. Aber mal abgesehen davon, dass ich bezweifle dass leere Strings für undefinierte Werte dem SQL-Standard entsprechen(gerade für undefinierte werte gibt es ja null), finde ich es unschön und vorallem umständlich da man alle nicht definierten werte durchgehen und auf "" setzen muss.
Linq setzt z.B. auch null für undefinierte werte. Man müsste also quasi gegen Linq arbeiten.

Der generierte SQL-Code ist für die gestellte LINQ-Query exakt richtig. Es wird auf Gleichheit geprüft!

Dem würde ich wiedersprechen. Denn ich will auf Gleichheit prüfen. Und wenn der String im Programm undefiniert(null) ist und das Feld in der DB auch undefiniert(null) ist, dann sind sie gleich und ich erwarte den Eintrag im Result. Dort taucht er jedoch nicht auf.
Dass diese Logik so eigentlich auch stimmt zeigt sich im funktionieren von "where x = null". In jedem anderen Teil von c# ist es egal ob ich eine variable mit dem wert null hinschreibe oder den wert null direkt.
Das Problem ist anscheinend nur, dass der Compiler eben nur eine Variante ("is null" oder "=...) verfolgen kann. Und da es sich um einen String handelt nimmt er die häufiger vorkommende Variante "=.."

Eine Lösung die übrigens funktioniert, auch wenn sie nicht ganz so schön ist, ist die folgende:


var Exists = (from TUser in db.User
where (TUser.UserNickName == NewUser.UserNickName) && 
(TUser.FirstName == NewUser.FirstName || (TUser.FirstName==null && NewUser.FirstName==null)) &&
(TUser.LastName == NewUser.FirstName || (TUser.LastName==null && NewUser.LastName==null))
select TUser.UserNickName);

Diese erzeugt entweder:
([t0].[FirstName] = @p1) Wenn der String nicht null ist, oder:
(([t0].[FirstName] = @p1) OR ([t0].[FirstName] IS NULL)) wenn der String null ist

Mfg,
slide

03.09.2009 - 12:36 Uhr

Nein, die AND stimmen schon.
Ich will ja dass der user existiert wenn alle 3 Sachen zutreffen.

Das Problem ist das SQL das generiert wird.

Denn ein "Value = NULL" vergleich ist in SQL nicht erlaubt.
die abfrage müsste:


SELECT [t0].[UserNickName]
FROM [Matest].[dbo].[Users] AS [t0]
WHERE ([t0].[UserNickName] = 'Administrator') 
AND 
([t0].[FirstName]) is null
AND 
([t0].[LastName]) is null

lauten.
So funktioniert die SQL abfrage nämlich auch wie gewollt.

Aber wieso generiert mir .Net ungültigen sql code? Und kann man das ohne direkte selbstgeschriebene sql-befehle umgehen?

Vorallem verstehe ich nicht ganz, wieso .NET für den Fall "where User.Name == null" anderen code erzeugt als für "where User.Name = x" mit x = null.
Es wird wohl an dem Kompilieren der SQL Anweisungen liegen. Aber da muss man doch etwas dagegen machen können.

Schliesslich kann ich nicht für jede Kombination an nullable variablen eine spezielle abfrage generieren.

Mfg,
slide

03.09.2009 - 12:23 Uhr

Interessant,
denn wenn ich deine Funktion per Copy&Paste übernehme und nur die Namen anpasse
bekomme ich mit deiner Funktion ebenfalls ein false beim Aufruf CheckUserExists("Administrator",null,null) obwohl es einen solchen Nutzer in meiner DB gibt.

Interessant finde ich, dass der erzeugte SQL-Code auch nicht funktioniert.
Ich habe den select auf NickName geändert, damit die Liste nich so lang ist
und die Werte eingesetzt:


SELECT [t0].[UserNickName]
FROM [XXX].[dbo].[Users] AS [t0]
WHERE ([t0].[UserNickName] = 'Administrator') AND 
([t0].[FirstName] = NULL) 
AND 
([t0].[LastName] = NULL)

Interessanterweise bekomme ich 0 Ergebnisse obwohl der Nick Administrator mit den Namen auf NULL wirklich in der DB ist. Was läuft da falsch?

Mfg,
slide

03.09.2009 - 10:06 Uhr

Ich wüsste jetzt nicht wie mir group by bei diesem Problem helfen könnte.
Da müsste ich ja den User eintragen, und dann eine Abfrage mit group machen um zu sehen, ob es ihn 2 mal gibt.
Das halte ich für eine sehr unschöne Lösung.
Oder hast du dir was anderes vorgestellt?

Auserdem wäre es auch für andere Bereiche nützlich wenn ich eine Methode hätte um
eine Spalte mit einem String zu vergleichen, bei der der string auch null sein darf und bei Vergleich mit einer DB-Spalte mit null auch true zurückgibt.

Mfg,
slide

03.09.2009 - 09:31 Uhr

verwendetes Datenbanksystem: MS-SQL 2008 Express

Hallo. Ich möchte, um doppelte Einträge zu verhindern, abfragen ob es einen gewissen User oder sonstige Entität schon in der Datenbank gibt.

Dazu benutze ich folgende Abfrage:


var Exists = (from TUser in db.User
              where (TUser.UserNickName.Equals(NewUser.UserNickName)) &&
              (TUser.FirstName.Equals(NewUser.FirstName)) &&
              (TUser.LastName.Equals(NewUser.LastName))
              select TUser.UserNickName).Any();

Das funktioniert soweit auch ganz gut, außer wenn eines der Felder nicht angegeben und daher null ist.
Das Verwunderliche ist, dass es funktioniert wenn ich z.b. NewUser.Firstname im Quelltext gegen null ersetze. Hat jedoch der String den Wert null, funktioniert es nicht.
Mit einem == Vergleich funktioniert es übrigens auch nicht.

Wie kann ich diese Abfrage machen?

Gibt es vieleicht sogar eine elegantere Möglichkeit einen doppelten Eintrag zu verhindern? Also, dass man angibt, "Wenn Usernickname und Firstname und Lastname gleich wie bei einem eingetragenen User, nicht neu eintragen" ?

Vielen Dank schonmal,
slide

09.02.2009 - 13:19 Uhr

Danke schonmal,
das iterieren der strings habe ich inzwischen durch rekursion hinbekommen.

Ich habe also eine Funktion iteratestrings(char[] Start, char[] End, int Digits, int Level)

Die Variable Level brauche ich nur für die Rekursion. Die ist am Anfang identisch mit Digits.

Nun verstehe ich allerdings nicht, wie ich mit Regex die Reihenfolge der Schleifen je nach auswahl anpassen kann. Mit Regex kann ich ja nur nach gewissen mustern in Text suchen, wenn ich das richtig verstanden habe, aber es strukturiert ja nicht meine schleifen um.

Ich möchte die Reihenfolge beibehalten. Also (#) wird zuerst iteriert, danach (*).

Bsp: (#) sind Buchstaben ax bis bc. (*) sind Zahlen 1-5.
Dann muss ich es so machen:

for (int i=1; i<=5; i++)
{
     iteratestrings("ax","bc",2,2)
}

wenn jedoch (#) die Zahlen sind und (*) die Buchstaben muss es so rum sein:

iteratestrings("ax","bc",2,2)

und irgendwo in der iteratestringsfunktion dann ein for (int i=1; i≤5; i++)

Ich könnte mir eine Lösung denken, bei der ich die Dateinamen in einem array speicher. Also als tabelle, wo ich in den zeilen den einen teil iteriere und in den spalten den anderen. und dann kann ich es in beliebiger reihenfolge durchgehen. Jedoch wäre das ein sehr hoher speicherverbrauch, der meiner meinung nach nicht notwendig sein sollte.

07.02.2009 - 13:45 Uhr

Hallo,
in einem aktuellen Projekt möchte ich mehrere Dateien aus einem Verzeichnis öffnen und unter festgelegten Namen wieder speichern.

Die Namen sollen mit Wildcards anzugeben sein,
z.B. "C:\Old\File()-(#).dat" öffnen und unter C:\New\Ordner()\Datei(#).dat speichern.

Bei Zahlen wäre dies kein Problem, aber wie kann ich dies für Strings realisieren?

Bsp: User gibt an (*) von 1 bis 10 und (#) von aay bis agj.

Wie kann ich nun in einer Schleife alle Werte von aay bis agj durchgehen.

Also in dieser Reihenfolge: aay, aaz, aba, abb, abc ... abz,aca,acb ... agh, agi, agj.

Ich könnte zwar für jeden Buchstaben eine for-Schleife machen und jedem buchstaben eine Zahl zuweisen. Jedoch würde das meiner Meinung nach nicht für eine variable länge funktionieren.

Wie könnte man dieses Problem lösen?

Und noch etwas:

Ich möchte die Reihenfolge beibehalten. Also (#) wird zuerst iteriert, danach ().
(
)-(#).dat wird also in der Reihenfolge 0-a, 0-b ... 0-z , 1-a ,1-b, ... abgearbeitet.

Ich will dass man bei beiden Wildcards auswählen kann ob es Zahlen oder Buchstaben sind.

Je nach Kombination muss ich dann aber die Iterations-Schleifen unterschiedlich kombinieren.
(Buchstaben-Schleife in Zahlenschleife) oder (Zahlen-Schleife in Buchstaben-Schleife) oder (Buchstaben-Schleife in Buchstaben-Schleife) ...

Wie mache ich soetwas am besten. Ich denke es ist unsinnig für jede Möglichkeit eine andere Funktion zu schreiben.

03.06.2008 - 18:31 Uhr

Hi,
Ich habe es jetzt mit dem Vector3.Project() gemacht.

Ich kann mir vorstellen was du da stundenlang rumprobiert hast. Ich hatte auch erst keinen Plan wo ich die ganzen Matrizen herbekommen soll und wie die berechnet werden.
Aber das ist ziemlich einfach.

Erstmal brauchst du einen DirectX-Font:


Microsoft.DirectX.Direct3D.Font dxFont = new Microsoft.DirectX.Direct3D.Font(renderDevice, 12, 8, FontWeight.Normal, 4, false, 
                                                                  CharacterSet.Default, Precision.Stroke, 
                                                                  FontQuality.ClearTypeNatural, 
                                                                  PitchAndFamily.DefaultPitch, "Verdana");

Die Werte ergeben sich aus der Funktionsbeschreibung. Nichts kompliziertes dabei.

Dann braucht man noch einen Viewport


ViewPort = new Viewport();
ViewPort.Height = 480;
ViewPort.Width = 640;
ViewPort.X = 0;
ViewPort.Y = 0;
ViewPort.MaxZ = 0;
ViewPort.MinZ = 0;

Wobei die ersten 2 Werte die Größe deines Render-Fensters oder Bereichs sind.
Die nächsten 2 stehen für den Anfang der Viewports in relation zur Renderfläche. Also normalerweise 0,0.
Und mit MinZ und MaxZ bekommt man noch einen kleinen Z-Anteil falls man sie doch über oder untereinander braucht, für 3D-Text. Für 2D einfach beide auf 0 setzen.

Diese beiden Sachen bleiben auch gleich egal wie oft man schreiben will. Man kann sie also z.b. in eine Initialisierungsfunktion schreiben.

Dann brauchst du einen Punkt irgenwo in deiner Welt dessen Werte du in einen Vector3 schreibst.


Vector3 3DVector = new Vector3(x, y, z);

Dann macht man schnell noch die Transformation, wobei die meisten Matrizen aus dem Device selber zu holen sind.


3DVector.Project(ViewPort, renderDevice.Transform.Projection, renderDevice.Transform.View, renderDevice.Transform.World);

Und danach kann man einfach an die richtige Position schreiben:


dxFont.DrawText(null, "Beschriftung",new Point((int)3DVector.X, (int)3DVector.Y), Color.DarkKhaki);

Indem du die letzten 3 Schritte wiederholst kannst du beliebig oft und recht einfach "wiklich" 2D schreiben.

02.06.2008 - 17:25 Uhr

Hallo,
ich arbeite Momentan an einem Projekt das 3D Objekte darstellt, die ich gerne Beschriften möchte. Also eine Art HUD.
Beispiel, siehe Dateianhang.
Muss ich die Pixel-Koordinaten "von Hand" mit Kameraposition, ViewField und so aus den 3D Daten berechnen?
Oder gibt es eine Möglichkeit das einfacher mit verfügbaren Funktionen zu rechnen. So dass ich quasi der Funktion die 3D Koordinaten übergebe und sie für mich die 2D Beschriftung an die richtige Stelle macht.

Vielen Dank schonmal.

02.06.2008 - 12:42 Uhr

Wie es manchmal so ist, habe ich das Problem nur ein paar Minuten nach dem Forumseintrag gelöst, obwohl ich davor stundenlang vergeblich nach der Lösung gesucht habe.

Das Problem war: Ich bin davon ausgegangen, dass wenn ich von Manager.CheckDeviceMultiSampleType(..) eine Qualität von 3 zurückbekomme, dies bedeutet dass ich die Qualitäten 1-3 verwenden kann. Es sind allerdings die Qualitäten 0-2!
Dies ist mir aufgefallen nachdem ich in einem Sample des SDK geschaut habe was für Modi ich dort einstellen kann. Was mich allerdings wundert ist, dass dieses Sample bei 4x MSAA nur eine Qualität von max. 6 anbietet. Ich jedoch auch noch 7 geprüft und dargestellt bekomme.

02.06.2008 - 12:13 Uhr

Hallo, ich arbeite an einem Projekt bei dem ich DirectX verwende.
Bisher habe ich feste Werte für das Multisampling verwendet. Mit denen funktioniert alles wunderbar.
Nun wollte ich jedoch die Verwendung von Mulstisampling variabel machen.
Also so dass man Multisampling Ein/Ausschalten kann und die Sampleanzahl sowie
Qualität wählbar ist.

Bei meiner Prüfung ob der gewünschte Modus unterstützt wird, werden mir allerdings Werte als OK bescheinigt, die später beim erstellen des Device eine {Microsoft.DirectX.Direct3D.InvalidCallException} auslösen.

Mit diesem Code prüfe ich die Einstellungen:


//Variable zum Fehler merken erstellen. Wird bei Fehler zu false gesetzt.
            bool SettingsOk = true;

            //Objekte zum Zugriff auf Systeminformationen erzeugen.
            AdapterInformation ai = Manager.Adapters.Default;
            Format cf = ai.CurrentDisplayMode.Format;//X8R8G8B8
            //Benötigte Variablen zur Abfrage erstellen.
            int quality = 0;
            int result = 0;

            //Multisample-Typ abfragen. result = 0 wenn Modus unterstützt.
            if (! (Manager.CheckDeviceMultiSampleType(ai.Adapter, DeviceType.Hardware, cf, true, NewSettings.Samples, out result, out quality) &&
            Manager.CheckDeviceMultiSampleType(ai.Adapter, DeviceType.Hardware, (Format)DepthFormat.D16, true, NewSettings.Samples, out result, out quality) ) )
            SettingsOk = false;

            //Max. Qualität für diesen Modus wird zurückgegeben. Prüfen ob eingestellte Qualität möglich.
            if (NewSettings.Quality > quality) SettingsOk = false;

            //Wenn Multismapling aktiviert ist, aber die Sample-Anzahl auf 0 steht, ist die Einstellungsdatei fehlerhaft.
            if (NewSettings.Multisampling && (NewSettings.Samples == MultiSampleType.None)) SettingsOk = false;

Und hier Initialisiere ich das Device:


PresentParameters parms = new PresentParameters();
            parms.Windowed = true;
            parms.SwapEffect = SwapEffect.Discard;
            parms.EnableAutoDepthStencil = false;
            parms.AutoDepthStencilFormat = DepthFormat.D16;
            parms.BackBufferFormat = Format.X8R8G8B8;
            
            /* Vorherige feste Werte
            parms.MultiSampleQuality = 6;
            parms.MultiSample = MultiSampleType.FourSamples;
            */

            if (Settings.Multisampling)
            {

                parms.MultiSampleQuality = Settings.Quality;
                parms.MultiSample = Settings.Samples;
            }
            else
            {
                parms.MultiSampleQuality = 0;
                parms.MultiSample = MultiSampleType.None;
            }

            // try Hardware/Hardware
            try
            {
                renderDevice = new Device(0, DeviceType.Hardware, renderForm.Area_Draw, CreateFlags.HardwareVertexProcessing, parms);
            }
            catch { }

Die Parameter parms.EnableAutoDepthStencil, parms.AutoDepthStencilFormat und
parms.BackBufferFormat sind hier noch fest, da ich sie noch nicht in meine Settingsklasse implementiert habe. Jedoch ist das Format dass, das es auch bei der Prüfung verwendet.

Woran liegt es, dass es Fehler gibt, obwohl ich die Modi vorher überprüfe?

Vielend Dank schonmal für jegliche Hilfe.

01.06.2008 - 17:24 Uhr

Vieleicht muss ich dann die TitleBar Schriftgröße ändern.
In dem Fall dass eine Leiste angezeigt wird, würde ich dieses verhalten auch als korrekt bezeichnen.
Aber bei dem von mir verwendeten FormBorderStyle: None hat das Fenster keine Titlebar und bräuchte daher meines Erachtens auch nicht diese Vergrößerung des Fensters.

Aber Danke für den Hinweis.

01.06.2008 - 15:20 Uhr

Hallo,
Ich arbeite zur Zeit an einem Programm, welches sich als 500x20 Pixel großes Fenster am oberen Bildschirmrand befindet. Bei einem MouseEnter-Event wird die Fenstergröße auf 500x520 geändert und bei einem MouseLeft-Event wieder auf 500x20.

Das Umstellen funktioniert auch ohne Probleme. Nur beim Start, vor dem ersten MouseLeft- oder MouseEnter-Ereignis funktioniert irgendetwas nicht so wie ich es erwarte.

Denn das Fenster ist nicht, wie in den Eigenschaften der Form angegeben, 500x20 groß, sondern 500x30.
Ich habe das dann mal mit dem Debugger verfolgt und gesehen, dass das Fenster nach Erstellung des Objekts 500x200 in .Size stehen hat. Der Wert ändert sich bei dem Befehl
.Show() .
Ich verstehe allerdings nicht wieso und was man dagegen machen kann.
Autosize und alles was sich ähnlich anhört habe ich deaktiviert, trotzdem tritt das Problem immernoch auf.

Ich habe innerhalb der Form nur eine PictureBox mit 500x520 auf die ich mit DirectX zeichne. Das Fenster hat den FormBorderStyle None und ich lege die StartPosition im Quellcode selber fest.
Aber das dürfte doch alles kein Problem darstellen.
Klar, ich könnte direkt nach dem .Show() einfach nochmal die Größe festlegen, aber das ist ja nicht Sinn und Zweck der Sache.

Danke schonmal an alle die versuchen mir zu helfen.

11.03.2008 - 12:11 Uhr

Hallo,
ich arbeite gerade an meinem ersten Programm mit DirectX.

Neben anderen Sachen sollen in diesem Programm Verbindungslinien gezeichnet werden. Das habe ich mit Linestrips gelöst, was auch funktioniert.
Nur bin ich damit noch nicht ganz zufrieden.

Ich möchte die Linien nämlich an den Enden ausblenden. Und wenn es möglich ist würde ich die Linien auch gerne noch mit einem gewissen Volumen haben.

Siehe Anhang 1

Das ausblenden habe ich versucht mit Texturen hinzubekommen, aber das hat nicht funktioniert, die Linien waren immer in ein und der selben Helligkeit. Diese war zwar abhängig von der Textur, aber so wie es aussah nur vom ersten Pixel der Textur.

Das Volumen habe ich versucht per Device.RenderState.PointSize zu ändern, dies hat aber keinen Einfluss auf Linien. Auserdem würde eine einfach "dickere" Linie nicht dem entsprechen, was ich gerne hätte.

Die einzige Möglichkeit das von mir gewünschte zu erreichen sehe ich momentan darin mit Hilfe von TriangleFans Rechteck-Flächen zu erstellen und die mit einer Textur zu belegen und AlphaBlending zu benutzen. (Da ich nur von einer Seite draufschaue, würde eine Fläche reichen)

Mal abgesehen davon dass dies wohl einiges Resourcenaufwändiger wäre, denke ich dass es auch schwer zu implementieren wäre.
Denn ich brauche ja dann die EckKoordinaten der Fläche.

Siehe Anhang 2

Blaue Punkte = Verbindungspunkte(gegeben)
Schwarze Punkte= EckPunkte der texturierten Rechteck-Fläche(wäre zu berechnen)

Gibt es eine einfachere Möglichkeit den von mir gewünschten Effekt zu realisieren?
Wenn nicht, wie berechne ich am einfachsten die Eckpunkte der texturierten Fläche?
Gibt es eine Möglichkeit die Fläche erstmal "gerade" im Koordinatensystem anzulegen und dann mit einem Befehl alla RotatePrimitive(Linie, Haltepunkt,Rotate_X,Rotate_Y,Rotate_Z) zu drehen?

Vielen Dank schonmal im Voraus

07.03.2008 - 17:34 Uhr

Bei mir sieht die Seite genau gleich aus, außer dass die beiden Boxen oben fehlen.

Kann es sein dass die Express Edition das nicht kann? Kann ich mir aber fast nicht vorstellen.

07.03.2008 - 17:27 Uhr

@Khalid: Nein, dass meine ich nicht. Sondern ich meine dass es 2 Datensätze gibt, zwischen den ToID und FromID vertauscht ist.
Also es Gibt z.B.
Eintrag1 : FromID=101 ToID=108
Eintrag5 : FromID=108 ToID=101

Das ist als würdest du eine Straße nicht als "eine Straße" beschreiben, sondern als "zwei Spuren", die eine von A nach B und die andere von B nach A.

Wenn ich aber die Straße z.B. zeichnen will, brauch ich ja nicht A nach B und B nach A, sondern nur eine davon, weil die übereinander liegen.

@Jack30lena:
Ich habe zwar wenige von deinen Worten verstanden, aber ich google mal danach und probiere etwas damit zu machen. Kannst du auf die von dir favorisierte Lösung eventuell genauer eingehen?

07.03.2008 - 17:07 Uhr

Hallo,
ich arbeite gerade an einem Programm in dem ich mit dem SQL Server Compact arbeite.
Und ich sitze nun schon über eine Stunde daran, eine Lösung für folgendes Problem zu finden:

In meinem Programm geht es um Koordinatenpunkte und Verbindungen zwischen ihnen.

Dass Problem ist, dass die Verbindungen in der Datenbank immer für beide Richtungen angegeben sind. Die Verbindungen sind in einer eigenen Tabelle gespeichert und haben nur die Werte FromID und ToID.
Es gibt aber eben für jede Verbindung FromID = X und ToID = Y auch die Umgekehrte Verbindung FromID = Y und ToID = X .

Wie werde ich die Doppelgänger los? Ist das Überhaupt in einer Abfrage möglich?

Die einzige Idee die ich bisher hatte, war einen Autoincrement-Wert hinzuzufügen und damit alle Verbindungen durchzugehen, die FromID und ToID auszzulesen und danach in einer Abrfrage alle einträge zu löschen, in denen die IDs anderst herum drinnestehen.
Also quasi: (Pseudocode, nur zum besseren Verständniss)


for (Var_Count = 0 to Anzahl_Verbindungen)
{
   Ergebnis = Abfrage ("Select FromID, ToID FROM VerbindungsTable WHERE V_ID = Var_Count")

   Abfrage(DELETE FROM Verbindungstable WHERE FromID = Ergebnis.ToID AND ToID = Ergebnis.FromID")

}

Allerdings macht dass je verbindung 2 Abfragen, und da ich mehrere tausend verbindungen habe, sehe ich dass nicht als die ideale Lösung an.

Ich hoffe hier kann mir jemand eine bessere Lösung sagen.

Danke schonmal.

07.03.2008 - 16:50 Uhr

Der Grund für das Umbenennen wäre einfach dass eine Database.dll schöner aussieht wie eine System.Data.SqlServerCe.dll. Oder wenn man sie in einem Unterordner hätte eine saubere Ordnerstruktur.
Aber so wichtig ist das auch nicht.

Das Double Precision kennt auch der sdf Editor in Visual Studio nicht, daher habe ich dass nun mit einem numeric gelöst.

Ich habe schon in den Einstellungen gesucht, aber nichts gefunden. Es gibt auch keine Kombobox um Release auszuwählen. Selbst wenn ich alle Anzeigeelemente in der Menüleiste aktiviere finde ich dort nichts.
In den Einstellungen kann ich nur einen Release-Pfad angeben, aber nirgends eine Einstellung setzten um ein Release zu kompilieren.

07.03.2008 - 13:10 Uhr

Sicherlich gibt es eine Menge. Danach zu googeln ist das erste was ich gemacht habe.
Aber das was ich gefunden habe, ist meines Erachtens nach alles nicht das ware.

Deshalb wollte ich fragen ob jemand eine besonderst gute Anleitung kennt.

Ich habe auch 1,2 gefunden mit denen ich etwas anfangen kann, aber schreibfehler im Quellcode oder Quellcodeteile die so garnicht funktionieren, erschwehren die Arbeit erheblich.

Aber zu den DLLs :
Ich nehme mal an dass man einfach die System.Data.SqlServerCe.dll ins Verzeichniss rein muss.
Aber ist es eigentlich irgendwie möglich dass man die Datei z.B. in Database.dll umbenennt und es trotzdem noch funktioniert. Oder dass man die Datei in einem Unterordner hat?

Gibt es eine einfache Möglichkeit von MS SQL zu diesem Compact SQL zu transformieren? Ich habe diese Liste der Datentypen gefunden : http://technet.microsoft.com/en-us/library/ms171931.aspx
Aber bei double precision bringt er trotzdem noch einen fehler.
"Fehler bei Analysieren der Abfrage. [Token line number=6, token line offset=6, Token in error = double]
oder bedeutet das etwas anderes?

PS:
Gehört eigenlich woanderst hin, aber : Wie erstelle ich in Visual Studio 2008 Express eine Release Exe von meinem Projekt? Beim normalen kompilieren bekomme ich nur die Debug Dateien.
Und bei Publish wird so ein nerviges setup.exe erstellt.

07.03.2008 - 11:33 Uhr

Danke für die bisherigen Antworten.

Kann mir jemand eine gute Anleitung für die Verwendung des SQL Server Compact nennen. Ich konnte noch keine gute finden.

Khalid hat geschrieben dass es keine Installation braucht. Aber das einzige was ich bei Mircosoft zum Download gefunden habe war ein Installer.

07.03.2008 - 10:33 Uhr

War mein eigener Fehler. Nach ein paar Tests habe ich gemerkt dass ich als Sharemode nur Read angegeben habe. Mit ReadWrite hats dann funktioniert.

07.03.2008 - 09:55 Uhr

Hallo,
ich will eine Logfile auslesen, während diese noch vom eigentlichen Programm zum schreiben geöffnet ist. Dies geht allerdings nicht, da es dann eine IOException gibt. Mit Notepad ist die Datei jedoch zu öffnen.

Das gleiche Problem hatte schonmal jemand hier:
Gesperrte Textdatei auslesen

Dort wurde ihm geraten es mit einem Filestream zu machen, bei dem man den Sharemode angibt.
Dies habe ich auch versucht jedoch gibt es immernoch eine IOException.

Wie kann ich die Datei dennoch öffnen?

Danke schonmal im Voraus.

06.03.2008 - 22:54 Uhr

Hallo,
ich habe folgendes Problem:
Ich lese aus einer XML-Datei 2 Hashtable Arrays aus. Es geht um Koordinatenpunkte und Verbindungen zwischen diesen.
Die Koordinaten selber haben die Attribute Pos_X, Pos_Y, Pos_Z, Name und Pos_ID.
Die Verbindungen haben dann nurnoch die Daten From_ID und To_ID

Ich brauche allerdings die koordinaten der Verbindungen, ich will später also From_X, From_Y, From_Z und To_X, To_Y und To_Z von jeder Verbindung haben.

Nun ist es schwer wenn man die Koordinaten der Verbindungen haben will. Unter SQL wäre das eine einfache Abfrage eines JOINs. Aber ohne Datenbank fiel mir nur die (ziemlich Zeitaufwändige) Methode ein, für jede Verbindung(foreach) die Komplette Positionenliste zu durchlaufen und bei passender ID der Hashtable der Verbindung die Koordinaten hinzuzufügen.

Aber wie gesagt, die ist sehr langsam. Mein Programm braucht über 30 Sek. um zu starten. Es sind je einige tausend Punkte und Verbindungen.

In einer Datenbankabfrage mit gleichen Daten dauert es den Bruchteil einer Sekunde.

Nun die Frage:
Kann ich eine Pseudo-Datenbank in meinem C# Programm anlegen, mit dem ich arbeiten kann, als wäre es eine richtige SQL-Datenbank ohne dass auf dem Rechner dafür ein SQL-Server laufen muss?
Eigentlich geht es mir ja nur um einen Join und die Abfrage des Ergebnisses.

Oder gibt es eine andere, vieleicht noch schnellere oder einfachere Lösung?

Ich danke schonmal im Voraus.