Laden...

Forenbeiträge von jreusch Ingesamt 296 Beiträge

13.05.2011 - 12:22 Uhr

Hallo nochmal,

ich bin nun mit dem ANTS Memory Profiler an die Anwendung gegangen und konnte die Referenz finden.

Das Formular wird nun sauber weggeräumt, aber ich hab immer noch das gleiche Problem:

Das ActiveX-Control bleibt im Speicher. Ein Screenshot ist angehangen.

Also der AxHost hält noch eine Referenz aufs Objekt und gibt die nicht frei.
Muss ich da noch irgendwas anweisen?
Oder komme ich an die Instanz, bzw. an dieses host-field dran ums selbst rauszunehmen?

Grüße

13.05.2011 - 11:05 Uhr

Hallo trib,

Eine Event in das Interface zu integrieren ist ja an sich kein Problem, jedoch zwingt das den User nicht ausreichend dies auch im Falle eines Fehler zu nutzen.

Das kannst du auf technischem Weg nicht lösen, weil du nicht einmal entscheiden kannst wann es sich um einen Fehler handelt. Das entscheidet der Programmierer, der dein Interface implementiert.
Unbehandelte Ausnahmen kannst du per Event abfangen.

Weiterhin möchte ich gerne die MessageBox.Show-Funktionen nachbilden, also z.B:

MessageBox.Show("Fehler");  
MessageBox.Show("Fehler","Überschrift");  
MessageBox.Show("Fehler","Überschrift",MessageBox.Buttons.OK,...);  

Das kann ich ja schwer mit einem Event nachbilden...

Du abbonierst das Event, dass einen Fehlerzustand berichtet und zeigst in der behandelnden Methode auf der Präsentationsschicht deine Nachricht an. Hört sich für mich aber auch wieder eher so an, als würdest du ein eigenes ExceptionHandling-System entwerfen. Warum?

Du könntest vll noch etwas genauer werden was du vor hast, dann kann dir auch spezieller geholfen werden.

Grüße

11.05.2011 - 13:18 Uhr

Ich würde erst mal die Datenfelder gescheit casten. Zum Beispiel (string)dtHaldEint.Rows[nHaldenIdx]["Bezeichnung"] statt dtHaldEint.Rows[nHaldenIdx]["Bezeichnung"].ToString()
und vor allem (int)dtHaldEint.Rows[nHaldenIdx]["Von"] statt Convert.ToInt32(dtHaldEint.Rows[nHaldenIdx]["Von"])

Controls sollte man generell gar nicht zur Datenhaltung verwenden.

11.05.2011 - 12:28 Uhr

Hallo zusammen,

ich habe zurzeit eine Solution übernommen, die aus rund 100 Projekten und mehreren Zehntausend Zeilen Code besteht.

Im großen und ganzen ist das Teil recht ordentlich geschrieben, aber es gibt in einigen Situationen noch Probleme und ich bin nach und nach am fixen und auf andere Designkonzepte am umstellen.

Gestern ist mir zufällig aufgefallen, dass beim wiederholten öffnen eines Formulars im Programm der genutzte Speicher im Taskmanager immer um ca. 10MB anwächst (das Formular stellt eine ActiveX-MapAndGuide Karte mit Caching etc. bereit).

Daraus schließe ich, dass noch irgendwo eine Referenz aufs Formular besteht und der GC das Teil nicht wegschaffen kann.

Jetzt die große Frage:

Wie findet man diesen Verweis am besten, wenn man sich nur wenig im Projektcode auskennt?

Ich hab mir mal die Demoversion von JetBrains Memory Profiler runtergeladen und damit versucht, das Problem zu finden. Damit komme ich aber nicht so wirklich klar.

Habt ihr vielleicht ein paar Tipps parat, wie ich das lösen kann?

Vielen Dank und beste Grüße

10.05.2011 - 13:33 Uhr

Hallo inflames2k,

hab da zufällig was gefunden, weil ich mich derzeit mit Designerprogrammierung beschäftige.

Da hat schonmal jemand was gemacht:

Custom ContainerControl

Grüße

