Laden...

Forenbeiträge von DeveloperX Ingesamt 462 Beiträge

20.12.2010 - 17:45 Uhr

Hi Jack30lena!

Danke für die Hilfe - nun klappts anscheinend.
Habe jetzt für die Library je eine Projektdatei für WP7 und eine für WPF (mit unterschiedlichen Referenzen auf die jeweiligen Standard-Assemblies) jedoch die CodeFiles nur einmalig (beim Hinzufügen eines File muss ich dann wohl das andere Projektfile entsprechend ergänzen).

Zumindest für die ObservableCollection kompiliert es fehlerfrei und läuft auch wie erwartet.

Danke nochmals!
lg

20.12.2010 - 00:11 Uhr

Hi zusammen!

Ich möchte eine Windows Phone 7 App schreiben und parallel dazu eine WPF-Anwendung.
Nach altbewährtem Vorgehen wollte ich hierzu eine Test.Lib-Library erstellen in dem die ViewModels bzw. BusinessModels drinstecken und dann diese Library in der WP7- sowie WPF-App einbinden und auf dieses Objekte Databinding machen - sollte im Prinzip ja kein Problem sein.

Nur ist es halt so, dass ich in der Test.Lib-Library eine ObservableCollection<T> verwenden möchte.
Und nun das Problem: die beiden Apps verwenden unterschiedliche Assemblies in denen diese Klasse definiert ist (WPF: WindowsBase / WP7: System.Windows) was beim Kompilieren zu einem Fehler führt (in der WPF-App):

The type 'System.Collections.ObjectModel.ObservableCollection`1<T0>' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Windows, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e'. <mypath>\WpfTestApp\MainWindow.xaml.cs 34 13 WpfTestApp

Wie kann ich nun die Library auf einen gemeinsamen Nenner bringen ohne für jedes der 2 Applikationen separate ViewModels (inklusive ObserableCollection) erstellen zu müssen?

LG

Edit:
Habe gerade gesehen, dass beim Kompilieren noch ein Warning kommt:
Warning 3 The project 'TestApp.Lib' cannot be referenced. The referenced project is targeted to a different framework family (Silverlight)

Also wird das was ich vorhabe wohl gar nichts funktionieren oder wie darf ich das verstehen? Wäre ja sehr schade und irgendwie unsinnig.

Wäre für Hilfe sehr dankbar 😃

23.02.2010 - 15:33 Uhr

Hi,

Habe mich gerade etwas damit auseinandergesetzt und bin zur Erkenntnis gelangt, dass es mit dem VirtualizingStackPanel (welches von der ListView standardmäßig verwendet wird) zu tun hat: Dabei werden die Container nämlich nicht sofort sondern erst bei Bedarf erzeugt und führt daher gelegentlich zu den Null-Referenzen bei GetContainerFrom...()-Aufrufen.

Du müsstest auf StatusChanged vom ContainerGenerator reagieren und wenn dieser fertig ist, kannst du die GetContainer-Methoden aufrufen sowie dann BringIntoView().



void _list_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
	listview.ItemContainerGenerator.StatusChanged += new EventHandler(ItemContainerGenerator_StatusChanged);
}

void ItemContainerGenerator_StatusChanged(object sender, EventArgs e)
{
	if (listview.ItemContainerGenerator.Status == System.Windows.Controls.Primitives.GeneratorStatus.ContainersGenerated)
	{
		((ListViewItem)listview.ItemContainerGenerator.ContainerFromIndex(listview.Items.Count - 1)).BringIntoView();
		listview.ItemContainerGenerator.StatusChanged -= new EventHandler(ItemContainerGenerator_StatusChanged);
	}
}

So funktionierts bei mir.

lg

23.02.2010 - 12:51 Uhr

dafür hat das ListViewItem eine eingebaute Methode:

  
ListView.Items[Index].EnsureVisible();  
  

//edit: hmm da war ich wohl etwas vorschnell, ich hab das so in einer formanwendung drin. warum gehts das denn bei WPF nicht???


ListView.Items[Index].BringIntoView();

Habs zwar nicht getestet, aber laut Doku scheints das zu sein.

mfg

10.09.2009 - 16:08 Uhr

Hi,

