Laden...
Avatar #avatar-2329.gif
xxxprod myCSharp.de - Experte
Programmierer Österreich\Wien Dabei seit 13.04.2006 1.378 Beiträge
Benutzerbeschreibung

Forenbeiträge von xxxprod Ingesamt 1.378 Beiträge

20.03.2013 - 14:20 Uhr

Hallo buyden,

hast du schon die PIVOT and UNPIVOT Funktion gesehen? Evt. kommst du damit etwas eleganter ans Ziel.

Lg, XXX

21.02.2013 - 12:11 Uhr

Was ich nicht verstehe ist, für was du über alle Rows iterierst, wenn du im Endeffekt die Row selber nie benutzt bzw. manipulierst. Du bekommst aus deiner Methode clsCom.dvReadValue(dvDataGrid); eine neue DataView und weißt diese zu. Das sollte doch mit einem einfachen Statement ausreichen oder?


DataView dvDataGrid1;

private void button1_Click(object sender, EventArgs e)
{
        dvDataGrid1 = clsCom.dvReadValue(dvDataGrid);
        dataGridView1.DataSource = dvDataGrid1;
}

Lg, XXX

21.02.2013 - 11:55 Uhr

Hallo MeisterM,

an ein DoppelClick Event kann man nicht so ohne weiteres einen Command hängen. Dazu gibt es aber einige Hilfsmittel im Netz wie zB AttachedCommandBehaviour. Zu dem kommt, dass du dich natürlich an das Doppelclick Event deines ListViewItems hängen musst und nicht an die ListView selbst. Hierzu erstellst du in den ListView.Resources einen neuen Style mit TargetType ListViewItem in dem du dann den vorhin geposteten Link anwendest. Dies sollte dich dann ultimativ dorthin bringen wo du hin willst.

Lg, XXX

20.02.2013 - 10:24 Uhr

Nur mal so nebenbei möchte ich dich mal auf die Forenregeln verweisen, die unter anderem sagen, dass wir hier Grundkenntnisse und vor allem Eigeninitiative vorraussetzen. Es fühlt sich leider so an, als müsste ich dir alles vorkauen, weswegen vermutlich auch sonst niemand hier postet.

Zu deiner Frage: ADO.NET ist die .NET Schnittstelle mit der du auf deine Datenbank per SQL-Statements zugreifen kannst. Dies gesagt, kann ich dir noch für deine Zwecke die Klasse SqlBulkCopy empfehlen. Wie du aber damit deine Daten in die Datenbank bekommst schau dir bitte selber an. Es gibt unzählige Beispiele im Internet dazu und wie bereits erwähnt sind das Grundlagen die man sich selbst aneignen muss.

Lg, XXX

17.02.2013 - 22:43 Uhr

Hallo grarhakim,

kannst du die Daten aus deinem Excelsheet abrufen?

Bei der TSQL Variante ist zu beachten, dass der SQL-Server Zugriff auf die Excel Datei haben muss, nicht deine Applikation. Wenn dies nicht möglich ist, fällt diese Variante sowieso weg.

Falls du doch zum Beispiel einen Netzwerkshare oder irgendwie anders die Datei zum Server bringen kannst, dann würd ich bei der TSQL Variante bleiben.

Falls du also die Möglichkeit hast, die zu importierenden Excel Files dem Server zugänglich zu machen, dann probier ob du nur dieses Statement irgendwie zum Laufen bringst. Über Drop und Create Tables kann man sich noch immer Gedanken machen sobald du mal das wichtigste, nämlich den Zugriff aufs Excel gemeistert hast.

SELECT *
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','Excel ;Database=C:\test\xltest.xls', [Customers$]) 

Falls obiges nicht möglich ist, bleibt dir nur per OLEDB oder per Excel.Interop das Excel in deiner App in den Arbeitsspeicher zu laden und dort dann weiter per SqlCommands/SqlDataAdapter in die Datenbank einzufügen. Du findest sicherlich auch einiges im Forum dazu wenn du die Suche etwas bemühen würdest.

Hier noch ein paar Links die dir vielleicht weiterhelfen könnten:

Lg, XXX

17.02.2013 - 15:26 Uhr

Möglich ists auf jeden Fall - Glück braucht man halt auch ein wenig dazu.