10.05.2011 - 12:18 Uhr

Hallo GstaGsta,

das ist logisch - genau das ist die Funktionsweise von TableLayoutPanel.
Du kannst keine absolute Location für dein Control setzen, sondern nur ein "Ausrichtungsverhalten".

Du musst das Control also in jedem Fall daraus holen wenn du es verschieben willst.

10.05.2011 - 11:09 Uhr

Hallo Thoxx,

das Problem hatte ich auch schon während eines Studienprojektes im letzten Semester.

Du könntest gegen DateTime? binden und den BindingConverter entsprechend anpassen, dass eben kein "unsinniges Datum" angezeigt wird, wenn auch noch keins ausgewählt wurde.

Den Rest dann per Workaround... hachja wie schön.

Grüße

10.05.2011 - 10:59 Uhr

Hallo GstaGsta,

GroupBox oder Panel, was denn nun?
Der Name ist da ziemlich zweideutig 😃

Ja habs getestet, auch im Container machts kein Problem.
Hänge dir das Projekt kurz an dann kannst du schauen worans bei dir hängt.

Grüße

10.05.2011 - 10:48 Uhr

Hallo MarC611,

also folgendes funktionier bei mir auf einem leerem Form mit FlowLayoutPanel drauf:


        public Form1()
        {
            InitializeComponent();

            for(int i=0; i<10; i++)
            {
                Label lb = new Label();
                lb.Text = i.ToString();
                flowLayoutPanel1.Controls.Add(lb);
            }
        }

Unterdrückst du irgendwelche Exceptions die du nicht mitbekommst?
Haben die Controls eventuell schon einen Parent?

Was hat es mit dieser geheimnisvollen "Funktion zur Anzeige" auf sich?
Bisschen mehr Code wäre hilfreich 😃

Grüße

10.05.2011 - 10:42 Uhr

Hallo GstaGsta,


namespace Program
{
    public partial class FormMain : Form
    {
        /// <summary>
        /// Holds the coordinate
        /// </summary>
        Point _position = new Point();

        private void groupPanelEinstellungen_MouseDown(object sender, MouseEventArgs e)
        {
            // kannst du löschen
        }

        private void groupPanelEinstellungen_MouseUp(object sender, MouseEventArgs e)
        {
            // kannst du löschen
        }

        private void groupPanelEinstellungen_MouseMove(object sender, MouseEventArgs e)
        {
            Panel p = sender as Panel;

            if (e.Button == MouseButtons.Left)
            {
                Point mousePos = this.PointToClient(Control.MousePosition);
                if (_position.IsEmpty)
                    _position = new Point(mousePos.X - p.Left, mousePos.Y - p.Top);

                p.Location = new Point(mousePos.X - _position.X, mousePos.Y - _position.Y);
            }
            else if (!_position.IsEmpty)
                _position = new Point();
        }
    }
}

Viel Spaß

10.05.2011 - 10:19 Uhr

Hallo GstaGsta,

warum teilst du die Koordinaten in der MouseMove behandlung jeweils nochmal durch eine Konstante 12?

09.05.2011 - 11:01 Uhr

Hallo Campy,

ich finde die Dokumentation Task-Klasse ist ziemlich eindeutig.

Thread.Sleep() friert natürlich nur den Thread ein, der die Methode aufruft.

Da jeder Task seinen eigenen Thread bekommt, friert auch nur dieser ein.
Eine Ausnahme könnte noch die Taks.RunSynchronously-Methode bieten.

05.05.2011 - 11:32 Uhr

Hallo mohnstrudel,

dazu hat dir TheGear auch schon den eleganteren Lösungsvorschlag gegeben:

Zur zweiten Frage:
beschäftige dich mit Anchor und Dock verhalten.

Hinzuzufügen ist noch, dass du für das proportionale Verhalten noch ein TableLayoutPanel benötigst, dass die wiederrum mit Anchor oder Dock an dessen Container verankerst.

28.04.2011 - 16:46 Uhr

Hallo AtzeX,

in dem Fall würde ich DoSomethingWithFile(...) direkt aus Bar(...) aufrufen.