Hilft dir vielleicht ein MultiTrigger, der die beiden Properties enthält, weiter?
MultiTrigger-Klasse

lg

31.12.2008 - 20:49 Uhr

Hi,

Da ist ganz einfach: Eine Zuweisung hat als "Ergebnis" immer den Wert und Typ, welcher zugewiesen wurde.

SqlCeParameter[] param = new SqlCeParameter[] { new SqlCeParameter("@user_Name", SqlDbType.NVarChar).Value = stringArr[0] };

Hier machst du eine String-Zuweisung, was als "Ergebnis" eben einen String liefert. Und String is nicht konvertiertbar in SqlCeParameter.
Du solltest die Value-Zuweisung also bereits vorher machen.

lg

04.12.2008 - 09:24 Uhr

Hi!

if (control is <Interface>)

lg

01.12.2008 - 18:47 Uhr

Hallo DeveloperX,

Platzhalter in SQL-Queries sind schlecht (Sql-Injection und so)

schon klar, aber so wie ich es verstanden habe, werden die Tabellen-Namen ja nicht vom Benutzer eingeben, sondern aus einer hardcodierten Werteliste entnommen. Von daher ist SQL Injection nicht das Problem.

Das mit dem Platzhalter vs. {0}, {1}:
Wäre eigentlich so gemeint, dass er ja ein Dictionary<string, string> für Programm-interne-Bezeichnung / wirklicher SQL-Tabellenname verwenden könnte. Da klappts halt dann doch nicht mit {0}. Aber ansonsten ist die {0}-Variante besser, da muss ich dir recht geben.

01.12.2008 - 16:13 Uhr

Hi,

Vielleicht hilft es dir ja schon, wenn du einen Platzhalter (z.B. "%%USER_T%%") in deinen SQL-Strings verwendest und diesen dann durch den richtigen Tabellennamen ersetzt:

string USERS_T = "Users";
...
string sql = "select a, b, c from %%USERS_T%% where a = ...";
sql = sql.Replace("%%USERS_T%%", USERS_T);

Das ganze noch in ein Dictionary verpackt und schon gehts für verschieden Tabellen.

lg

27.10.2008 - 13:21 Uhr

Hi,

Dass das Logo einem N ähnelt, stimmt schon, nur war es IIRC eine Aussage von MS, dass es eine Welle symbolisieren soll - und da frage ich mich halt schon, was .NET bitte mit einer Welle zu tun haben soll?

Zitat vom verlinkten Blog:

The result is a design we refer to as the “wave.” The design is strong, simple and distinctive. The suggestion of the letter ‘N’ in the design will become instantly recognizable over time as shorthand for the .NET brand name.

War also wohl beides beabsichtigt: Welle und 'n'.

lg

14.08.2008 - 12:51 Uhr

Hallo!

Ein Konstruktor von DirectoryEntry nimmt als Parameter Benutzername und Passwort. Vielleicht genügt es zu versuchen so ein DirectoryEntry-Objekt zu erstellen.

LG

22.07.2008 - 11:18 Uhr

Hallo!

Das liegt daran, dass der GradientBrush bei z.B. x=101, das Rechteck aber bei x=100 steht. Also einfach beim Erzeugen des GradientBrushes bei der x-Koordinate 1 dazuzählen.

mfg

12.07.2008 - 17:16 Uhr

Hallo Berian!

Ich würde nur eine Tabelle erstellen und eine Spalte "GültigAb" hinzufügen. Damit kannst du gezielt nach einer Version zu einem bestimmten Datum abfragen.

Natürlich muss du halt dann bei allen Select die "GültigAb"-Spalte berücksichtigen (gültig ist die, die am nähesten zum aktuellen Datum ist).

Die restlichen Datensätze kannst du dann auch unverändert lassen.

Zu deiner 2. Variante: Hier müsstest du jedesmal ein delete bzw. update der Tabelle mit den aktuellen Versionen machen und zusätzlich noch ein Insert in der Archiv-Tabelle. Würde ich nicht empfehlen, da du dann sehr aufpassen musst.

mfg

01.05.2008 - 13:13 Uhr

Hallo!