Ich hatte ca. ein halbes Jahr Programmiererfahrung bevor ich als Referenzprojekt ein Sudokuspiel programmiert habe, dass meinen damaligen Chef gefallen hat wodurch ich auch gleich eine Anstellung bekommen habe. In dem Fall war das Glück auf meiner Seite denn den Code den ich anschließend fabriziert habe muss ich heute leider noch immer warten... 😛

Lg, XXX

17.02.2013 - 15:17 Uhr

Wobei genau hackts denn?

Evt. dass die Tabelle nach dem DROP nicht mehr angelegt wird? Das liegt wohl an deinem If-Else Konstrukt.

Dabei bezweifle ich ob dieses Create Statement überhaupt so funktionieren kann.

Wenn dir die vorigen Links nicht geholfen haben schiebe ich hier noch ein weiteres Schlagwort nach: OleDB Mittels OleDb kannst du auch auf ein Excel File zugreifen und dann die nötigen Informationen auslesen um deine Tabelle in der Datenbank zu erstellen.

Bitte setze dich auch mit den Themen ein wenig auseinander und versuch konkrete Fragen zu anfallenden Problemen zu stellen anstatt einfach nur den Code zu posten

Lg, XXX

15.02.2013 - 10:41 Uhr

In dem du im CarVM ein Event zur Verfügung stellst, welches du im MainVM abonnierst um beim Eintreten dessen ein anderes VM anzuzeigen.

Lg, XXX

14.02.2013 - 14:49 Uhr

Hallo qw21,

ich hab mich ein bisschen durchgelesen und hier 2 interessante Beiträge dazu gefunden:

Soweit ich das rausgelesen hab, wird eine Assembly in der Runtime ausgeführt, für die sie kompiliert worden ist (oder neuer) außer es ist durch supportedRuntime anders spezifiziert.

D.h. wenn du für .NET4.0 ausliefern willst ohne supportedRuntime zu setzen, muss die Applikation mit .NET4.0 als Zielframework kompiliert worden sein.

Lg, XXX

12.02.2013 - 17:10 Uhr

Klingt cool das Programm auch wenn ichs selber gerade nicht brauchen würde.

Was mir als Feature dazu einfällt wäre, sich in einer Liste zB die History der Dinge in der Zwischenablage zu merken um dann evt. nochmals darauf zugreifen zu können.

Bzw. das man eben mehrere Sachen zu den Clients schicken kann - im Bezug auf Passwörter oder Serials, gibts wohl häufig mehr als nur eines das zu kopieren wäre.

Lg, XXX

11.02.2013 - 16:23 Uhr

Die Male wo ich mit Bindings Probleme hatte, bin ich irgendwie durch ewiges debuggen und ausprobieren dann zu einer Lösung gekommen oder auch nicht. Allgemein kann ich leider nichts dazu sagen.

Lass dir mal alle Möglichen Events in der Console oder in ein LogFile ausgeben. Setter/Getter-Entry/Exit, MouseDown, MouseUp, CheckedChanged, PropertyChanged und schau ob dir dabei etwas auffällt.

Manchmal wird ein Getter nicht abgefragt, wenn er aus einem Setter aufgerufen wurde. - Dies passiert aber normalerweise nur wenn es sich ums selbe Property handelt.

Mittels dem logging solltest du aber konkret feststellen könne wie das Program sich genau verhält und dazu kann man dann vielleicht eine konkretere Aussage treffen.

Lg, XXX

//Edit: Evt. hilft ein BeginInvoke um A/B=false zu legen um diese Ausführung kurz Zeitverzögert auszuführen.

11.02.2013 - 15:16 Uhr

Die Bindings schauen an und für sich ok aus aber ich vermute den Hund irgendwo im Bindingsystem von Windows.Forms begraben. Ich hab schon so oft Schwierigkeiten damit gehabt weil das System einfach total unverständlich reagiert. Manchmal/Oft muss man ein BindingManager.EndEdit/Accept oder ein Binding.WriteValue() im Codebehind nachsetzen, damit die Werte auch wirklich greifen. Wirklich verstanden hab ichs nie und ich bin auch froh, dass dies bei WPF nun wesentlich besser läuft.

Lg, XXX

11.02.2013 - 14:42 Uhr

Genau was mein Link beschreibt - hast du ihn dir überhaupt angesehen?

11.02.2013 - 13:44 Uhr

Es gibt eine coole Möglichkeit unter TSQL alle eingefügten IDs automatisch am Ende des Inserts auszugeben worauf ich erst vor kurzem gestoßen bin:


create table test(Id uniqueidentifier primary key default(newid()), Name varchar(max))
go