Ansonsten einfach die Methode überladen, so wie es sich gerade anbietet.
Das erhöht die Wiederverwendbarkeit deines Codes.

Grüße

28.04.2011 - 16:23 Uhr

Hallo baensch,

ich verweise dich mal auf einen Thread von mir, wo ich kürzlich genau das selbe Problem hatte:

[erledigt] 2 DLLs in verschiedenen Versionen einbinden

Falls für dich Reflections in Frage kommen, ist das wohl die bessere Lösung.

20.04.2011 - 13:27 Uhr

Das ist aber doch eher eine Anwendungsspezifische Sache und nicht für in die Datenbank?

Was machst du wenn zwei Personen gleichzeitig die Einstellungen manipulieren?

20.04.2011 - 11:18 Uhr

Handelt es sich um so eine "besondere" Art der Sortierung, dass du es dir nicht erlauben kannst, diese live zu berechnen, wenn du sie benötigst?

Bedenke, dass du deine Sortierung bei jedem hinzufügen/löschen von Datensätzen sonst wieder inordnung bringen musst.

19.04.2011 - 12:40 Uhr

Ich weiß nicht inwieweit das noch mit dem DoubleBuffer-Mechanismus von Controls zusammenhängt, aber:

Ohne double-buffering funktioniert es (ohne das ParentControl selber zu zeichnen) halbwegs, allerdings zeichnen sich die darunter liegenden Controls gerne mal durch das Panel durch.

liegt denk ich am z-Index, also an der Reihenfolge wie du die Controls aufs Form legst.
Mit Panel.BringToFront() holst du das Control im z-Index nach vorne.

Grüße

14.04.2011 - 16:28 Uhr

Math.Pow(2,Screen.PrimaryScreen.BitsPerPixel);

Grüße

07.04.2011 - 13:52 Uhr

Schick, schick...!
Ist auch geplant, den Quellcode zu veröffentlichen?

Nutz doch Jade.NET um Jade.NET zu decompilieren 😃

06.04.2011 - 15:11 Uhr

Um das ganze Thema mal zum Ende zu bringen:

Ich gehe nun her und erzwinge, nachdem eine andere Version ausgewählt wurde, einen Neustart der Anwendung.
Beim Neustart tausche ich die Dlls im Dateisystem aus.

Keine schöne Lösung, aber alles andere wäre zuviel Arbeit für das was ich damit vor habe. Ich hoffe meine Kollegen verstehen nachher noch was ich dort angestellt habe...

Wer noch einen eleganten Lösungsvorschlag hat kann sich gerne bei mir melden 😃

Grüße

06.04.2011 - 10:53 Uhr

Die Datei selber kannst du ja theoretisch umbenennen, wie du willst.
Bist du dir da sicher? Meiner Erfahrung nach geht das nicht so einfach - der Dateiname sollte schon mit dem eigentlichen Assembly-Namen übereinstimmen.

Umbenennen kann ich sie. Das bringt mir aber nichts, weil die Identität der Datei gleich bleibt und unter dem Namen der Identität sucht er nachher nach der Dll.

Ich schau mir mal den Thread von herbivore an.
Edit:

Das hilft mir leider auch nicht weiter, weil genau das gleiche Problem habe wie dort der Threadersteller.
Ich nutze mehrere Klassen aus insgesammt 4 Assemblies, teilweise auch mit vererbung (geht das überhaupt über Reflections?).

Das alles über Reflections "nachzubauen" lohnt sich einfach nicht, deshalb würde ich gerne beide Parallel einbinden.

Am liebsten wärs mir wenn ich irgendwie das Assemblymanifest bearbeiten und die Identität ändern könnte und einfach mit 8, von einander unabhängigen dlls, arbeiten könnte.

Geht das irgendwie?

05.04.2011 - 18:24 Uhr

Doch, wann das Event auslöst habe ich schon verstanden.
Nur wie lade ich dann eine Assembly zur Laufzeit?

05.04.2011 - 14:55 Uhr

Ja, nur wie lade ich die Assembly zur Laufzeit?
Ich weiß dass ich per Reflection einzelne Funktionen anspringen oder auch Klassen instanziieren kann.