Doch, es gibt eine einzige Vorlesung/Übung in der mit C# gearbeitet wird: "Einführung in die Informatik" aus dem Elektrotechnik-Studium. Ein Bekannter von mir hat das gehabt ... aber selbst mach ich auch Softwareentwicklung Wirtschaft 😉

01.05.2008 - 13:03 Uhr

Hallo!

Du könntest die eigentliche Methode aus der Basis-Klasse implementieren und eine zusätzliche (protected) Methode anbieten, die überschrieben werden kann. Und diese rufst du halt dann aus der eigentlichen Methode auf.

  public class FooClass
  {
    public FooClass()
    {
    }

    public void TestMethod()
    {
      MessageBox.Show("FooClass");
      InternalTestMethod();
    }
    virtual protected void InternalTestMethod() {};
  }


  public class DummyClass : FooClass
  {
    public FooClass() : base()
    {
    }

    override protected void InternalTestMethod()
    {
      MessageBox.Show("DummyClass");
    }
  }

lg

25.12.2007 - 12:39 Uhr

nochmal:

... meinst Du vieleicht 'Queue'

😉

mfg

23.12.2007 - 14:25 Uhr

Hallo!

Rechtsklick auf ein Propety: Show as Association

mfg

21.12.2007 - 23:19 Uhr

Wenn du willst, dass die aufgerufene Method dein Objekt nicht ändern kann, musst du entweder eine Kopie oder eine ReadOnly-Variante vom Objekt übergeben (siehe dazu: Durch Get-Accessor schreiben?).
Ein Schlüsselwort wirds kaum geben, da dies bei Objekten nicht so trivial ist wie bei Wertetypen.

mfg

17.12.2007 - 16:51 Uhr

Hallo!

Ich denke es geht serial eher darum, dass man das, durch das Get-Property erhaltene, Objekt verändern kann, auch wenn es nicht "ge-set-tet" werden kann.

@Serial: Durch ein Property ohne Set-Accessor ist lediglich der Verweis zum Objekt schreibgeschützt, nicht aber das (Ziel-)Objekt selbst (!).

mfg

09.12.2007 - 04:17 Uhr

Original von Seikilos
Wenn n kleiner der Sektor größe ist, sind das die 8 umliegenden Sektoren, ...

Nicht unbedingt: Wenn nämlich der Kreis-Mittelpunkt ziemlich weiter links unten in einem Quadrat ist, dann können es auch weniger sein (z.B. für n = 0.75*Sektorgröße).

Eine Lösung hab ich zwar leider nicht, aber vl. hilft dir ja folgende Überlegung weiter:

  • Wenn n zwischen e1 (Strecke zwischen Kreismittelpunkt und Eckpunkt der am wenigsten weiter vom Kreismittelpunkt entfernt ist) und e1 (Strecke zwischen Kreismittelpunkt und Eckpunkt der am weitesten vom Kreismittelpunkt entfernt ist) ist, dann ist der Kreis im Sektor, ansonsten nicht
  • Optimierung: z.B. Im linken-oberen-Viertel ist der linke-obere-Eckpunkt am weitstens entfernt (e2), der rechte-untere am wenigsten weit (e1) -> analog für die 3 anderen Kreis-Viertel
  • Du brauchst nicht alle Segmente innerhalb es "umgeschriebenen Rechtsecks" prüfen: es reicht wenn du dir das 1. Segment mit Kreis irgendwie ausrechnest (z.B. suchst du dir den, der in der gleichen Reihe, aber rechts vom Mittelpunkt ist [kann man noch weiter optimieren, wenn du 'n' in die Berechnung miteinbeziehst]). Wenn du eines hast, brauchst du immer nur die links, rechts, oben und unteren Segmente prüfen. Wenn eines davon ebenfalls ein Kreis-Segment beinhaltet, prüfst du wieder links,rechts, unten und oben => Rekursion.

Kleines Bsp. zum besseren Verständis:

Vom Kreis-Mittelpunkt einfach bei der X-Koordinate 'n' dazuaddieren -> Somit weisst du, in welchem Segment mit sicherheit ein Kreis-Teil liegt (dazu brauchst du die Modulo-Operation). [Segment 16]