insert test(Name)
output inserted.Id
select Name
from
(
	select 'Max' as Name
	union all
	select 'Moritz' as Name
	union all
	select 'Gretchen' as Name
	union all
	select 'Heidi' as Name
)tmp


10418F4B-58CA-44A8-A93E-7B2386E9CE8C
66D0AD18-34D9-49F2-9400-D8ED5C511216
15EA9071-107D-48FD-819C-E7299FE5158A
43CA4000-51D6-4E29-8AF5-25768C343BC6

Lg, XXX

11.02.2013 - 13:32 Uhr

Das geht direkt mittels TSQL auch - brauchst du denn eine C# Anwendung dafür?

Gewusst wie: Importieren von Daten aus Excel, SQL Server

Lg, XXX

11.02.2013 - 12:22 Uhr

Bei WPF kann man auch negative Margins setzen... das könnte hier zB funktionieren indem du den weißen Rand einfach unter den schwarzen Rand außen drunterschiebst. Aber ich befürchte das negative Margins bei Windows.Forms nicht möglich sind.

Als alternativen (schmutzigen) Workarround kannst du noch schwarze Panels über den weißen Rand legen.

Lg, XXX

11.02.2013 - 11:55 Uhr

TabControl wie jedes andere Control unter Windows.Forms erbt von System.Control was wiederum die Eigenschaft BackColor besitzt. (Ich vermute aber dennoch, dass dies den äußeren Rand hier nicht verändern wird)

Lg, XXX

11.02.2013 - 11:50 Uhr

Das deine Grafik einen grauen Rand hat, ist ausgeschlossen? Wenn du also kein Hintergrundbild in deinem Panel setzt, bleibt der graue Rand auch da? Ist evt. ein Margin auf deinem Panel eingestellt?

Das TableLayoutPanel sowie jedes andere LayoutControl zeichnet normalerweise nichts selbstständig rein und wenn der Hintergrund des TablLayoutPanels selbst schon Schwarz ist, dürfte kein grauer Rand da sein außer er wird vielleicht durch dein Panel oder dein Backgroundimage verursacht.

So zumindest meine Vermutung.

Lg, XXX

01.02.2013 - 17:15 Uhr

Google hätte dir mit "snoop wpf howto" sicherlich auch recht schnell auf die Sprünge geholfen:

http://blois.us/Snoop/

Youtube: Snoop Tips & Tricks

Lg, XXX

01.02.2013 - 15:33 Uhr

Hallo Cannon,