Ich würde den Code aber nun gerne so lassen wie er ist und nur die Assembly in den Speicher laden, dahin wo sie hingehört.

Geht das irgendwie?

05.04.2011 - 14:20 Uhr

Meine Solution besteht aus rund 100 Projekten. Aber er lädt wohl nur die App.Config des Startprojekts (das andere sind Klassenbibliotheken).

Wenn ich dort jetzt auf die Unterordner verweise hab ich natürlich intern wieder das gleiche Namensproblem...

Ich werd noch irre... entweder hab ich ein erhebliches Verständnisproblem, oder die Sache ist wirklich verzwickt.

05.04.2011 - 13:32 Uhr

Wenn es sich beim Assembly-Ordner um ein Unterverzeichnis des Programmverzeichnisses handelt, sollte dir vll auch das
>
weiterhelfen (
>
).

Kann ich das auch für einzelne Projekte meiner Solution einzeln definieren?

Projekt1 soll in /projekt1/ nach den Verweisen suchen
Projekt2 soll in /projekt2/ nach den Verweisen suchen

Oder klappt das sowieso alles nicht wie ich mir das hier vorstell, weil nach dem Laden alle in einem Verzeichnisdienst landen, der wieder über die Identität auf die Libs zugreift?

05.04.2011 - 13:03 Uhr

Damit hab ichs auch schon versucht, aber das Problem ist ja nicht dass nicht eindeutig zwischen Version1 und Version2 unterschieden werden kann.

Also nicht der Namenskonflikt im Code ist das Problem, sondern im Dateisystem.

Jetzt habe ich noch eine Idee:
Kann ich meinem Projekt (ich tippe mittels App.Config) einen Pfad hinzufügen, in denen er nach den Dlls sucht?
Dann könnte ich ja die zwei verschiedenen Versionen in zwei verschiedene Ordner legen und eben die einzelnen Projekte dort suchen lassen.

05.04.2011 - 12:15 Uhr

Noch einmal ein Update der letzten zwei Stunden:

Ich bin nun mal mit einem Dissassembler an die Dlls gegangen und konnte dort durch Suchen/Ersetzen die Identität des Moduls ändern.

Jedoch habe ich mit anscheinend dort eine Prüfsumme zerschossen.
Kennt sich jemand mit der IL Assembly Language genauer aus und kann mir sagen, wo ich dort hinfassen muss um die Identität zu ändern?

05.04.2011 - 10:16 Uhr

Guten morgen nocheinmal,

ich musste das Problem erstmal etwas nach hinten verschieben, weil ich noch dringend was anderes zutun hatte und konnte mich erst gestern Abend noch eine Stunde damit befassen.

Inzwischen kann ich auch mehr Informationen rausgeben:

Es handelt sich um 4 ActiveX-Dlls. Dazu erstellt Visual Studio ja beim Verweis Wrapper und verweist auf diese. Alle 4 Dlls liegen nun in verschiedenen Versionen vor.

Die Idee von der-schlingel kommt nicht in Frage, weil ich nicht an den Quellcode komme, um ein Gemeinsames Interface zu implementieren.

Die Idee von Scavanger kommt nicht in Frage, weil ich damit nur auf Funktionen zugreifen kann - bitte korrigieren, wenn ich mich irre.

Ich habe es also nun so gemacht, dass ich zwei verschiedene Projekte in meiner Solution aufgemacht habe und nun auf die jeweils verschiedenen Versionen der dlls verweise.

Projekt1

Verweist auf:
Av1.dll (Identität: A.dll)
Bv1.dll (Identität: B.dll)
Cv1.dll (Identität: C.dll)
Dv1.dll (Identität: D.dll)

Klassen:
Komp1 : KompBase

Projekt2

Verweist auf:
Av2.dll (Identität: A.dll)
Bv2.dll (Identität: B.dll)
Cv2.dll (Identität: C.dll)
Dv2.dll (Identität: D.dll)

Klassen:
Komp2 : KompBase

Die ganze Anwendung ist nun nur noch gegen die gemeinsame Basisklasse KompBase programmiert.