Jetzt prüfst du das linke Segment [15]mittels oberen beschriebenen Verfahren -> Keine Segmetn mit Kreis-Teil
Das rechte Segment [17] ist ebenfalls kein gesuchtes Segment
Das obere [10] ist eines. Also prüfst du ab dort weiter:

links [9] ist eines -> von dort aus weiterprüfen ...
rechts [11] ist keines
oben [3] st eines -> von dort ebenfalls weiterprüfen ...
unten [16]: ist bereits bekannt, dass es ein gesuchtes Segment ist -> dort nicht mehr weiterprüfen

usw.

mfg

01.12.2007 - 18:12 Uhr

Hallo!

Siehe FAQ: [FAQ] freie Icons

mfg

20.10.2007 - 10:26 Uhr

Hallo zusammen!

Ich habe mehrere voneinander abhängige Klassen, die prinzpiell nur lesend verwendet werden können (internal Konstruktor, internal set-Accessoren, geben nur ReadOnly-Collections zurück). Dies muss zwinged so sein.

Nun entwickle ich gerade eine Art Editor dafür, der per Reflection das alles ändern kann. Im Editor kann man das ganze dann binär serialisieren (XML kann man ja nur serialisieren, wenn man public Set-Accessoren usw hat) und die serialsierte Datei in einem anderen Programm öffnen.

Soweit so gut. Aber nun fangen die Probleme an: Da die Klassen-Bibliothek bei weitem noch nicht fertig ist, kann ich natürlich keine Binär-Dateien aus vorhergehenden Versionen laden.

Wie umgeht man ein solches Problem? Einen Konverter für Version A nach Version B schreiben? Währe wohl ziemlich aufwändig bzw. beim momentanten Stand der Entwicklung mit mind. eben so hohem Aufwand verbunden wie das Implementieren der ganzen Klassen-Bibliothek mit Editor.

Für Hinweise und Anregungen wäre ich sehr dankbar!

mfg
DeveloperX

21.09.2007 - 14:36 Uhr

Original von Beauty
ändern zu

  
if ((line[0].ToString() == "#") || (line[0].ToString() == ";")) continue;// Kommentar  
  

und das widerrum ändern zu:


if ((line[0] == '#') || (line[0] == ';')) continue;// Kommentar

😉

mfg

20.09.2007 - 17:41 Uhr

Hallo!

Bei der ListBox fügt du einfach in die Items-Collection ein Objekt hinzu. Um an den Text zu gelangen, ruft die ListBox die ToString()-Methode des Objektes auf.

Du kannst also jedes beliebige Objekt in einer ListBox darstellen.

mfg

19.09.2007 - 21:59 Uhr

Hallo!

Das Tag-Property ist genau dafür da, dass man zu einem Control ein Objekt dazuspeichern kann, um z.B. später festzustellen, welches Objekt sicher ändern muss, wenn das Control sich geändert hat.

mfg

18.09.2007 - 14:34 Uhr

Du kannst aber die Abhängikeiten anzeigen lassen: Bei den Properties Rechtsklick "Show as Association".

Desweiteren werden noch Erberungshierarchien und Interface-Implementierungen angezeigt.

mfg

20.08.2007 - 12:20 Uhr

Hallo Golo!

Hier sind die Codes:

        static void TestIf(int x)
        {
            int y;
            if (x == 1)
            {
                y = 2;
            }
            else
            {
                y = 3;
            }
        }
        static void TestTri(int x)
        {
            int y;
            y = x == 1 ? 2 : 3;
        }

MSIL:

.method private hidebysig static void  TestIf(int32 x) cil managed
{
  // Code size       23 (0x17)
  .maxstack  2
  .locals init ([0] int32 y,
           [1] bool CS$4$0000)
  IL_0000:  nop
  IL_0001:  ldarg.0
  IL_0002:  ldc.i4.1
  IL_0003:  ceq
  IL_0005:  ldc.i4.0
  IL_0006:  ceq
  IL_0008:  stloc.1
  IL_0009:  ldloc.1
  IL_000a:  brtrue.s   IL_0012
  IL_000c:  nop
  IL_000d:  ldc.i4.2
  IL_000e:  stloc.0
  IL_000f:  nop
  IL_0010:  br.s       IL_0016
  IL_0012:  nop
  IL_0013:  ldc.i4.3
  IL_0014:  stloc.0
  IL_0015:  nop
  IL_0016:  ret
} // end of method Program::TestIf


