Laden...

Forenbeiträge von UNeverNo Ingesamt 153 Beiträge

18.10.2011 - 18:39 Uhr

Mhh die bekomme ich mit Version 6.8 irgendwie nicht ans Laufen. Funktionieren die nur für Version 7?

Gibt es sonst Alternativen?

18.10.2011 - 17:30 Uhr

Ich suche ein Tool, was es mir ermöglicht visuell darzustellen welche Methoden welche anderen Methoden aufrufen könnten.

Also bspw.


void 1()
{
  2();
  3();
}

void 2()
{
  3();
}

void 3()
{
  4();
}

Ergebnis:


1--->2
|    |
|--->3--->4

17.10.2011 - 11:42 Uhr

Bei meinem letzten AG war Scrum im Einsatz, zumindest wurde es als solches betitelt. In der Realität war es nur eine Statusmeldung an den Gruppenleiter und artete in Langeweile aus, da einige Kollegen ewig auf Details ihrer derzeitigen Tätigkeit rumritten. Da kam schon mal schnell ein verschwendeter Manntag je Meeting zusammen...

Insofern bin ich absolut kein Fan von Scrum, aber es wurde wie ich vermute auch einfach falsch gelebt 😉

15.09.2011 - 14:04 Uhr

Sehr guter Beitrag, sollte imo in die FAQ verschoben werden 👍

08.09.2011 - 11:52 Uhr

Hallo,

ich habe es jetzt so gelöst, dass ich mir die Spalten die bei Klick auf den jeweiligen Auswahlbutton generiert werden in der Session gespeichert und dann nach weiterem Klick (auf den Imagebutton), wo er durch OnInit läuft diese dort wieder lade.

Danach funktionieren dann sowohl die Events vom ImageButton als auch das ItemCommand des DataGrids.

Also letztlich so ähnlich wie in Deinem Beispiel 👍

06.09.2011 - 11:43 Uhr

Genau so ist es. Dynamische Controls sollten im Page_PreInit erstellt werden, damit der Postback richtig funktioniert.
Bei Dir betrifft das nur das Hinzufügen der Spalte durch AddImageButton, die eigentlichen Buttons werden dann beim Binden der Daten automatisch erstellt.

Es sollte also reichen, wenn Du AddImageButton() im Page_PreInit aufrufst

Ich weiß nur im Init noch nicht, ob ich die Spalte brauche oder nicht. Ich hatte so einen Ansatz mit Visible schon mal verfolgt, aber leider brauche ich dann auch für die versteckten Spalten Daten und diese bekomme ich natürlich an der Stelle nicht...

05.09.2011 - 16:28 Uhr