Nun, nach dem Kompilieren kopiert er die Dlls wie gewünscht ins Verzeichnis des Exe-Projektes, jedoch mit den Namen "A.dll, B.dll, C.dll, D.dll" (ich vermute das liegt an der Identität?) und überschreibt die, die dort eben als erstes reinkopiert wurden.

Ich bin mit meinem Latein echt bald am Ende... habt ihr noch eine Idee?
Ich hoffe ich hab mich überhaupt verständlich genug ausgedrückt.

Viele Grüße!

29.03.2011 - 15:31 Uhr

Interesannter Artikel.
Leider handelt es sich um native DLLs und OCX-Wrapper.

Eine Idee die ich bereits hatte:

Zwei Projekte in der Solution aufmachen und jeweils auf die verschiedenen DLLs referenzieren. Dann muss ich aber auch den Code, der mit den DLLs umgeht in beiden Projekten halten und damit ist die Wartbarkeit wieder futsch...

29.03.2011 - 14:14 Uhr

Hallo liebe CSharp-Gemeinde,

ich arbeite zzt. an einem Projekt das Komponenten von Drittherstellern verwendet. Die Komponente liegt nun in mehreren Versionen vor und ich möchte gerne beide unterstützen.

Es gibt also 2 DLLs:

Komp.dll (in Version 1.0)
Komp.dll (in Version 2.0)

Beide haben die gleichen Schnittstellen, etc.
Nur eben die Implementierung hat sich geändert.

Im Programm würde ich gerne zur Laufzeit zwischen beiden hin- und herwechseln können:

z.B.


IKomp o;

switch(kompType)
{
    case v1: o = new Komp_v1(); break;
    case v2: o = new Komp_v2(); break;
}

Wie krieg ich das sauber im Projekt eingerichtet?
Ich kann ja nicht 2x die gleiche Dll einbinden...

Hat jemand eine Idee?

Viele Grüße!

07.12.2010 - 02:01 Uhr

Hallo nochmal,

es lag tatsächtlich daran, dass einige Styles und Templates unnötig mehrfach gesetzt wurden.
Jetzt konnte ich die Ladezeit auf ein Zehntel reduzieren - damit kann ich leben.

Vielen Dank!

Grüße

06.12.2010 - 21:08 Uhr

Hallo myUnderTakeR,

lasst mal einen Profiler mitlaufen.
Dann solltet ihr relativ gut sehen, was tatsächlich lange dauert.

Was macht ihr den in den Konstruktoren der Usercontrols?

Das haben wir ja schon gemacht - deswegen weiß ich ja dass es an den Usercontrols liegt.

Die Konstruktoren machen selbst nicht viel...
InitializeComponents() kostet halt immer 200-300ms.

Also müssen die Dinger wohl doch besser gestaltet werden.
Styles und Templates liegen tatsächlich viele drauf - wir versuchen mal da etwas runterzufahren.

@reloop:
So OT find ich das ganze nicht mal. So ein guter Artikel würde mir bei meinem Problem bestimmt auch helfen.

06.12.2010 - 20:10 Uhr

Hallo liebe myCSharp'ler,

ich bin was Silverlightprogrammierung angeht ein Neueinsteiger und habe die letzten 3 Monate mit 3 Kommiltonen an einem etwas größeren Studienprojekt gearbeitet.

Einarbeitung, Implementierung, etc. gingen ganz gut von der Hand.
Jetzt geht es noch um Codeoptimierungen und da haben wir teilweise sehr hohe Ladezeiten.

Nach etwas Recherche im Code habe ich rausbekommen, dass das Erstellen von Usercontrols teilweise ewig dauert...

Wir haben unser Projekt nach alter OO-Manier ziemlich modular aufgebaut - also relativ atomare UC-Bausteine erstellt, die wir einfach in vielen Masken nutzen.

Ist ja alles schön und gut... aber wenn meine Page nun 10sek Lädt, nur weil 30-40 (keineswegs komplexe) Usercontrols erstellt werden, ist das schon schade.

Gibt es da einen guten Weg das schnell zu bekommen?