die Compact Variante bietet dir serverlosen Zugriff auf eine Datenbankdatei. Du kannst dir das auch wie ein Access-File vorstellen. Sowas macht vielleicht bei einem kleinen Kassaprogram in einem Blumenladen noch Sinn aber sobald mehr als dieser eine Computer inkl. Synchronisierung über mehrere Datenbanken im Spiel ist -> vergiss compact. ((aus meiner Sicht)

Das SyncFramework kenne ich nicht aber ein paar Tabellen von Server A nach Server B zu kopieren/synchen geht auch schnell und einfach indem die Server als LinkedServer einrichtet und entsprechende Insert, Update, Delete Statements dafür bastelt.

Lg, XXX

30.01.2013 - 16:23 Uhr

Wieso wird hier so lange herumphilosophiert, wenn eindeutig klar ist, dass die ListBox schlichtweg falsch verwendet wird. (Sieht man im 1. Post):

Weil:

  • In einer ListBox, dass ItemTemplate bereits einem ListBoxItem gehört. Man erzeugt prinzipiell nie eigene ListBoxItems - das macht die ListBox für dich und wendet darauf dann dein DataTemplate an. Daher macht auch das Setzen der IsSelected Property auf dein ListBoxItem keinen Sinn, weil es einfach das Falsche ist.

  • Um es richtig zu machen, musst du einen Style fürs ListBoxItem definieren und dort das Binding für IsSelected reinpacken.

Das ganze hättest du aber auch mit 5 min. Googlen auch gefunden.

<ListBox SelectionMode="Multiple" Width="150" MaxHeight="100" ItemsSource="{Binding Path=ListBoxValues}" IsSynchronizedWithCurrentItem="True">
  <ListBox.Resources>
    <Style TargetType="ListBoxItem">
      <Setter Property="IsSelected" Value="{Binding IsSelected}"/>
    </Style>
  </ListBox.Resources>

  <ListBox.ItemTemplate>
     <DataTemplate DataType="{x:Type ListBoxItem}">
        <TextBlock Text="{Binding Path=DisplayName}" />
      </DataTemplate>
   </ListBox.ItemTemplate>
</ListBox>

Lg, XXX

28.01.2013 - 10:56 Uhr

Hallo Robert,

in WPF verwendet man einfach kein MVC - probier es garnicht dort irgendwie rein zu zwängen. MVVM is the way to go:WPF-Anwendungen mit dem Model-View-ViewModel-Entwurfsmuster

Und hier noch ein paar Tipps zur Codegestaltung, Übersichtlichkeit und NoGo's?

Lg, XXX

24.01.2013 - 10:12 Uhr

Oder häng dich mit dem Visual Studio Debugger(notfalls Remotedebugger) ins Programm wenn es nicht mehr weiter tut und prüfe falls möglich den Zustand auf diese Weise.

Lg, XXX

//Edit: Übrigens könntest du dein Programm ja auch einfach als Konsolenanwendung oder gleich direkt im Debugger laufen lassen(falls VS am Zielrechner installiert ist) um es einfacher/anders zu testen.

15.01.2013 - 12:21 Uhr

@M-209:

Falls ich falsch liege bitte ich darum mich eines besseren zu belehren.
Ja, Du liegst falsch.
Gerade das ständige pollen ist deutlich resourcefressender als diese kleine Queue, bei der der Sql Server selber entscheiden kann wann er dich benachrichtigt.
Diese "Rückruf" Funktionalitäten sind gerade deshalb überhaupt in die verschiedenen Sql Server eingebaut worden.

Laut MSDN ist das aber nicht die empfohlene Vorgehensweise:

SqlDependency-Klasse

SqlDependency wurde zur Verwendung in ASP.NET oder in Diensten der mittleren Ebene entworfen, in denen eine relativ kleine Anzahl von Servern aktive Abhängigkeiten für die Datenbank aufweisen.Das Objekt wurde nicht für Client-Anwendungen entworfen, in denen für Hunderte oder Tausende Client-Computer SqlDependency-Objekte für einen einzelnen Datenbankserver eingerichtet sind.Wenn Sie eine Anwendung entwickeln, in der Sie zuverlässige Sub-zweite Benachrichtigungen erfordern, wenn Datenänderungen, die Abschnitte Planen einer effizienten Abfragebenachrichtigungsstrategie und Alternativen zu Abfragebenachrichtigungen im Planen für Benachrichtigungen Thema in der SQL Server-Onlinedokumentation überprüfen.

Und als Empfehlung dazu gibts auch einen Link auf der Seite: Planen von Benachrichtigungen

Lg, XXX

11.01.2013 - 16:15 Uhr

Bzgl. der Items die trotzdem selektiert bleiben fällt mir leider gerade nichts mehr dazu ein.

Bzgl. der Vorgehensweise glaub ich, dass das Geschmackssache ist: Ich hab zum Beispiel mal eine Filterfunktion umgesetzt, die sich nur die sichtbaren Items merkt. Wenn der Filter wieder aufgelöst wird, sind nur die zuletzt markierten Elemente wieder markiert.

Falls das mit den virtuellen Items und dem IsSelected nicht hinhauen mag, bleibt dir denke ich nicht mehr viele Optionen.
Eine wäre, die nicht-funktionierende Logik selber nachzufrickeln. Zb. Bei einem ItemSelected auch noch prüfen ob die Shift Taste gedrückt war usw. Aber das ist nicht wirklich eine schöne Lösung. Oder du findest ein anderes Control das damit besser zurecht kommt.

Lg, XXX

11.01.2013 - 10:14 Uhr

Hallo BlackMatrix,

ich habe das selber noch nie benötigt sondern nur ein Beispiel für dich im Netz gegoogelt. Was für ein komisches Verhalten bemerkst du denn? Mir fällt bei deinem Codeschnippsel nur auf, dass du immer alle Items durchiterierst und IsSelected setzt. Vielleicht ändert sich ja das Verhalten schon, wenn du nur die "AddedItems" und "RemovedItems" aus der SelectionChangedEventArgs-Klasse behandelst.

Lg, XXX

08.01.2013 - 11:41 Uhr

Bau einmal in deiner WorkAuto Methode oder nur um die DoIt Methode ein try-catch und behandle etwaige Fehler. Wenn ein Fehler in einem anderen Thread passiert, muss das nicht bedeuten, dass das Service deswegen beendet wird jedoch der Thread und die Schleife werden dadurch mit Sicherheit beendet sein.

Bau Logging ein und schau, ob das Program nach 6 Std. noch immer die Schleife sauber abarbeitet bzw. falls nicht, solltest du sehen bis wohin es zuletzt gekommen ist.

Lg, XXX

08.01.2013 - 11:20 Uhr

Hallo Ahrimaan,

wenn du nicht weißt was es dir bringen soll, wieso denkst du dann ernsthaft darüber nach?

Wenn man schon so lange im Berufsleben steht zahlt sich ein Studium am selben Sektor(also Informatik) mMn. überhaupt nicht aus. Außer du strebst eine Position/Stelle an, die du ohne Studium nicht oder nur schwer bekommen würdest. (Lehre, Banken, Staatliche Betriebe(zumindest ist das angeblich in AT so))

Ich habe mir vor ein paar Jahren die selbe Frage gestellt und mich dann dagegen entschieden. Außer, dass ich im Ausland evt. leichter Jobs damit finden würde, habe ich für mich keinerlei Vorteile gesehen. Lieber nutze ich die Zeit anderwertig und lerne zB Sprachen.

Lg, XXX

20.12.2012 - 11:59 Uhr

Hallo Didikong,

zweifeln kann man zB daran ob es einen Gott gibt oder nicht aber nicht an Dingen, die man ganz einfach ausprobieren kann. 😃

Du sagst, dass andere Views mit der selben Vorgehensweise gut aussehen? Dann stimmt etwas an der speziellen View nicht(warum auch immer).

Dazu gibt es einen super FAQ Beitrag, der sich genau solchen Problemen widment: FAQ/Entwurf: Vertrackte Fehler durch Vergleich von echtem Projekt mit minimalem Testprojekt finden
Ups... hab übersehen, dass Herbivore den Link bereits gepostet hat.^^

Lg, XXX

19.12.2012 - 14:55 Uhr

Hallo BlackMatrix,

ich kenne das Verhalten welches du beschreibst. In dem Thread How to bind IsSelected in a ListView for non-visible (virtualized) items wird auf eine Lösung im Codebehind verwiesen bei der man das SelectionChanged Event abboniert und dort dann die Selektionen manuel setzt.

Lg, XXX

19.12.2012 - 09:08 Uhr

Evt. hilft SnapToDevicePixels hier.

Lg, XXX

12.12.2012 - 12:25 Uhr

Hast dus schon mal mit Documents.Open alternativ probiert?

Wird ein leeres, neu erstelltes docx korrekt geöffnet?

Es gibt bei Documents.Add mehrere optionale Parameter. Unter anderen documentType oder so - vielleicht kann man da was drehen?

Lg, XXX

07.12.2012 - 13:28 Uhr

Wer behauptet das?

Ich habe das behauptet. Ich selbst und auch in meinem Freundeskreis haben sich viele nach langem verweigern dann doch "weichklopfen" lassen und sind Facebook beigetreten. Wenn man sich auch mal daran gewöhnt hat ist es schon eine Hürde zu sagen - ich brauch das nicht mehr. Das sieht zur Zeit ähnlich aus wie mitn Handy - jeder "braucht" eines und ohne ist man aufgeschmissen, weil alle Kontakte da drinnen verwaltet werden und der größte Teil der Kommunikation darüber läuft. - Ich habe meinen Account mittlerweile aber wieder gelöscht.

Wenn jemand nicht auf Facebook sein möchte: dann lasst halt.

Es geht hier nicht darum ob jemand dabei sein möchte oder nicht sondern, dass Facebook gewissenhaft mit den Daten der User umgeht. Die Idee hinter einer solchen Plattform sind ja völlig legitim und es hat einen haufen Vorteile für gewissen User um in Kontakt mit anderen zu bleiben.

Keiner wird gezwungen, die korrekten Daten zu hinterlegen. Ich bin auch drin - aber weder mit öffentlich sichtbaren Profilfoto noch mit echtem Namen. Nicht mal mein angegebenes Geburtsdatum ist korrekt.

Es steht jedem ja frei zu posten was er will - du schränkst dich hier eben ganz besonders ein.

Alle Features, die Facebook für andere bereitstellt (automatisches Markieren in Fotos etc...) sind bei mir deaktiviert.

Und jedes weitere Feature wird standardmäßig ohne zu fragen aktiviert. - sowas sind zum Beispiel Themen von europe-v-facebook.

Hab absolut kein Mitleid mit den Leuten, die wegen Fotos nachher irgendwo angesprochen werden und wundern sich dann. Hirn einschalten muss man überall...

Es geht hier ja nicht um die Leute die gedankenlos ihr intimstes Privatleben veröffentlichen sondern um die Daten, die Facebook ohne wissen des Users aquiriert und weiterverarbeitet. - Mehr Transparenz ist gefragt; Nicht das vollständige Abstellen oder was weiß ich...

07.12.2012 - 11:57 Uhr

Hallo zusammen,

ich wollte auf diese Aktion hinweisen, welche sich zum Ziel gesetzt hat gegen Facebook und ihre Datenschutzrichtlinien speziell im Bezug auf das Europäische Recht vorzugehen.

Der Initiator, Max Schrems, hat aus meiner Sicht schon unglaublich viel erreicht und kämpft noch weiterhin für mehr Transparenz und Klarheit über die Verwendung der gesammelten Daten bei Facebook.

Facebook ist bereits so groß ist und viele in unserem Umfeld sind darauf vertreten, sodass eine gewisse Zwanghaftigkeit besteht, dem Verein beizutreten um kein Außenseiter zu sein. Bei jungen Menschen trifft das dabei sicherlich noch viel mehr zu als bei Erwachsenen und die kennen sich genau am wenigsten mit dem Thema aus.

Homepage
Ziele der "Organisation".
Youtube Seite mit Interviews und anderen Beiträgen zu dem Thema.

Lg, XXX

06.12.2012 - 12:17 Uhr

Hallo Alex,

ja genau so hab ich das gemacht. Prinzipiell keine Hexerei:

Ich habe die Eigenschaft AutoSize überschrieben:


        bool _autoSize;
        public override bool AutoSize
        {
            get { return _autoSize; }
            set
            {
                _autoSize = value;
                RefreshControlSize();
            }
        }

und mich dann bei folgenden Events reingehängt um bei Änderungen ebenfalls die Größe neuzuberechnen:

OnColumnWidthChanged
OnRowHeightChanged

OnColumnAdded
OnRowsAdded

OnUserAddedRow
OnUserDeletedRow

OnDataSourceChanged
OnDataBindingComplete

Ich kann nicht mehr sagen warum ich zB die letzten zwei Events auch abboniert habe aber es war anscheinend notwendig - du kannst dich ja damit spielen.

Die Berechnung hab ich dann so gestaltet:


        private void RefreshControlSize()
        {
            if (!_autoSize) return;

            int height = 0;
            int width = 0;

            foreach (DataGridViewRow row in Rows)
                height += row.Height;

            foreach (DataGridViewColumn col in Columns)
            {
                if (col.Visible)
                    width += col.Width;
            }

            if (ColumnHeadersVisible)
            {
                if (height == 0) height--;
                height += ColumnHeadersHeight;
            }
            if (RowHeadersVisible) width += RowHeadersWidth;

            if (BorderStyle == BorderStyle.FixedSingle)
            {
                width += 2;
                height += 2;
            }
            else if (BorderStyle == BorderStyle.Fixed3D)
            {
                width += 5;
                height += 5;
            }
            else
            {
                width += 1;
                height += 1;
            }

            Size = new Size(width, height);
        }

Lg, XXX

//Ein Edit muss noch dazu:

Das Property ist glaube ich im Designer nicht sichtbar. In dem Fall habe ich dann folgende Attribute noch angehängt:


        bool _autoSize;

        [Browsable(true),
         Description("Steuert, ob die Größe des DataGridViews automatisch angepasst werden soll."),
         Category("Verhalten")]
        public override bool AutoSize
        {
            get { return _autoSize; }
            set
            {
                _autoSize = value;
                RefreshControlSize();
            }
        }

27.11.2012 - 15:39 Uhr

Ich kenne persönlich keine aber Google liefert auf Anhieb vielversprechende Seiten:
Introduction to SQLite
C# und SQLite – Eine kleine Einführung

Lg, XXX

27.11.2012 - 15:03 Uhr

SqlLite würde mit der Datenmenge locker zurecht kommen aber wies mit mehreren Benutzern aussieht weiß ich allerdings nicht. Du hast in dem Fall eben eine Datei auf der Platte auf die direkt gelesen und geschrieben wird. -> Praktisch wenn man die Datenbank mit der Applikation gemeinsam ausliefert und nichts installieren will.

Ich habe nur Erfahrungen mit dem SQL Server. Ich würde dir den Empfehlern, weil er in der Express Variante ist er kostenlos und für deine genannten Anforderungen vollkommen ausreichend ist. Zusätzlich gibts mit dem Sql Server Management Studio ein tolles Tool zum Verwalten der Datenbank und die Anbindung zu .NET funktioniert auch reibungslos.

Lg, XXX

27.11.2012 - 14:09 Uhr

Wie kommst du darauf bei SqlLite einen Server zu brauchen? Genau das Gegenteil ist dort der Fall: http://www.sqlite.org/about.html

Lg, XXX

20.11.2012 - 12:43 Uhr

Jedes Datenbank Aktion steckt für sich selbst nochmals in einer Transaktion. D.h. mit oder ohne einer expliziten Transaktion, muss der Server Gewährleisten können, bei einem Fehlerfall die Daten wieder korrigieren zu können und dafür schreibt er halt alles in den Speicher/TempDb.

Ich weiß nicht ob es gezielte Lösungen dafür gibt aber du könntest deine Daten partiell einfügen: In einer Schleife zB jeweils 100k Datensätze einfügen. -> Braucht weniger temporäre Resourcen.

Lg, XXX

14.11.2012 - 11:29 Uhr

Ok, ich sehe gerade, dass dieses DeferRefresh in der ObservableCollection nur für Änderungen am Sort oder Filter gedacht sind. Nicht aber für Adds und Removes. Bei mir funktioniert es deshalb, weil ich meine "eigene" ObservableCollection implementiert habe in der ich während des Updates keine OnCollectionChanged Events mehr feuere und somit die View sich solange auch nicht mehr aktualisiert.

Hier meine Implementierung:

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Linq;
using System.Windows.Data;

namespace XXXprod
{
    public class ObservableCollection<T> : Collection<T>, INotifyCollectionChanged
    {
        public event NotifyCollectionChangedEventHandler CollectionChanged;


        public ObservableCollection()
        {
            DefaultView = CollectionViewSource.GetDefaultView(this);
        }

        public ObservableCollection(IEnumerable<T> items)
            : this()
        {
            AddRange(items);
        }

        public ICollectionView DefaultView { get; private set; }

        private void OnCollectionCollectionChanged(NotifyCollectionChangedEventArgs e)
        {
            if (_deferringRefresh)
                return;

            NotifyCollectionChangedEventHandler handler = CollectionChanged;
            if (handler != null)
                handler(this, e);
        }

        private bool _deferringRefresh;
        public IDisposable UpdateCollection()
        {
            _deferringRefresh = true;
            return new DelegateDisposable(DefaultView.DeferRefresh(), () =>
            {
                _deferringRefresh = false;
                RefreshCollectionView();
            });
        }

        public void RefreshCollectionView()
        {
            DefaultView.Refresh();
        }


        public void Synchronize(IEnumerable<T> items)
        {
            using (UpdateCollection())
            {
                foreach (var removeResult in this.Except(items).ToArray())
                    Remove(removeResult);

                foreach (var removeResult in items.Except(this).ToArray())
                    Add(removeResult);
            }
        }


        public void AddRange(IEnumerable<T> items)
        {
            foreach (var item in items)
                Add(item);
        }


        protected override void InsertItem(int index, T item)
        {
            base.InsertItem(index, item);
            OnCollectionCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item));
        }
        protected override void RemoveItem(int index)
        {
            T item = base[index];
            base.RemoveItem(index);
            OnCollectionCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, item));
        }

        protected override void SetItem(int index, T item)
        {
            T oldItem = base[index];
            base.SetItem(index, item);
            OnCollectionCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Replace, item, oldItem, index));
        }

        protected override void ClearItems()
        {
            using (UpdateCollection())
            {
                T[] oldItems = this.ToArray();

                foreach (T item in oldItems)
                    Remove(item);
            }
        }
    }

    public class DelegateDisposable : IDisposable
    {
        private readonly IDisposable _disposable;
        private readonly Action _disposed;

        public DelegateDisposable(IDisposable disposable, Action disposed)
        {
            _disposable = disposable;
            _disposed = disposed;
        }

        public void Dispose()
        {
            if (_disposable != null)
                _disposable.Dispose();
            _disposed();
        }
    }
}

