Laden...

Forenbeiträge von MrDigi Ingesamt 9 Beiträge

23.11.2012 - 23:14 Uhr

Hallo,

ich möchte etwas gefühlt ganz einfaches machen.

Aufgabe:
Ein Form soll per Mausklick vom MDI Parent "gelöst"und auch per Mausklick wieder in das Mdi Parent wieder "hinzugefügt" werden können.

Ausgangssituation:
Ich erstelle im ParentForm mehrere Mdi Children (s.u. add_Click). Ich kann danach jedem Child durch Klick irgendwo dessen Form den Fokus geben.

Problem:
Wenn ich nun ein Form löse (button1_Click) und wieder dem Mdi Parent hinzufüge (button2_Click) funktioniert bei allen MDI Children das Fokussieren nur noch durch Klick auf deren Titelzeile. In das Form selbst klicken hat keine Auswirkungen mehr.

Mache ich was falsch ? Ist das ein Bug ? Ein Feature ? ...
Kann ich ein Form nur VOR dem Show() Ereignis einem MdiParent zuweisen ?

Grüße
MrDigi

Beispielapplikation, sehr trivial:
ParentForm hat einen Button zum Erstellen von MDI Childforms:


private void add_Click(object sender, EventArgs e)
        {
            ChildForm f = new ChildForm();
            f.MdiParent = this;
            f.Show();
        }

ChildForm hat 2 Buttons zum Lösen und Hinzufügen:


        private void button1_Click(object sender, EventArgs e)
        {
            this.Hide();
            this.MdiParent = null;
            this.Show();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            this.Hide();
            this.MdiParent = parentForm;
            this.Show();
        }

02.04.2012 - 20:24 Uhr

Hi,

@Abt:

Danke für die Antwort...aber 😃

Die Requests sind in Klassen gekapselt und sind programmtechnisch komplett unabhängig voneinander.

Nichts für ungut, vielleicht habe ich mich falsch ausgedrückt. Die Requests sind komplett unabhängig voneinander, die Instanzen der WebRequest-Klassen werden auch nur einmal benutzt (was anderes geht glaube ich gar nicht).

Dass das Vorhaben zudem Thread-sicher ist, kann ich mir nicht vorstellen.

Ich kann nicht ganz nachvollziehen was bei

request.BeginGetResponse(HttpResponseCallback, state);

nicht Thread-Safe sein soll.

Grüße
MrDigi

02.04.2012 - 16:12 Uhr

Hallo weismat,

danke für Deine Antwort.

Ich benutze für jeden Request ein Objekt. In meinem Codebeispiel ist das in StartRequest ja bereits zu sehen.

Die Requests sind in Klassen gekapselt und sind programmtechnisch komplett unabhängig voneinander.

Wenn ich den Request der "hängt" mit Abort() abbreche und nochmal neu starte funktioniert auch das Aufrufen des Callbacks.

Ideen ?

Grüße
MrDigi

30.03.2012 - 14:42 Uhr

Hallo Community,

ich habe ein merkwürdiges Problem, auch schon gegoogled und gelesen aber nichts wirklich ähnliches gefunden:

Ich führe beim Starten meiner C# (.Net 2.0) Applikation mehrere WebRequests hintereinander durch. Die Verbindungen bleiben dann über die Laufzeit des Programms geöffnet. Eigentlich wirklich nichts außergewöhnliches:


private void StartRequest() {
//...
request = (HttpWebRequest)WebRequest.Create(url);
//...
IAsyncResult result = request.BeginGetResponse(HttpResponseCallback, state);
}


private void HttpResponseCallback(IAsyncResult asyncResult)
{
  RequestState state = (RequestState)asyncResult.AsyncState;
  Log("ResponseCallback executed");
  //...
}