Viele Grüße

30.11.2010 - 10:43 Uhr

Hallo nochmal,

habe jetzt die Woche Zeit gehabt um mich weiter mit der Tastaturkomponente beschäftigt.
Das klappt jetzt alles soweit super, danke!

Ein Problem habe ich noch:

Wenn ich ein ChildWindow öffne blendet er natürlich alles was darunter liegt aus.
Gibts eine Möglichkeit das UserControl trotzdem in den Vordergrund zu bekommen?

Viele Grüße

18.11.2010 - 15:06 Uhr

Vielen dank für die vielen Antworten und Lösungsansätze.
Nach dem Code von dem Codeplex Projekt habe ich nicht explizit nachgefragt - das könnte man noch versuchen.

Nur wenn die Textbox den Focus verliert und keiner deiner Eingabebuttons den Focus bekommt, dann fährst du sie wieder ein.
Lg XXX

Das sollte funktionieren!
Ich hatte keine Idee um zu fragen, warum jetzt der Focus vom Textfeld abgegeben wurde. Auf die Idee die Liste der Keyboardtasten zu durchlaufen bin ich nicht gekommen.
Danke!

Ich halte euch auf dem Laufenden, wenns was neues gibt.

Viele Grüße

18.11.2010 - 11:15 Uhr

Und warum schaust Du dann nicht, wie das dort gelöst wurde?

Weil die den Source leider nicht rausgeben.

Noch eine neue Idee:
Ich leg über mein ganzen Control noch ein unsichtbares Canvas drüber, sodass nichts mehr klickbar ist ausser das Canvas.

Wenn nun auf Canvas geklickt wird errechne ich mir über die Mauskoordinaten den Button, bzw. den Buchstaben über dem die Maus gerade schwebt und gebe den ans Textfeld weiter.

Sollte das funktionieren?

18.11.2010 - 09:42 Uhr

Hallo talla,

danke für den Tip - das wäre eine Möglichkeit.
Aber es geht anscheinend ja doch irgendwie... im Link aus meinem ersten Post ist ja eine Tastatur, die genau das zulässt - Eingaben ins Textfeld über Bildschirmtastatur und Hardwaretastatur gleichzeitig.

Eventuell machen die es aber auch so wie ich bisher, dass sie den Focus nach einem Buttonclick wieder aufs Textfeld geben.

Aber wie könnte ich das dann mit dem Ein- und Ausblenden geschickt lösen? Also das die Tastatur einblendet, wenn das Textfeld aktiv ist und verschwindet wenn es verlassen wird.

Viele Grüße

16.11.2010 - 11:39 Uhr

Damit der Cursor drinnen steht und der Benutzer sieht wo er gerade schreibt

15.11.2010 - 01:35 Uhr

Guten Abend liebe myCSharp-Gemeinde,

ich benötige zurzeit für meine Silverlight-Anwendung eine Bildschirmtastatur und orientiere mich bei der Realisierung an dieser Umsetzung.

Ein Problem habe ich noch und das stört mich gewaltig...

Meine Tastatur soll auffahren, wenn eine Textbox den Focus bekommt und verschwinden, wenn der Focus diese verlässt.

Wenn ich aber nun auf der Tastatur einen der Buttons klicke, bekommt natürlich der Button den Focus.
Dafür habe ich erstmal einen kleinen Workaround geschrieben, der den Focus sofort wieder an die TextBox gibt und den Tastaturcursor an die richtige Stelle setzt.

Das gefällt mir aber gar nicht und mein ein und ausblenden der Tastatur funktioniert auf diese Weise natürlich auch nicht.

Gibts eine Möglichkeit den Focus auf der Textbox aufrecht zu erhalten obwohl ein Button geklickt wurde?
Oder verfolge ich hier einen komplett falschen Ansatz und ihr würdet das anders angehen?

Danke für Eure Hilfe.

Grüße

05.12.2009 - 00:17 Uhr

verwendetes Datenbanksystem: Access

Hallo liebe myCSharpler,

ich würde gerne einen DateTimePicker an eine Datumsspalte meiner Tabelle binden.
Die Spalte lässt aber null zu.