Lg, XXX

14.11.2012 - 10:34 Uhr

probier mal folgendes:


var view = CollectionViewSource.GetDefaultView(collection);
using(view.DeferRefresh())
{
   //add items here.
}

Lg, XXX

14.11.2012 - 10:13 Uhr

Hallo dredav,

ich glaub zwar nicht, dass es daran liegt aber probier mal deine List<Entry> durch eine ObservableCollection<Entry> auszuwechseln und lass dann bei der Methode "Test" das OnPropertyChanged("EntryCollection") weg <- das erübrigt sich mit der anderen Collection.

Hab vergessen, dass es ja nur beim Scrollen auftritt.

Lg, XXX

13.11.2012 - 10:28 Uhr

Hallo csharp-user,

hast du dir meinen Link überhaupt angesehen bzw. irgendetwas damit probiert? Ich vermute nicht sonst hättest du gesehen, dass man mit shutdown.exe -l den aktuellen User abmeldet und nicht nur den Computer runterfährt. Habs gerade hier mit einem Rechner mit 2 Usern drauf getestet und nur der aktuelle User, der das Script ausführte, wurde abgemeldet.

Lg, XXX

12.11.2012 - 17:18 Uhr

Um wieviele Datensätze handelt es sich denn? Vorher und Nach der Gruppierung? Und wielange dauern deine Abfragen bzw. was erhoffst du dir an Performanzgewinn?