.method private hidebysig static void  TestTri(int32 x) cil managed
{
  // Code size       11 (0xb)
  .maxstack  2
  .locals init ([0] int32 y)
  IL_0000:  nop
  IL_0001:  ldarg.0
  IL_0002:  ldc.i4.1
  IL_0003:  beq.s      IL_0008
  IL_0005:  ldc.i4.3
  IL_0006:  br.s       IL_0009
  IL_0008:  ldc.i4.2
  IL_0009:  stloc.0
  IL_000a:  ret
} // end of method Program::TestTri


17.08.2007 - 21:53 Uhr

Hallo CongoFX!

Da muss ich herbivore rechtgeben.
Bei 10 Millionen Durchläufen ist die IF-Variante um nur 11 Millisekunden langsamer.

mfg

16.08.2007 - 22:47 Uhr

Hallo!

Das mit dem austauschen von "UserControl" mit "Panel" bringt gar nichts ...

Aber UserControls sind schon der richtige Weg. Mehr dazu siehe: Mit Forms eine art Frame einer Website nachbauen?

mfg

16.08.2007 - 18:42 Uhr

Hallo Herbivore!

Original von herbivore
Das spräche wiederum dafür die INode-Collection als ReadonlyCollection nach außen zu geben, was aber ebenfalls jedes mal einen Kopieren bedeuten wird. Nicht gerade effizient, wenn jemand nur per node.Children _ auf ein bestimmtes Child zugreifen will.

Jedes mal eine neue ReadOnlyCollection zu erzeugen ist nicht notwendig. Die ReadOnlyCollection kopiert die Werte nicht, sondern ist nur ein Wrapper auf die eigentliche Collection, die sie als Member gespeichert hat. Auch wenn du im nachhinein die ursprüngliche Collection änderst, sind die Änderungen in der ReadOnlyCollection sichtbar.

mfg

16.08.2007 - 13:49 Uhr

Hallo!

Wenn du sie als File exportieren willst: MailItem.SaveAs(..) --> http://msdn2.microsoft.com/en-us/library/bb175283.aspx

mfg

14.08.2007 - 14:05 Uhr

Hallo!

Ich finde, gerade beim Programmieren lohnt sich ein Widescreen, da der Platz für Code durch Toolbox, Propery-Fenster/Solution-Explorer reduziert wird. Ich hasse es, wenn eine Codezeile nicht komplett sichtbar ist (umbrechen tue ich auch nicht gerne, da es nicht schön aussieht).

Mein Notebook hat auch eine Widescreen. Ist sehr praktisch, da man besser oben drüberschauen kann. Außerdem ist da noch der genannte Vorteil bei Filmen; kleiner Nachteil: manche Spiele unterstützen (standardmäßig) kein Widescreen-Format.

Aber ich werde mir in Zukunft nur mehr Widescreens kaufen.

mfg

13.08.2007 - 01:57 Uhr

Hallo!

Du kannst einfach auf null prüfen:

if (webBrowser1.Tag == null)
{
    // Tag nicht gesetzt
}

mfg

09.08.2007 - 23:41 Uhr

Hallo!

Wäre eine gute Idee.

Wobei mir aber nur die 1. Variante gefällt, da man bei den anderen ja wirklich gleich eine normale for-Schleife machen (also wenn man schon eine Lauf-Variable definieren muss und diese auch noch selber hochzählen muss ...)

Ausserdem sollte die Laufvariable meiner Meinung nach readonly sein, da man ja sonst den Sinn von foreach ("für jedes") verfehlen könnte. Und natürlich optional sollte sie sein.

Aber meiner Meinung nach hat foreach ohnehin einen kleinen, semantischen Fehler: Wenn ich "für jedes" TreeView-Control in einer Controls-Collection etwas machen will, würde die Schleife korrekterweise nur für alle TreeViews durchlaufen werden und nicht für jedes Control (was dann möglicherweise in einem InvalidClassCast-Exception endet).

mfg

08.08.2007 - 23:32 Uhr

Ja richtig, bei XP Home gibts diese Shared nicht (steht im übrigen auf dem verlinkten KB-Artikel).