Wenn also kein Datum eingetragen ist, bekomm ich immer das aktuelle Datum.

Mir ist bekannt das Datetime ein struct ist.
Der DateTimePicker arbeitet denke ich auch über dieses struct, was ja nicht null sein kann - daher nimmt er wohl das aktuelle Datum.

Nur geht es nun darum Datensätze zu editieren...
Und es ist nicht wünschenswert, dass wenn ich einen Datensatz editier, dieser womöglich nachher das heutige Datum als Wert hat, wenn er vorher null war.

Habt ihr da vll eine Idee, wie man sowas ambesten umsetzten könnte?

Also das wenn ein Datum vorhanden ist, dieses editierbar bleibt

und

wenn kein Datum vorhanden ist, es die Möglichkeit gibt nach Wunsch dennoch ein Datum anzugeben und dieses dann auch übernommen wird.

Falls aber kein Datum angegeben wird soll auch nach wie vor null in der db stehen.

Beim schreiben dieses Beitrags habe ich mir noch was eingefallen, was evtl ein Problem sein könnte.

Ich lasse mir vom VS ein DataSet mit streng typisierten DataTables erstellen.

Tja... so ein DataSet wird wohl auch das Datetime struct nutzen oder?

Kann ich dann überhaupt, wie gewohnt, per TableAdapter.Update() in die DB zurückschreiben ohne den null-wert zu überschreiben?!

Ohje.. ich steh grade echt aufm Schlauch.

Vielen Dank schonmal
Grüße

01.12.2009 - 13:33 Uhr

Also okay, erstmal vielen Dank.
So gehts jetzt.


            proxysTableAdapter.Fill(proxysDataSet.Proxys);

            foreach (var p in proxysDataSet.Proxys)
                p.inUse = false;

            SqlCeCommandBuilder dbcb = new SqlCeCommandBuilder();
            dbcb.DataAdapter = proxysTableAdapter.Adapter;
            
            proxysTableAdapter.Update(proxysDataSet.Proxys);

Nur verstehe ich nicht warum?

Ich rufe nach wie vor das Update direkt auf dem TableAdapter auf, an dem ich ja eigentilch nichts verändert habe.

Die einzige Erkläung wäre, dass der Setter von SqlCeCommandBuilder.DataAdapter noch etwas am TableAdapter manipuliert?

Ist das richtig?
Wenn ja was?

Gruß

01.12.2009 - 12:17 Uhr

verwendetes Datenbanksystem: SQL Compact

Hallo zusammen,

ich habe ein Problem beim Abgleich mit meiner DB.

Hier ein kleiner Beispielcodeauschnitt, der denk ich selbsterklärend ist:


            proxysTableAdapter.Fill(proxysDataSet.Proxys);

            foreach (var p in proxysDataSet.Proxys)
                p.inUse = false;
                       
            proxysTableAdapter.Update(proxysDataSet.Proxys);

Ich möchte die Spalte 'inUse' für alle Datensätze auf false setzen.
Beim Aufruf von proxysTableAdapter.Update() bekomme ich eine 'InvalidOperationException' geworfen mit dem Text:


Aktualisieren erfordert einen gültigen UpdateCommand, wenn eine DataRow-Auflistung mit modifizierten Zeilen weitergegeben wird.

Wo liegt das Problem?
Die Tabelle hat einen Primärschlüssel.

Viele Grüße

23.11.2009 - 11:21 Uhr

Morgen zusammen,

ich habe mehrere Forms, die Teilweise auf die gleichen Tabellen eine Datenbank zugreifen.

Jetzt habe ich es bisher so gemacht, dass ich über den Designer meine Controls einfach gebunden habe.
Dieser erstellt jedoch in jedem Form einen neuen TableAdapter.

Macht es Sinn die TableAdapter 'global' in eine statische Klasse auszulagern und dann für jede Tabelle die im Projekt genutzt wird nur einen Adapter zu erstellen?

Viele Grüße

11.11.2009 - 21:50 Uhr

TableLayoutPanel heißt das Teil.
Ich werde mich in die Ecke stellen und schämen 😉