Ich füge mir zur Laufzeit Spalten in ein DataGrid ein, u.a. auch eine ImageButton-Spalte.


		private void AddImageButton()
		{
			TemplateColumn tc = new TemplateColumn();
			tc.HeaderText = "PDF";
			tc.ItemTemplate = new ImageButtonTemplate();
			dgrSuchergebnis.Columns.Add(tc);
		}

		private class ImageButtonTemplate : ITemplate
		{
			#region ITemplate Member

			public void InstantiateIn(Control container)
			{
				ImageButton ib = new ImageButton();
				ib.CommandName = "PDF";
				ib.ID = "cbPDF";
				ib.Click += new ImageClickEventHandler(ib_Click);
				ib.Load += new EventHandler(ib_Load);
				ib.Command += new CommandEventHandler(ib_Command);
				container.Controls.Add(ib);
			}

			#endregion

			private void ib_Load(object sender, EventArgs e)
			{}

			private void ib_Command(object sender, CommandEventArgs e)
			{}

			private void ib_Click(object sender, ImageClickEventArgs e)
			{}

Load wird gefeuert, Command und Click nicht (und eins der beiden letzteren bräuchte ich) oder aber ich bekomme dgrSuchergebnis_ItemCommand irgendwie überredet was zu machen (bei einer normalen ButtonColumn wird das Event gefeuert).

Hab hier im Forum gelesen, dass es am Zeitpunkt des Hinzufügens hängen könnte und wahrscheinlich ist das auch mein Problem (wobei sich mir nicht erschliesst, wieso das Load und ItemCommand dann ausgelöst wird).

Ablauf ist bei mir:

  1. Seite laden
  2. Klick auf einen Button einer Liste
  3. abhängig davon vorbereiten der Spalten (hier: ImageButton) und
  4. laden der Daten
  5. sichtbar machen des Datagrids

Ich wüsste momentan nicht, wie ich das entzerren soll 🤔

01.09.2011 - 22:09 Uhr

Komisch, hatte ich vorher versucht und eine Fehlermeldung bekommen 🤔

Ich müsste nun noch Text in die Grafik schreiben. Allerdings habe ich noch eine Frage:

  1. Ich will berechnen, wie groß der einzufügende Text ist, allerdings bekomme ich zwei verschiedene Angaben.

            Bitmap dummy = new Bitmap(1, 1);
            Graphics g = Graphics.FromImage(dummy);
            Font f = new Font(FontFamily.GenericSansSerif, 12.0f);
            SizeF size = g.MeasureString("Abc", f);
            SizeF size2 = TextRenderer.MeasureText("Abc", f);

size liefert {Width = 33.7317657 Height = 20.1093712}
size2 liefert {Width = 37.0 Height = 20.0}

Die Höhe könnte man ja auf die Rundung schieben, aber was stimmt denn nun hinsichtlich der Breite?

Da ich vorhabe den Text mit TextRenderer.DrawText einfügen möchte, nehme ich an, dass diese Angabe stimmt?

01.09.2011 - 21:45 Uhr

Kannst du nicht irgendwie die Ausgangsfarbe auslesen und die "Übergangsfarbe"?
Die Differenz der beiden Farben sollte sich auch auf die neue Farbe übertragen lassen.

Das hatte ich anfangs auch so gedacht, war dann aber der Meinung, dass die Verschiebung von meiner Ausgangsfarbe
252,243,87 zu bspw. 255,0,0 zu gering wäre, als dass ich das auch auf die Zwischenfarben bspw. 205,197,71 übertragen könnte. Die neue Farbe wäre dann ja 207,0,0. Aber nachdem ich es dann doch mal ausprobiert habe, sieht es gut aus.

Code sieht derzeit so aus:


            Bitmap newBitmap = origBitmap;

            for (int x = 0; x < newBitmap.Width; x++)
            {
                for (int y = 0; y < newBitmap.Height; y++)
                {
                    Color pixelColor = newBitmap.GetPixel(x, y);
                    if (newBitmap.GetPixel(x, y) == oldColor)
                        newBitmap.SetPixel(x, y, newColor);
                    else
                    {
                        if ((pixelColor.A != 255) || (pixelColor.R == Color.Black.R && pixelColor.G == Color.Black.G && pixelColor.B == Color.Black.B))
                            continue;
                        double rDiff = (double)newColor.R / (double)oldColor.R;
                        double gDiff = (double)newColor.G / (double)oldColor.G;
                        double bDiff = (double)newColor.B / (double)oldColor.B;
                        Color diffColor = Color.FromArgb(255, (int)(pixelColor.R * rDiff), (int)(pixelColor.G * gDiff), (int)(pixelColor.B * bDiff));
                        newBitmap.SetPixel(x, y, diffColor);
                    }
                }
            }

Gibt es noch eine bessere Möglichkeit zwei Farben miteinander zu vergleichen als

(pixelColor.R == Color.Black.R && pixelColor.G == Color.Black.G && pixelColor.B == Color.Black.B)

? pixelColor == Color.Black funzt nicht, da der Name anders war.

01.09.2011 - 20:36 Uhr

Ich weiß mal wieder nicht wie das Ding heissen könnte, wonach ich suche. Es geht um Folgendes:

Ich habe ein Icon, welches nur zwei sichtbare Farben hat (gelb und als Umrandung schwarz). Dieses möchte ich je nach Vorgabe in eine andere Farbe ändern. was mit Bitmap.GetPixel und Bitmap.SetPixel auch ein Kinderspiel ist.

Das Problem ist nur, dass es auch nicht direkt sichtbare Zwischenfarben gibt, die einem erst auffallen, wenn man sie nicht ersetzt bzw. sich die Datei bspw. in Gimp vergrößert ansieht. Dann gibt es zwischen schwarz und gelb noch einige andere Farben die die Kanten fürs menschliche Auge runder machen. Ich müsste diese basierend auf der Ausgangsfarbe irgendwie mitverschieben in Richtung der Zielfarbe, hab aber leider gar keinen Ansatz wie sich das berechnen ließe...oder wonach ich suchen sollte.

30.08.2011 - 10:07 Uhr

Falls mal jemand vor der selben Frage steht:

Man braucht in VS 2010 und .NET 4 folgende Verweise:*Microsoft.SqlServer.Management.Sdk.Sfc.dll *Microsoft.SqlServer.Smo.dll *Microsoft.SqlServer.SqlWmiManagement.dll

Zu finden sind sie unter C:\Programme\Microsoft SQL Server\100\SDK\Assemblies
Abweichungen können sich durch Laufwerk, 64-bit-Programme oder eingesetzten SQL Server ergeben.

Diese usings benötigt man:*using Microsoft.SqlServer.Management.Smo; *using Microsoft.SqlServer.Management.Smo.Wmi;

Hat mir leider trotzdem nicht geholfen mein lokaler SQL Server 2000 bleibt versteckt, der 2008er Express hingegen ist auch ohne TCP/IP sichtbar 🙁

26.08.2011 - 17:07 Uhr

Ich will prüfen ob ((Text.Length > 0 && !chk.Checked) || (Text.Length == 0 && chk.Checked)).

Der Text kann also durchaus leer bleiben. Wenn ich mich nicht irre erwartet er aber dass ich ein ControlToValidate angebe.

Ich wollte die Methode jetzt eigentlich überschreiben. Disassembled sieht sie so aus:

    public virtual void Validate()
    {
      this._validated = true;
      if (this._validators == null)
        return;
      for (int index = 0; index < this.Validators.Count; ++index)
        this.Validators[index].Validate();
    }

Blöderweise kann ich nicht auf _validated zugreifen, da private und !IsValid ist nicht virtual, so dass ich gerade nicht weiter weiß...

edit: Ich habe es nochmal ohne Control ausprobiert und jetzt geht es 👍
Hätte schwören können, dass ich es schonmal probiert habe und es damals nicht ging...

26.08.2011 - 16:37 Uhr

Anscheinend ist es so, dass das Ding nicht validiert, wenn nix in der Textbox drinsteht, obwohl das gerade in Verknüpfung mit einem weiteren Feld mein zu prüfender Wert ist 🤔

Kann man das irgendwie overriden? Ab 2.0 gibt es dafür wohl ein extra Property 🙁

26.08.2011 - 16:08 Uhr

Hallo,

habe hier ein sehr mysteriöses Problem und zwar werden sämtliche CustomValidator einer Page nicht validiert, obwohl der Aufbau genauso wie auf allen anderen Pages ist.

Alle sollen das Event _ServerValidate beim Click auf meinen Speichern-Button auslösen, weswegen dort wie überall this.Validate aufgerufen wird.
Allerdings tut sich wie gesagt in keinem der _ServerValidates irgendetwas, d.h. sie werden nicht angesprungen, so als ob sie nicht da wären.
Habe den IIS schon neu gestartet - ohne Änderung...

Hatte schonmal jemand das Problem und hat vielleicht auch eine Lösung dafür parat?

edit: Habe jetzt anstelle des Events ServerValidate in der HTML-Ansicht das Attribut OnServerValidate verwendet. Keine Änderung 🙄

26.08.2011 - 14:33 Uhr

Kann man das irgendwo einstellen, dass hier ein Fehler ausgelöst wird (und ich entsprechend zur Position springen kann)? Hab hier ein VS 2003...

Oder gibt es alternativ ein externes Tool mit dem man das erledigen kann? Irgendwie hat mir das VS 2003 nämlich auf einigen ASP-Seiten die Event-Abos X( gekillt und ich würde gern sichergehen, dass noch alles so funktioniert wie es soll...

25.08.2011 - 13:40 Uhr

Bin bei meiner Recherche grad auf Pencil gestossen. Sieht interessant aus und ist Open Source.
Gibt es als FF-Plugin (hier muss man sich die XPI-Datei anpassen, funzt dann auch mit FF6) und als eigenständiges Programm (welches bei mir unter XP aber ewig brauchte um die Kontextmenüs zu laden).

Pencil: Pencil
XPI ändern: Editing an add-on to change its compatibility

25.08.2011 - 11:46 Uhr

Weiß leider nicht genau wie man die Art der Programme bezeichnet, aber was ich suche ist ein Programm, in dem man Buttons, Label, Menüs, etc. positionieren kann ohne eine Logik zu verbauen.

In meiner letzten Firma wurde sowas benutzt und war recht praktisch um zu verstehen, was das Produktmanagement sich etwa vorstellt. In meiner derzeitigen Firma ist sowas leider noch nicht etabliert.

Und jetzt bitte kein Verweis auf die Express-Edition, ich will meine Kollegen nicht überfordern, es soll so einfach wie möglich sein.

15.08.2011 - 15:21 Uhr

Wenn ich es richtig verstehe wartest Du auf die Fertigstellung einer Aktion? Dann benutze bitte auch einen extra Thread dafür.

Einfach mal hier im Forum oder bei Google danach suchen.

Damit wir uns nicht falsch verstehen mit dem Thread; ich meine das da: Thread-Klasse
oder auch das da: BackgroundWorker-Klasse

11.08.2011 - 11:45 Uhr

Oder eine Basisklasse die ein Event implementiert, von der die anderen Klassen ableiten? Müsstest dann jeweils die Events registrieren und an einer zentralen Stelle verarbeiten.

04.08.2011 - 10:09 Uhr

Im DGV regiere ich auf das Event CellEnter, was sowohl durch Klick als auch durch Tastatureingaben Up, Down, PageUp, PageDown getriggert wird.

Mein DGV befülle ich komplett über den Code. Blöderweise triggert das Event trotzdem bei der Initialisierung mit dem RowIndex 0.

Will ich nun aus meiner gesuchten Zelle den Wert Value extrahieren ist dieser null und die Methode ToString() schlägt fehl.

Ich bin jetzt auf der Suche nach einer eleganteren Lösung als immer erst Value auf Null zu prüfen, ehe ich darauf ToString mache, da es wie gesagt nur den einen Initialisierungsfall betrifft...

20.07.2011 - 15:01 Uhr

Fehlt da ein protected oder verstehe ich Dich gerade falsch?

17.07.2011 - 19:11 Uhr

Was willst du denn eigentlich erreichen?

Es geht mir halt nicht nur um das mitschneiden, sondern auch um das abändern der SQLs in eine leserlichere Form.

der
>
ist OpenSource und könnte angepasste/eingebaut werden.

Davon hatte ich auch schon gelesen, wollte es zwar eigentlich gern selbst machen, aber naja, dann schau ich mir das mal genauer an, danke 😃

16.07.2011 - 20:44 Uhr

Hallo Forum,

ich wollte mir ein kleines Tool schreiben, welches mir die abgefeuerten SQLs auf einer bestimmten SQL Server Instanz mitschneidet, ähnlich der Ablaufverfolgung vom SQL Profiler.
Hab im Internet dazu auch schon was gefunden: Stichwort TraceServer (Namespace: Microsoft.SqlServer.Management.Trace (Programmatically receiving profiler events (in real time) from SQL Server 2005); hier im Forum leider gar nichts). Wie es aussieht muss man bei der Initialisierung dem Ding aber eine TDF-Datei mitgeben und die kann man nur mit dem SQL Profiler erzeugen.

Nun habe ich aber in der Express Version keinen SQL Profiler zur Verfügung...ihr versteht das Dilemma?

Gibt es eine Möglichkeit die TDF manuell zu erstellen?
Oder kann man die SQLs noch irgendwie anders abfangen? Soll wie geschrieben für eine beliebige Instanz (auch im Netz) möglich sein und ab SQL Server 2000 funktionieren...

14.07.2011 - 16:29 Uhr

Vermutlich läuft für Turtoise ein Dienst mit Adminrechten. Das wäre wohl auch für Deine Aufgabe die Lösung.

02.07.2011 - 11:05 Uhr

Da ich nur PHP-webspace habe, bin ich grad dabei in Silverlight einen PHP-WSDL-webservice zu konsumieren.
Allerdings kann man auf die Datentypen natürlich kein foreach anwenden, da er kein GetEnumerator hat. Gibt es eine Möglichkeit ihm das beizubringen, oder muss ich da einen Count dranbasteln zum manuellen iterieren?

28.06.2011 - 15:14 Uhr

ganz wichtig: in C# nutzt man keine ArrayListen, sondern typisierte Listen, wie List<T>; in Deinem Fall also List<Teilnehmer>.

In .NET 1.1? Zeig mir mal wie das geht...

Danke für den Rest 😉

[EDIT=winSharp93]Beiträge zusammengefügt[/EDIT]

Wieso wird das rausgelöscht, was ich dazu editiert hatte? Ich hatte nachgefragt, ob ich winSharp93 richtig verstanden habe, dass er mir empfiehlt die Objekte zu Removen und neu zu Adden?

28.06.2011 - 14:56 Uhr

Ich habe eine ArrayList mit mehreren Objekten eines Typs. Nun möchte ich die Arrayliste durchlaufen und Methoden eines Objekts verändern. Allerdings werden meine Änderungen nicht übernommen.


private void Change(Teilnehmer tChange)
{
  foreach (Teilnehmer tCurr in arrayList)
  {
    ChangeTeilnehmer(tChange, tCurr);
  }
}

private void ChangeTeilnehmer(Teilnehmer tChange, Teilnehmer tCurr)
{
  tCurr = tChange; //Änderung wird übernommen, aber das Listenobjekt bleibt gleich
}

Woran liegt das? Ich dachte bisher, dass Klassen automatisch bei der Übergabe an andere Methoden byref dort reingegeben werden, es wird doch kaum ein Clone erfolgen, oder ?(
Was muss ich ändern, damit es funktioniert?

21.06.2011 - 17:04 Uhr

Ich hab das Problem schon verstanden, nur derjenige, der mir die Tabellen aufgesetzt hat offensichtlich nicht.
Daher wollte ich mir jetzt einfach grafisch die Verweise mal markieren um das Konstrukt besser zu verstehen.

Ob ich so einfach primary keys hinzufügen kann...mhh k.a. was das wieder für Auswirkungen auf die DB-Schicht hat, will da auch nicht unbedingt buddeln gehen.

21.06.2011 - 14:29 Uhr

Ich bekomme in MSSQL 2000 die Meldung "Bevor Tabelle XYZ an einer Beziehung teilnehmen kann, muss ein Primärschlüssel oder eine UNIQUE-Einschränkung definiert sein".

Ich hab da aber nur ne Identity drauf und will nicht mein komplettes DB-Design ändern müssen, um mit dem Tool arbeiten zu können. Die Frage ist jetzt, ob es mit den Express-Versionen immer noch diese Einschränkung gibt.

Nun verständlich?

21.06.2011 - 13:11 Uhr

Ich hab hier eine 2000er-Version und um dort Beziehungen grafisch zu visualisieren muss man die Beziehungen auch in der DB herstellen. Das will ich aber nicht unbedingt über den SQL-Server abbilden sondern eher programmatisch.
Ist das mit den neueren Express-Versionen anders?

21.06.2011 - 10:58 Uhr

Hab schon Toad und DataBaseSpy gefunden. Das Problem ist: Beide kosten was.

Ich suche also eine kostenlose Alternative zu den beiden Tools, mit dem ich auf eine bestehende MSSQL-DB zugreifen kann und Beziehungen definieren kann, etc.

20.06.2011 - 14:50 Uhr

Hat jemand eine Ahnung, ob es Mercurial/Git irgendwo in den Weiten des Webs ein Plugin für VS 2003 gibt? Hab durch ein Google grad nichts dazu gefunden. Ich lese immer nur etwas von VS2005/08/10.

08.06.2011 - 12:44 Uhr

Danke für den ersten Input. Das hilft mir schon mal weiter.

Die (Unter-)Menüs werden - Stand jetzt - sich immer auf einige wenige Punkte beschränken (max. 5) und wohl max. 3 Ebenen haben.
Es muss kein Menü im Sinne von Kontextmenüs sein, die Punkte sollten aber schon irgendwie gruppiert sein.
Art der Anwendung wird ein Dokumentationstool sein, also die Erfassung von Daten sowie abhängigen weiteren m Daten (ggf. n-fach).
Die Anwendung wird regelmäßig benutzt werden, teils täglich, teils irgendwann erstmalig.

Daher soll es eben so übersichtlich und einfach zu bedienen sein wie möglich.

07.06.2011 - 17:55 Uhr

Gibt es irgendwelche Modelle wie ich Benutzer mit möglichst wenigen Klicks übersichtlich durch meine (Unter-)Menüs führe?

Früher hat man ja dafür Kontextmenüs (zu viel Geklicke und bei wenigen Menüpunkten mit Kanonen auf Spatzen geschossen) verwendet oder auch Wizard-ähnliche (Tabs sind einfach hässlich) Umsetzungen. Wie macht man es derzeit am besten mit WinForms?

14.04.2011 - 09:29 Uhr

Ja, da hast Du schon recht. Ich dachte jetzt eher an den Fall, das neue Methoden hinzukommen, die ich hier nicht unbedingt benötige. Dann müsste ich vermutlich doch im Normalfall auch auf .NET-Seite die Klasse anpassen, oder?

13.04.2011 - 16:25 Uhr

Wenn man JSON-Objekte verarbeiten möchte, muss man das Objekt in C# nachmodellieren (s. bspw. Consume a JSON object in Silverlight). Das wäre schon möglich, allerdings hat man dann eben immer den doppelten Änderungsaufwand.
Daher dachte ich daran die zu exportierende Struktur so aufzubereiten, dass ich sie mit dem XmlSerializer wieder zu einem C#-Objekt zusammen setzen kann.

Allerdings scheint der XmlSerializer immer auch eine modellierte Klasse zu benötigen um das Objekt wieder zusammensetzen zu können. In der MSDN finde ich nur

Der XmlSerializer kann die folgenden Elemente weder serialisieren noch deserialisieren:
Arrays von ArrayList.
Arrays von List<T>.

Also wollte ich es mal dynamisch versuchen. Mit dem ExpandoObject hat es nicht funktioniert > Fehlermeldung:

(System.InvalidOperationException: To be XML serializable, types which inherit from IEnumerable must have an implementation of Add(System.Object) at all levels of their inheritance hierarchy.

Hab es dann mit folgender dynamischen Klasse probiert:

    public class MyClass : DynamicObject
    {
        Dictionary<string, object> members;

        public MyClass()
        {
            members = new Dictionary<string, object>();
        }

        public override bool TrySetMember(SetMemberBinder binder, object value)
        {
            if (!members.ContainsKey(binder.Name))
            {
                members.Add(binder.Name, value);
                return true;
            }
            return false;
        }

        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            if (members.ContainsKey(binder.Name))
            {
                result = members[binder.Name];
                return true;
            }
            result = null;
            return false;
        }        
    }

und zwar so:


            dynamic myClass = new MyClass();
            myClass.Bool = true;
            myClass.Double = 1.04;
            myClass.Int = 15;
            myClass.Int64 = 1235;
            //myClass.MyC = new MyClass();
            myClass.String = "Hallo! Welt!";
            XmlSerializer ser;
            ser = new XmlSerializer(typeof(MyClass));
            StreamWriter sw = new StreamWriter(@"C:\serial.txt", false);
            ser.Serialize(sw, myClass);
            sw.Close();

Allerdings hatte ich dann Null Inhalt in der serialisierten Datei:


<?xml version="1.0" encoding="utf-8"?>
<MyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />

Geht das irgendwie dynamisch? Oder kann ich das irgendwie anders lösen?

18.03.2011 - 16:22 Uhr

Ich hab es jetzt über eine Richtextbox gelöst und zwar eine spezielle, die auch Print unterstützt. Falls es jemand braucht, einfach mal nach richtextboxprintctrl googlen.

Bei mehrzeiligen unterschiedlichen Formatierungen mit AppendText arbeiten, die direkte Verwendung von Text löscht vorhandene Formatieren.

17.03.2011 - 18:42 Uhr

Derzeit drucke ich meine Form nachdem sie angezeigt wurde und man den Drucken-Button gedrückt hat. Nun würde ich sie aber gern zu einer Art Vorlage umfunktionieren, die nicht angezeigt, sondern direkt ausgedruckt wird.

Mit meinem jetzigen Weg wüsste ich nicht, wie ich das realisieren soll, da die Form ja zuerst gezeichnet (und damit angezeigt) werden muss ehe der Druck funktioniert.

Hier mein derzeitiger Weg:


    internal partial class MissingRessource : Form
    {
        private const int SRCCOPY = 0xCC0020;
        [DllImport("gdi32.dll")]
        private static extern bool BitBlt(IntPtr hdcDest, Int32 x, Int32 y, Int32 Width, Int32 Height, IntPtr hdcSrc,
            Int32 xSrc, Int32 ySrc, Int32 dwRop);
        private Bitmap b;

        private void PrintThis()
        {
            Graphics gr = this.CreateGraphics();
            b = new Bitmap(this.Width - 10, this.Height - 90, gr);
            Graphics memGr = Graphics.FromImage(b);

            IntPtr srcDC = gr.GetHdc();
            IntPtr destDC = memGr.GetHdc();

            BitBlt(destDC, 0, 0, this.Size.Width - 10, this.Size.Height - 90, srcDC, 0, 0, SRCCOPY);

            gr.ReleaseHdc(srcDC);
            gr.Dispose();
            memGr.ReleaseHdc(destDC);
            memGr.Dispose();

            printDocument1.Print();
            gr.Dispose();
        }

        private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            e.Graphics.DrawImage(b, 0, 0);
        }

        private void print_Click(object sender, EventArgs e)
        {
            PrintThis();
            Application.Exit();
        }

Habe ich was übersehen oder gibt es einen anderen Ansatz? Ich brauche eine Form, da ich dynamisch Inhalte reinladen möchte.

22.02.2011 - 12:19 Uhr

Hat sowas noch niemand gemacht? 🙁

16.02.2011 - 14:31 Uhr

Ich möchte Daten von PHP über JSON an Silverlight schicken. Habe dazu ein Beispiel in den Weiten des Netzes gefunden, allerdings weiß ich nicht, welchen Projekttyp ich in Silverlight benötige, damit es so funktioniert, wie ich es mir vorstelle.

Ich habe eine PHP-Datei Person.php, die mir über JSON erstmal exemplarisch Daten schickt

<?php

	class Person
	{
		public $FirstName;
		public $LastName;
		public $Typ;
	}
	
	$p1 = new Person();
	$p1->FirstName = "Franz";
	$p1->LastName = "Beckenbauer";
	$p1->Typ = "Fussballer";
	
	$p2 = new Person();
	$p2->FirstName = "Michael";
	$p2->LastName = "Schumacher";
	$p2->Typ = "Rennfahrer";
	
	$p3 = new Person();
	$p3->FirstName = "Anna";
	$p3->LastName = "Kurnikova";
	$p3->Typ = "Tennisspielerin";
	
	$p4 = new Person();
	$p4->FirstName = "Barack";
	$p4->LastName = "Obama";
	$p4->Typ = utf8_encode("Präsident");
	
	if(isset($_GET['Person']))
	{
		echo json_encode(array($p1, $p2, $p3, $p4));
	}
	
?>

Das funktioniert wie erwartet auch, beim Aufruf im Browser bekomme ich Folgendes:

[{"FirstName":"Franz","LastName":"Beckenbauer","Typ":"Fussballer"},{"FirstName":"Michael","LastName":"Schumacher","Typ":"Rennfahrer"},{"FirstName":"Anna","LastName":"Kurnikova","Typ":"Tennisspielerin"},{"FirstName":"Barack","LastName":"Obama","Typ":"Pr\u00e4sident"}]

Nun versuche ich diese Daten in Silverlight darzustellen, allerdings bekomme ich nichts angezeigt, wenn ich debuggen möchte, meldet mir das Studio auch, dass diese Stelle nie erreicht wird. Ich verwende eine Silverlight Application -> ASP.NET Web Application Project. Mir ist klar, dass ASP der falsche Typ ist, da ich ja eben ohne IIS auskommen möchte, aber was brauche ich denn, damit ich zwischen PHP und Silverlight kommunizieren kann?

Hier mal noch der Silverlight-Code:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Json;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Collections.ObjectModel;
using System.IO;
using System.Text;

namespace SilverlightApplication4
{
    public partial class MainPage : UserControl
    {
        private ObservableCollection<DataResult> dataCollection = new ObservableCollection<DataResult>();

        public MainPage()
        {
            InitializeComponent();
            GetServerData();
        }

        private void GetServerData()
        {
            Uri serverUri = new Uri("http://127.0.0.1:8080/person.php?Person");
            WebClient serverIndividualsClient = new WebClient();
            serverIndividualsClient.OpenReadCompleted += new OpenReadCompletedEventHandler(serverIndividualsClient_OpenReadCompleted);
            serverIndividualsClient.OpenReadAsync(serverUri);
        }

        void serverIndividualsClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
        {
            using (e.Result)
            {
                JsonArray resultArray = (JsonArray)JsonArray.Load(e.Result);
                foreach (JsonObject RawObject in resultArray)
                {
                    DataResult dr = new DataResult();
                    dr.FirstName = RawObject["FirstName"];
                    dr.LastName = RawObject["LastName"];
                    dr.Typ = RawObject["Typ"];
                    dataCollection.Add(dr);
                }
                DetailsView.ItemsSource = dataCollection;
            }
        }

        private void SubmitButton_Click(object sender, RoutedEventArgs e)
        {
            Uri serverUri = new Uri("http://127.0.0.1:8080/sendIndividuals.php");
            
            DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(ObservableCollection<DataResult>));
            MemoryStream mem = new MemoryStream();
            ser.WriteObject(mem,dataCollection);
            string serdata = Encoding.UTF8.GetString(mem.ToArray(), 0, (int)mem.Length);
            WebClient backPostClient = new WebClient();
            backPostClient.UploadStringCompleted += new UploadStringCompletedEventHandler(cnt_UploadStringCompleted);
            backPostClient.Headers["Content-type"] = "application/json";
            backPostClient.Encoding = Encoding.UTF8;
            backPostClient.UploadStringAsync(serverUri, "POST", serdata);
        }

        private void cnt_UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)
        {
            if (e.Result != null)
            {
                SubmitButton.Content = "Sent!";
            }
        }
    }
}

<UserControl x:Class="SilverlightApplication4.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk">

    <Grid x:Name="LayoutRoot" Background="White">
        <sdk:DataGrid x:Name="DetailsView" Margin="8,8,8,43" />
        <Button x:Name="SubmitButton" HorizontalAlignment="Right" VerticalAlignment="Bottom" Width="75" Content="Update" Margin="0,0,8,8" Click="SubmitButton_Click" />
    </Grid>
</UserControl>

26.01.2011 - 09:23 Uhr

Ich werde es durch ein Gif lösen, erscheint mir einfacher zu handlen.

25.01.2011 - 15:54 Uhr

Wieso einfach wenns auch kompliziert geht 🙂 Schau dir einfach mal das Style Property der Progressbar an.

Naja, dabei lernt man mehr 😁

Marquee-Style ist ja ganz nett, nur läuft der Balken dann immer von links nach rechts. Ich hätte ihn aber gern wie eine Art Ping-Pong-Ball wechselseitig hin und her gehend. Gibt es da noch eine Property, die ich übersehen habe oder muss ich dann auf RTL zurückgreifen?

Und wie bekomme ich TI und RTL synchronisiert? Auf meinem Win 7 sind 50 MarqueeAnimationSpeed und 2000 TimerInterval der Wert, dass es genau 1x hin und 1x zurück läuft.
Unter Win XP läuft es 5x in jede Richtung, ehe sich was ändert.

edit: Ich finde ums Verrecken kein Event, welches mich informieren würde, wenn der Balken grad ganz rechts am Anschlag ist X(

25.01.2011 - 15:24 Uhr

Ich habe einen Prozess, der recht zeitaufwendig ist. Damit man sieht, dass noch etwas passiert, will ich eine unendliche Progressbar (das Ding was mit Vista eingeführt wurde, k.a. wie es wirklich heißt) verwenden. D.h. der Balken wandert von links nach rechts und zurück, bis der andere Prozess fertig ist.

Ich hab das jetzt als Backgroundworker mit Timer und Progressbar umgesetzt, funktioniert im Ansatz auch schon, allerdings habe ich das Problem, dass er immer nur etwa 80% korrekt darstellt und dann schon den Sprung macht, also etwa so:

1.2.3.4....80
-->

Sprung

80....4.3.2.1
<--

Sprung

Ich verwende die Property RightToLeftLayout bei gleichzeitigem Null-setzen des Values.
Ich nehme an, dass das irgendwas mit MarqueeAnimationSpeed meiner Progressbar und dem Timerintervall zu tun hat, hab aber keine Ahnung, wo es da genau hängen könnte (derzeit sind MAS = 50 und TI = 100).
Wenn ich das TI auf 2000 setze, funktioniert alles, ist mir aber einfach zu langsam dann 🙁

Hier noch der Code, falls es sich jemand antun möchte 😉 :


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication7
{
    public partial class Progress : Form
    {
        private BackgroundWorker bWorker;
        private System.Windows.Forms.Timer timer;

        private enum UpdateTypes
        {
            ValueAdd,
            ValueReStart,
            RTLChange
        };

        delegate void SetPBCB(ProgressBar p, UpdateTypes ut);


        public Progress()
        {
            InitializeComponent();
            bWorker = new BackgroundWorker();
            bWorker.DoWork += new DoWorkEventHandler(bWorker_DoWork);
            timer = new System.Windows.Forms.Timer();
            timer.Tick += new EventHandler(timer_Tick);
        }

        private void timer_Tick(object sender, EventArgs e)
        {
            bWorker.RunWorkerAsync();
        }

        private void SetPB(ProgressBar p, UpdateTypes ut)
        {
            if (p.InvokeRequired)
            {
                SetPBCB progressbar = new SetPBCB(SetPB);
                this.Invoke(progressbar, new object[] { p, ut });
            }
            else
            {
                if (ut == UpdateTypes.ValueAdd)
                {
                    p.Value = p.Value + 20;
                }
                else if (ut == UpdateTypes.ValueReStart)
                {
                    p.Value = 0;
                }
                else if (ut == UpdateTypes.RTLChange)
                {
                    if (p.RightToLeft == RightToLeft.Yes)
                    {
                        p.RightToLeft = RightToLeft.No;
                        p.RightToLeftLayout = false;
                    }
                    else
                    {
                        p.RightToLeft = RightToLeft.Yes;
                        p.RightToLeftLayout = true;
                    }
                }
                p.Refresh();
            }
        }

        private void bWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            
            if (this.pb.RightToLeft == RightToLeft.Yes)
            {
                if (this.pb.Value == 100)
                {
                    SetPB(pb, UpdateTypes.RTLChange);
                    SetPB(pb, UpdateTypes.ValueReStart);
                }
                else
                {
                    SetPB(pb, UpdateTypes.ValueAdd);
                }
            }
            else
            {
                if (this.pb.Value == 100)
                {
                    SetPB(pb, UpdateTypes.RTLChange);
                    SetPB(pb, UpdateTypes.ValueReStart);
                }
                else
                {
                    SetPB(pb, UpdateTypes.ValueAdd);
                }
            }
        }

        public void Start()
        {
            timer.Interval = 100;
            timer.Start();
        }

        public void Stop()
        {
            bWorker.CancelAsync();
        }

        private void button1_Click_1(object sender, EventArgs e)
        {
            Stop();
        }
    }
}

14.12.2010 - 16:48 Uhr

Ich hoffe dass irgendjemand das MS Chart Control schon mal eingesetzt hat. Gab es als Erweiterung vom 3.5er Framework.

Ich lasse mir einen Graph zeichnen und möchte einen bestimmten Wertebereich markieren. Dazu verwende ich SelectionStart und SelectionEnd. Das funktioniert soweit auch recht gut.
Ich habe jedoch das Problem, dass dieser Wertebereich auch in Y-Richtung aus dem angezeigten Abschnitt herauslaufen kann.

Also ich habe bspw. die Werte 1, 3, 5, möchte aber den Wertebereich >3 einfärben lassen. Das Grid zeigt mir nun automatisch nur einen Abschnitt bspw. 0..6 an, k.A. wie er das intern berechnet. Setze ich nun SelectionEnd auf double.PositiveInfinity zeigt er mir leider keinen selektierten Bereich mehr an.

Ich hatte daher die Idee auf AxisY.Minimum zurückzugreifen, leider ist das vor dem Zeichnen des Grids anscheinend nicht möglich.

Alternativ ginge es über Points.FindMaxByValue().YValues[0], allerdings müsste ich dann wiederum wissen, wie das Grid skaliert, damit ich auch wirklich bis zur Grenze markieren kann.

Jemand eine Idee, wie ich das am Besten anstelle? X(

02.11.2010 - 20:59 Uhr

Eigentlich würd ich gern sowas wie hier machen. Allerdings scheint das nur mit dem Custom Control zu funktionieren, wenn ich es richtig sehe.

Ich hab mir mal das Beispielprojekt runtergeladen und versucht das auf mein Projekt zu adaptieren. Allerdings hört da bei mir schon wieder recht schnell das Verständnis auf; daher ja auch die initiale Frage nach einem guten Beispiel zu der Aufgabe...

Momentan sieht es jetzt so aus:

            <ObjectDataProvider x:Key="Buchungen" 
                ObjectType="{x:Type local:Db}" MethodName="GetTable">
                <ObjectDataProvider.MethodParameters>
                    <x:Type TypeName="local:Buchungen" />
                </ObjectDataProvider.MethodParameters>
            </ObjectDataProvider>

In der Enterprise.designer.cs (vom dbml) steht folgendes drin, daher denke ich, dass die Zeile mit dem ObjectType schon mal stimmen sollte:

	[global::System.Data.Linq.Mapping.DatabaseAttribute(Name="db")]
	public partial class Db : System.Data.Linq.DataContext

Beim Start bekomme ich aber nichts angezeigt, weil vermutlich das Binding fehlt. In dem downgeloadeten Beispiel sieht das so aus:

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
    xmlns:local="clr-namespace:WpfObjectProviderWithLinqToSql"
    Title="How to bind declaratively LINQ to SQL DataContext using ObjectDataProvider" 
    Height="400" Width="500" ResizeMode="NoResize">
    <Grid>
        <Grid.Resources>
            <ObjectDataProvider x:Key="customers" 
                ObjectType="{x:Type local:NorthwindDataContext}" MethodName="GetTable">
                <ObjectDataProvider.MethodParameters>
                    <x:Type TypeName="local:Customer" />
                </ObjectDataProvider.MethodParameters>
            </ObjectDataProvider>
        </Grid.Resources>
        <telerik:RadGridView Name="RadGridView1" telerik:Theming.Theme="Vista" 
            ItemsSource="{Binding Source={StaticResource customers}}">
        </telerik:RadGridView>
    </Grid>

Dort verwenden sie aber wie gesagt ein Custom Control und ich würd das gern mit Standardcontrols hinbekommen.

31.10.2010 - 18:33 Uhr

Ich hab jetzt einiges ausprobiert, aber irgendwie bekomme ich kein Bindung zur DB zustande.

Wenn ich ein 08/15-Beispiel Label zu Slider nachprogrammiere, funktioniert es, da ich ja einfach auf den Namen verweise.

Bei der DB weiß ich aber grad nicht, was ich ansprechen soll. Hab mal gegoogelt, aber entweder finde ich was mit ObservableCollection, oder mit DataSets, aber nichts mit Linq to SQL, bzw. was ich da finde ist entweder nicht idiotensicher genug (von der dbml über eine Erklärung bis zum XAML-Binding), oder ich verstehe es schlicht nicht.

Ich möchte aber auch kein Binding im Code erzeugen, geht ja auch, sondern ein direkteres in der XAML-Struktur.

Testhalber hatte ich mal das versucht:

    <StackPanel>
        <TextBlock Text="{Binding Path=Kategorien}" />
    </StackPanel>

oder auch Kategorien.Kategorie, aber da ich selbst da nichts angezeigt bekomme, habe ich wohl was Grundlegendes nicht verstanden...