Ich bin kein Indizierungsspezialist was meine kläglichen Versuche, meine Datenbank zu optimieren, bestätigen. Wenn es in dem Fall mit Indizierungen nicht hinhaut, kannst du versuchen eine zweite Tabelle anzulegen, welche direkt das Ergebnis deiner Abfrage enthält. Also bereits gruppiert. Hier muss man halt schauen, wo der beste Zeitpunkt fürs "Cachen" der aggregierten Daten liegt.

Lg, XXX

12.11.2012 - 16:53 Uhr

Hallo csharp-user,

ich persönlich verwende das Windows-eigene Tool shutdown um meinen Rechner nach einer Zeit zB neuzustarten oder einfach auszuschalten.

How do I Shutdown - Restart - Logoff Windows via bat file

Lg, XXX

05.11.2012 - 15:39 Uhr

Die letzte Frage war jetzt überflüssig... (weil Grundlagen und bereits hier schon erwähnt)

Nochmal langsam:

  • Du bindest die Spalte jj_auftrag einer DataRow an deinen DatePicker.SelectedDate
  • Bei Änderungen am Datum, schreibt der DatePicker den Wert wieder zurück in die DataRow in die Spalte jj_auftrag
  • wodurch das dt_ColumnChanged Event gefeuert werden sollte. - Genauso als würdest du das alles manuell wie bisher machen - nur halt vollautomatisch.