08.08.2007 - 22:39 Uhr

Diese Shares gibt es im übrigen nicht nur unter XP sondern auch unter Server 2003 und Vista (und somit bei allen anderen Windows-Versionen wahrscheinlich auch).

08.08.2007 - 13:08 Uhr

Hallo!

Ich verwende Subversion. Es gibt da auch ein VS-Plugin dazu (Ankh: http://ankhsvn.tigris.org/), aber das soll nicht sehr stabil funktionieren, daher verwende ich den TortoiseSVN (also nur die Windows-Explorer-Integration).

mfg

06.08.2007 - 22:05 Uhr

Ebenfalls beruflich und privat 2007

05.08.2007 - 23:12 Uhr

Oder du verwendest einfach das NumericUpDown-Control

01.08.2007 - 17:07 Uhr

Hallo!

Das dürfte dir weiterhelfen: http://de.wikipedia.org/wiki/String-Matching-Algorithmus
Bzw. genauer das hier: http://de.wikipedia.org/wiki/Lewenstein-Distanz (sogar gleich mit C#-Implementierung 😉 )

mfg

01.08.2007 - 16:41 Uhr

Hallo!

Das kommt wahrscheinlich daher, dass auch die Uhrzeit mitgeprüft wird. Versuch mal einen Ausdruck der prüft ob das Geburtsdatum zwischen Heute|0:00 und Heute|23:55 ist.

mfg

26.07.2007 - 12:52 Uhr

Hallo Curel!

Das ist doch klar, dass du deine Werte immer wieder umschreibst, denn du hast ja nur ein Objekt. Um dies zu vermeiden, musst du in der Schleife jedes mal ein neues Objekt erzeugen.
Wenn du ein neues Objekt mit 'new' erzeugst und einer bestehenden Variable zuweist, wird ja nicht das alt Objekt mit dem neuen überschrieben, sondern die Referenz der Variable auf das neues Objekt gesetzt. Das alte Objekt bleibt somit am Leben und in der ArrayList.

MeinTyp meinObjekt;
for (int i = 0; i < 10; i++)
{
   meinObjekt = new MeinTyp();
   // Werte setzen
   meineListe.Add(meinObjekt);
}

mfg

26.07.2007 - 00:27 Uhr

Hallo!

Keine Ahnung ob es wirklich so ist:
Ich denke mal, dass es sicherheitstechnisch besser ist, wenn du zuerst komprimiert und dann erst verschlüsselst.
Begründung: Wenn jemand versucht, die Daten zu bekommen, ist es wesentlich schwerer komprimierte Daten zu knacken als "normale" Daten, da diese einen Sinn ergeben (im Gegensatz zu komprimierten Daten). Und dekomprimieren kann die Daten jeder der will.

mfg

25.07.2007 - 16:53 Uhr

Bei mir erscheint ebenfalls die erwartete Ausgabe: WinXP SP2, .NET 2.0

22.07.2007 - 03:59 Uhr

Dein Code zeichnet das Image ja auch nicht skaliert, sondern verschoben (30px nach unten und 30px nach rechts).

siehe Doku: http://msdn2.microsoft.com/de-de/library/system.drawing.graphics.drawimage(VS.80).aspx

EDIT: Ich vermute mal das "Graphics h ..." in deinem Code heisst eigentlich "Graphics g ...". Wenn dies der Fall ist, macht dein Code keinen Sinn, da du das geladene Image ja über ein anderes Image zeichnen willst ...

mfg

22.07.2007 - 03:12 Uhr

Hallo!

Bei Graphics.DrawImage gibt es viele Überladungen ( :rtfm: ). Mit einigen davon kann man das zu zeichnenden Image skaliert zeichnen.

Zu "Größe von Image ändern": Da gibt es anscheinend nichts eingebautes. Du kannst aber eine neues Images in der richigen Größe erstellen und dort skaliert reinzeichnen.

mfg

22.07.2007 - 03:00 Uhr

Hallo!

Was du brauchst nennt sich "URL Rewriting"

mfg

21.07.2007 - 18:48 Uhr

Hallo!

In der MAPIFolder.Items-Collection gibt es entsprechende Events für verschieben und entfernen.

mfg