Sowas hab ich gesucht. Danke!

11.11.2009 - 21:35 Uhr

Hallo Steini_666,
was für ein Framework benutzt du?

ArrayList solltest du vermeiden und lieber die Generischen Listen aus 'System.Collections.Generic' verwenden, falls möglich.

Ausserdem wär eine explizite Typisierung deiner Variablen auch nicht verkehrt, das macht alles wesentlich leserlicher.

Zurück zum Problem:

Ob er rausspringt nachdem du die List gefüllt hast, kannst du durch Debuggen mit Einzelschritt herausfinden.

Da du auf Typenangabe verzichtet hast, kann ich mir nicht zusammenreinem was dir network.FtpReadOnlineFile für Objekte zurückgibt.
Evtl überschreiben dieses ToString() so, dass eben nichts zurückgegeben wird?

11.11.2009 - 21:15 Uhr

Hallo C#-Volk,
kurz und knackig:

Kann ich Invisible Controls mit ins FlowLayout einbeziehen?

Angenommen ich habe

| VISIBLE | INVISIBLE | VISIBLE|

stellt ers mir so dar:

| VISIBLE | VISIBLE |

Ich möchte es aber gerne wie oben haben.

Viele Grüße

10.11.2009 - 10:51 Uhr

Erstmal vielen Dank für eure Ideen und Ratschläge - habs hinbekommen wie ichs mir vorgestellt habe.

@Xynratron
Das Konzept ist viel einfacher, weil ich nicht auf solch 'komplexe' Ereignisse eingehen muss. Trotzdem danke 😉

09.11.2009 - 21:11 Uhr

Hey,
danke für die schnelle Antwort 😃

Und wo ist das Problem? Wenn du nicht gerade zehntausende Events oder noch deutlich mehr verwalten musst, gehst du in einfachsten Fall einer Schleife durch die Liste und schaust, ob AkuelleZeit zwischen Startzeit und Endzeit liegt.

Das Problem ist, das an jedem Wochentag immer die gleichen Events stattfinden.

Also Montag:
15:45 - 17:00 Event A
19:00 - 22:00 Event B

Dienstag:
15:25 - 16:00 Event C
17:00 - 23:00 Event D

Ich würde also gerne einmal die Einträge für eine Woche machen und dann solls reichen.

Wenn ich aber das Event über DateTimes speichere:

09.11.2009 21:00 - 09.11.2009 22:00: Suche Hilfe im myCSharp-Forum

und nun Frage ob

16.11.2009 21:30 zwischen Start und Endzeit liegt wird mir das Programm zu recht ein false zurückliefern, es sollte aber true sein, da die Events an jedem Wochentag gleich sind.

Oder soll ich hergehen und dann
-stunde
-minute
-sekunde
-ms
-...
alles auf < bzw > überprüfen?!

Edit:

Wenn ich es mir recht überlege ist es sogar noch trivialer:
Jedes Event findet an jedem Tag statt!
Also muss meine "zwischen start und endzeit" methode sich nur auf uhrzeiten beziehen.

Geht das nur wie oben vorgeschlagen oder auch besser? 😉

09.11.2009 - 20:44 Uhr

Hallo C#'ler,
ich bräuchte mal wieder einen Denkanstoß... stehe ziemlich auf dem Schlauch.

Also ich habe verschiedene Events (keine C# Events 😃) zu einer bestimmten Uhrzeit und über eine bestimmte Dauer.

Bspw.

15:45 - 17:00 Event A
19:00 - 22:00 Event B

(Angenommen an jedem Wochentag)

Die erste Frage ist wie ich das ambesten speichere.

  • 15:45 als Datetime + 1:15 als Timespan + Event?
  • 2x Timespan + Event?

Oder nochmal anders?

Das wichtige ist, dass ich nachher per Datetime ermitteln kann welches Event denn zzt. aktiv ist.

GetEvent(new Datetime(2009,11,09,16,00,00));

Sollte mir dann Event A zurückliefern.

Hoffe ihr habts irgendwie verstanden 😃
Viele Grüße