Vielleicht solltest du dir mal die Grundlagen zu WPF-Bindings mal näher ansehen: Data Binding in WPF

Lg, XXX

05.11.2012 - 15:26 Uhr

Bzgl. der Änderungsaufrufe beim Laden: Das ist ganz normal und passiert ständig in solchen Szenarien in denen man bei Änderungen die Daten aktualisieren will. Hier musst du eingreifen und zB das Aktualisieren während der "Ladezeit", also dem Befüllen der Gui, jegliche UpdateLogik "deaktivieren".

05.11.2012 - 15:23 Uhr

Ich meinte ja eben nicht das SelectedDateChanged Event zu verwenden, sondern direkt an SelectedDate zu binden.

Lg, XXX

//Edit so circa:

<DatePicker xml:lang="de-DE" Name="jj_auftrag"
                                            SelectedDateFormat="Short"
                                            SelectedDate="{Binding Path=jj_auftrag, Mode=TwoWay}"
                                            Width="140"
                                            HorizontalAlignment="Right" />

Danach sollte bei einem Datumswechsel, automatisch die DataRow aktualisiert werden, was dann automatisch zu deinem dt_ColumnChanged Event führt.

05.11.2012 - 15:20 Uhr

Hallo theYoRecords,

man kann schon auch von anderen Klassen in WPF erben. Ob das aber dann ausreicht ist eine andere Geschichte.

Ich habe hier zB von einer ComboBox geerbt:


<ComboBox x:Class="PKV.Views.Controls.SearchItemControls.SearchDropDownList"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008">
  
  <ComboBox.Template>
       <!--.....-->
  </ComboBox.Template>
</ComboBox>

Lg, XXX