Die TCP-Daten werden alle **ordnungsgemäß **an den Server gesendet und auch beantwortet (mit WireShark und Netzwerkablaufverfolgung http://msdn.microsoft.com/de-de/library/ty48b824%28v=vs.80%29.aspx geprüft).

Komischerweise wird aber **nicht **bei allen Antworten der Callback HttpResponseCallback aufgerufen:
Bei 3 Requests wird bei maximal 2 auch HttpResponseCallback aufgefufen. Die anderen Verbindungen bleiben einfach "in der Luft" hängen, obwohl halt definitiv Daten ankommen.

Hatte erst DefaultConnectionLimit vom ServicePoint Manager im Verdacht, das war es aber nicht.

Sind irgendwem Bugs in der WebRequest-Klasse bekannt oder hat jemand gute Ideen was ich ändern/debuggen könnte ?

Eine Lösung hier ist zwischen den einzelnen BeginGetResponse()-Anfragen ein sleep(1000) einzubauen, dann funktioniert es. Aber das ist mehr als Pfui.

Hoffe ein hier sind ein paar Spezies die vielleicht schon einmal ähnliche Probleme hatten.

Grüße
MrDigi

08.06.2010 - 11:59 Uhr

Hallo zusammen,

und schonwieder wer mit einem "Flackerproblem". Habe schon die SuFu bemüht, aber nichts passendes gefunden.

Mein Problem abstrakt umrissen:
Ich zeichne in ein Panel mehrere Graphen, das funktioniert auch problemlos. Habe dazu die OnPaint-Methode überschrieben.

Jetzt habe ich in das Panel ein Koordinatenkreuz gelegt, welches dem Mauszeiger folgt. Also der Mittelpunkt des Koordinatenkreuzes liegt unterm Mauszeiger, zusätzlich werden die X- und Y- Position des Mauszeigers angezeigt.

Dazu habe folgende Ansätze probiert:

  1. Versuch: Bei jedem MouseMove-Event im Panel rufe ich Refresh() auf, damit alles neu gezeichnet wird, inklusive Koordinatenkreuz. Ergebnis: Viele Events, der ganze Graph flackert beim Maus bewegen

  2. Versuch: Das MouseMove-Event ruft maximal 10 mal pro Sekunde das Refresh() auf. Ergebnis minimal besser, aber es flackert weiterhin.

  3. Versuch: Ich zeichne den Graphen in ein Bitmap im Speicher da dieser sich nicht verändert. Ich lade bei jedem MouseMove() das Bitmap und zeichne das Koordinatenkreuz dort hinein. Ergebnis bleibt dasselbe, es flackert. Anscheinend ist das Bitmap laden/zeichnen nicht schneller als den Graphen komplett neu zu zeichnen.

Welche Möglichkeiten habe ich noch, oder habe ich einen falschen Ansatz gewählt ?

Wäre Invalidate die Lösung der Wahl ?

Grüße
MrDigi

02.04.2010 - 17:40 Uhr

Hallo,

ich lade jetzt die Assemblies erst mit Assembly.ReflectionOnlyLoadFrom(), teste mit GetType() auf die gesuchte Klasse und lade dann das Assembly mit Assembly.LoadFrom().

Damit funktioniert delayed load, vielen Dank für den guten Tipp 😃

Beste Grüße
MrDigi

25.03.2010 - 12:31 Uhr

Hallo,

ich habe hier ein .Net C#2.0 Programm.

Ich möchte dynamisch ein Assembly nachladen, dafür lade ich mit

Assembly a = Assembly.Load(...);

zuerst die dll, hole mir mit

Type t = a.GetType("StartClass", ...);

oder mit

Type[] ts = a.GetTypes();
// nun StartClass suchen

die StartClass und führe dies dann aus. Alles soweit kein Problem.

Jetzt möchte ich eine DLL (nennen wir sie dll1) laden welche eine Referenz auf eine 2. DLL hat (dll2). Der Code von dll2 wird aber vorerst im Code von dll1 nicht benutzt.

Nehmen wir jetzt mal an dll2 ist nicht vorhanden (warum auch immer).

Wenn ich die dll1 statisch und nicht dynamisch lade gibt es keine Probleme da hier gar nicht versucht wird dll2 nachzuladen (delayed load).
Wenn ich dll1 aber über die o.g. dynamischen Methoden nachlade dann funktioniert delayed load irgendwie nicht mehr:

  • Bei GetTypes() gibt es eine ReflectionTypeLoadException welche mir erzählt dass mindestens 1 Assembly nicht nachgeladen werden kann (dll2).
  • Bei GetType() meckert er mit einer TypeLoadException, dass irgendwelche Methoden der StartClass keine Implementierung hätten.

Mache ich etwas falsch oder funktioniert delayed load beim dynamischen Nachladen nicht ?

Beste Grüße
MrDigi

09.08.2007 - 10:21 Uhr

Das war ja meine Frage, gibt es eine Möglichkeit dass das DataGridView selbst die Zuordnung zwischen Eintrag und DefaultCellStyle behält ?

Nun die Frage:
Wie kann ich das Problem pragmatisch lösen ohne durch das ganze DataGridView durchzugehen und den Cellstyle jeder Zeile manuell umzubiegen ? verwirrt

Ist das manuelle Zuordnen zwischen DefaultCellStyle und sortierten Zeilen also die einzige Möglichkeit ?

09.08.2007 - 00:42 Uhr

Hallo Forum,

ich habe ein Problem bei dem ich gerade nicht so recht weiter weiß:

Ausgangslage:

  • Ich habe ein DataGridView welches seine Daten aus einer BindingList<> bekommt.
  • Je nach Daten in einer Zeile werden die Zeilen durch den DefaultCellStyle unterschiedlich eingefärbt.

Wenn ich also nun eine neue Zeile einfüge, dann mache ich folgendes:
myBindingList.Add(newEntry);
myDataGridView.Rows[myDataGridView.RowCount - 1].DefaultCellStyle=cellStyleXYZ;

Das klappt auch supi, alle Elemente werden "unten" im Datagridview hinzugefügt und angezeigt.

Problem:
Jetzt möchte ich aber die Elemente nicht "unten" ans DataGridView anfügen sondern oben, in der 1. Zeile.
Wenn ich dies mache:

(myBindingList.Insert(0,newEntry)

dann ist jetzt zwar der Eintrag vorhanden, die Zuordnung zwischen DefaultCellStyle und den jeweiligen bereits vorhandenen Zeilen ist nun aber verschoben.
Der Listen-Eintrag mit Index x ist ja nun Eintrag mit Index x+1, hat aber den DefaultCellStyle von dem ursprünglichen x+1 geerbt... 🤔

Nun die Frage:
Wie kann ich das Problem pragmatisch lösen ohne durch das ganze DataGridView durchzugehen und den Cellstyle jeder Zeile manuell umzubiegen ? ?(

Später soll die Liste auch sortiert werden können, hier kommt das Problem dann nochmal auf.

Beste Grüße
MrDigi 8)