Laden...

Forenbeiträge von rokohl Ingesamt 39 Beiträge

07.08.2014 - 16:45 Uhr

Danke für die Antworten. IValueConverter war ein guter Tip.

Ich habe jetzt auch die Mapping Tabelle mit in mein DataSet eingefügt und eine Relation hinzugefügt.
Damit bekomme ich das aber auch nicht so einfach ohne Converter hin oder?

Wenn ich das richtig sehe ist die Erstellung eines Viewmodels für eine vorhandene DataTable mit mehreren Spalten auch nicht einfach und redundant oder kann ich das irgend wie anderst machen?

Im Moment sieht mein Converter so aus:

        
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var rowview = value as DataRowView;
            if (rowview == null) return null;
            var row = rowview.Row as ServerDataSet.ClientRow;
            if (row == null) return null;
            var software = row.GetParentRows("Software_Clients") as ServerDataSet.SoftwareRow[];
            if (null != software && software.Length > 0) return software[0].Name;
            return null;
        }
06.08.2014 - 23:59 Uhr

Hallo,

ich versuche gerade mein ersten Schritte mit WPF und Datagrids und bin über folgendes Problem gestolpert.
Ich hab z.B. eine Tabelle, aus einem DataSet, die eine Spalte mit bestimmten Werte hat und möchte diese bei der Ausgabe auf einen lesbaren Namen mappen.
Mit einem DatenGridView ( nicht WPF ) konnte man einfach eine Spalte mit Werten auf z.B. ein statisches Dictionary mit Hilfe einer Combobox mappen.
In WPF habe ich das soweit auch hinbekommen mit:

<DataGridTemplateColumn x:Name="Name" Width="100" >
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ComboBox 
              DisplayMemberPath="Value"
              SelectedValuePath="Key" 
              IsEnabled="false"
              SelectedValue="{Binding AppId, UpdateSourceTrigger=PropertyChanged}" 
              ItemsSource="{Binding appNameDict, ElementName=window}" 
              IsReadOnly="True" 
              IsSynchronizedWithCurrentItem="False"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
 </DataGridTemplateColumn>

Diese Spalte soll aber nur lesbar sein und nicht aussehen wie eine ComboBox.
Im DataGridView konnte man einer DataGridViewComboBoxColumn den DisplayStyle Nothing verpassen und die Spalte sah aus wie eine Textbox.
Leider habe ich keine Idee/Ahnung wie ich sowas in WPF hinbekommen.

Hat jemand einen Tip?

Grüße

14.07.2009 - 13:51 Uhr

mhm das kenne ich nicht, sieht aber auch nicht schlecht aus... mal probieren.

14.07.2009 - 13:42 Uhr

Hallo,

Ich suche eine Studio-Plugin dessen Namen ich leider nicht mehr weiß.

Es war ein Refactoring-Tool im weitesten Sinne welches den Sourcecode umstrukturiert,
d.h. es sortiert z.b. die verwendeten Namespaces alphabetisch , sortiert die
Eigenschaften einer Klasse nach private, protected usw. und fügt Regions ein.

Kennt jemand so ein Plugin?

Danke

09.07.2009 - 15:55 Uhr

Leider nicht, man kann die Tasten unterschiedlich belegen und z.b. mit den Pfeiltasten von Child-Control zu Child-Control springen.

Diese Eigentschaft kann allerdings auch von Control zu Control unterschiedlich sein.

09.07.2009 - 11:30 Uhr

Hallo,

ich möchte im CF 3.5 ein eigenes Panel entwickeln, dazu habe ich meine Klasse von ScrollableControl abgeleitet(aus bestimmten Gründen kann ich nicht von Panel ableiten).
Das ganze funktioniert auch Problemlos bis auf die Tatsache, dass das Control Selectable ist. Die Klasse soll analog zum Panel keinen eigenen Focus haben bzw. den gleich an die Kinder abgeben.
Im normalen Framework würde ich

SetStyle(ControlStyles.Selectable, false);

nutzen, doch leider gibts das nicht im CF.

Wenn ich OnGotFocus überschreibe kann ich SelectNextControl verwenden um den Focus weiterzureichen, allerdings ist da die Richtung das Problem.
Ich weiß in OnGotFocus nicht ob ich den Focus vorwärts oder rückwärts weiterleiten soll.

hat jemand eine Idee wie ich das lösen könnte?

Danke

03.02.2009 - 11:11 Uhr

Hi,

ich nutze in der Regel auch keine dynamischen DS, nur um ein hier "postbares" Beispiel zu schaffen habe ich darauf zurückgegeriffen.

Stimmt das mit dem Beispiel war Käse, da hab ich wohl bei Testen die falsche Zuweisung gemacht.

mhm ich werd mal probieren ob das immer klappt....

Danke

03.02.2009 - 09:33 Uhr

Hallo,

danke für die Antwort.
Ja ich weiß, wenn da eine einfache Tabelle in der BS hängt bekommt ich es ja auch einfach raus.
Nur wenn dort eine Relation hängt geht es nicht.


            DataTable mastertbl = new DataTable();
            mastertbl.TableName = "Master";
            mastertbl.Columns.Add("ID", typeof(int));

            DataTable detailtbl = new DataTable();
            detailtbl.TableName = "Detail";
            detailtbl.Columns.Add("ID", typeof(int));
            detailtbl.Columns.Add("masterID", typeof(int));

            DataSet ds = new DataSet();
            ds.Tables.Add(mastertbl);
            ds.Tables.Add(detailtbl);

            DataRelation r = new DataRelation("DetailMaster",
                    new DataColumn[]
                                {
                                    mastertbl.Columns["ID"]

                                },
                    new DataColumn[]
                                {
                                    detailtbl.Columns["ID"]

                                }
                    , false
                    );

            ds.Relations.Add(r);

            BindingSource bs = new BindingSource();
            bs.DataSource = ds.Tables["Master"];


            DataView list = bs.List as DataView;
            if (list != null)
            {
                MessageBox.Show(list.Table.TableName);
            }
            bs.DataSource = r;

            list = bs.List as DataView;
            if (list != null) // failed
            {
                MessageBox.Show(list.Table.TableName);
            } 

Ich muss dort unterscheiden ob es eine BindingSource oder Relation ist.
Das Problem wird komplizierter da ich von einer DataGridViewColumn ausgehe,
d.h. das ich noch das Feld DataMember zu beachten habe usw.

Ich dachte nur ich komme von einer DataGridViewColumn einfach an die Tabelle ran die eigentlich drunter hängt (über PropertyDescriptor oder sowas in die Richtung,
( es gibt ja z.B. auch die interne Klasse DataColumnPropertyDescriptor aber da kommt man nicht ran )

aber naja dann muss ich wohl doch die ganzen Fälle händeln.

Grüße

02.02.2009 - 18:31 Uhr

Hallo,

gibt es einen Weg den Tabellennamen zu einer gebundenen Spalte zu bekommen (von DataGridViewColumn zu DataTable).

Ich möchte eine Erweiterung des DataGridView schrieben und brauche daher eine "allgemeine" Lösung.
Da die DataSource z.b. eine Bindungsource mit einer Relation sein kann, ist das korrekte Auffinden des Tabellennamens sehr aufwendig.

Grüße
Thomas

25.09.2008 - 09:28 Uhr

Hi ErfinderDesRades,

danke für den Workaround, funktioniert super.

Bleibt aber immernoch die Frage ob das ein Bug oder Feature im DataGridView ist.

Gruß
Thomas

22.09.2008 - 13:12 Uhr

Hallo,

es ist jetzt schon eine ganze Weile her, aber so richtig hatte ich das Problem auch nicht gelöst.
Ich konnte es umfahren, da ich nur 1 Zeile maximal für Drag&Drop zulassen musste und somit konnte ich die DoDragDrop auch erst in MouseMove aufrufen.
( so wie hier http://dzaebel.net/DataGridViewDragDrop.htm )

Mir ist das Problem immernoch unverständlich und ich denke, wir da einen Denkfehler drin, da das Problem schon recht gravierent ist.

@GMLOD:
Mit Hittest bekommt man es hin aber die selektierten Zeilen sind während des Drag&Drop weg. Ein erneutes selektieren im MouseMove wird auch erst nach beenden
des DD sichtbar.

Anbei hab ich das Beispiel von damals nochmal abgespeckt da es mit Threads nix zu tun hat. Einfach ein Paar Zeilen vom DataGridView auf die ListView ziehen und versuchen auf eine Zeile des DGV zu klicken... beim 1 mal passiert nix.

Gruß
Thomas

11.08.2008 - 11:17 Uhr

na wer z.b. klicky bunti will über den

SQL Express Management Studio

oder für die console:

SQLCMD

11.08.2008 - 08:20 Uhr

Hi,

das Script erstellt keine Datenbank sondern nur Tabellen in der Datenbank.
Die Datenbank selbst musst du dir vorher selbst erzeugen und darin dann das Script ausführen.

Gruß
Thomas

08.08.2008 - 14:20 Uhr

oh man danke. so gehts .... mist ich dachte das is dein std footer ... man muss schon genauer hinsehn.

danke nochmal
gruß
thomas

P.S. hätte mich auch echt gewundert wenn das nicht ginge

08.08.2008 - 13:11 Uhr

Das mit Klicky Buntie war auch nur als Beispiel zu sehn 😉.


2.
Speichere die Parenttable einzeln, und behebe danach die ID's in den
jeweiligen Child tables, dann speichere diese.

und genau das ist nach meiner Meinung nach nicht einfach möglich.
Das ist nur unter der Annahme möglich das die ID's von der Datenbank mindestens größer sind als die die Lokal vergeben wurden.

wieder mal das Beispiel:

ID NAME
100 Schmidt
101 Müller
102 Schulze*
103 Fritz*

Tabelle Adressen

KundenID Anschrift
102 XY-Straße*
103 XZ-Straße*

Alle mit * makierten Datensätze sind neu und sollen gespeichert werden.
Bekommt Schulze die ID 103 und Fritz 104 muss ich von oben anfangen die ID's in den Addressen zu ändern.
Also:
alle Adressen mit ID 103 => in 104 ändern
alle Adressen mit ID 102 => in 103 ändern

andersrum geht das nicht denn dann würde passieren:
alle Adressen mit ID 102 => in 103 ändern
alle Adressen mit ID 103 => in 104 ändern

genau dann hat Fritz beide Addressen bekommen.
Nun ist aber nicht garantiert wie die ID vergeben werden, die DB könnte theoretisch auch 98 und 99 vergeben oder sowas.

Was ich sagen will ist das die Zuordnung nicht immer klar ist.

08.08.2008 - 12:13 Uhr

P.S. Hier http://msdn.microsoft.com/de-de/library/4esb49b4.aspx wird ein solches vorgehen direkt von MS beschrieben.

08.08.2008 - 11:13 Uhr

Ne ich glaube wir verstehn uns da falsch, ich versuche das nochmal genauer zu beschreiben.
Du willst ein Kunden-Verwaltungsprogramm schreiben. Der Kunde hat beliebig viele Adressen die also über eine Fremdschlüsselrelation mit dem Kunden gebunden sind.

Beispiel:
Tabelle Kunden

ID NAME
100 Schmidt
101 Müller

Tabelle Adressen

KundenID Anschrift
100 Musterweg 7
100 Schulstraße 9
101 Arbeitsamt

Die KundenID ist autoincrement. So weit so gut.

In der GUI hast du z.b. ein Master DataGridView mit den Kunden und ein Detail-DataGridView über die FK-Relation mit den Adressen einfach auf eine Form gezogen.

Läuft die GUI nun im Multiuserbetrieb kann doch folgendes Scenario auftreten:

Nutzer 1 legt in seinem lokalen DataSet eine Kunden an ( * heiß nur lokal vorhanen )

Beispiel:
Tabelle Kunden

ID NAME
100 Schmidt
101 Müller
102 Schulze*

Das Dataset hat die vorläufige ID 102 vergeben. Diese ID wird beim speichern des DataSets gegebenenfalls von der Datenbank korrigiert.

also nach einen KundenDataTableAdapter.Update(...) kann die Tabelle so aussehn:

Beispiel:
Tabelle Kunden

ID NAME
100 Schmidt
101 Müller
102 Ingo
103 Schulze

Weil Nutzer 2 in der gleichen Zeit einen neuen Datensatz angelegt hat. So weit so gut und alles geht Prima. Hat aber Nutzer 1 noch eine Adressdatensatz angelegt wurde vom DataSet der Fremdschlüssel 102 auch in die Adressentabelle eingetragen.
Beim speichern wird dieser aber nicht aktualisiert und somit hat Ingo die Adresse von Schulze bekommen.

> Wieso nicht erst den Kunden anlegen lassen und dann alle dazugehörigen Adressen?

Naja so hatte ich es vorher. Immer wenn der aktuelle Kunde gewechselt wurde hab ich alles speichern lassen. Das führt allerding zu lustigen Problemen mit der GUI.
Wie gesagt versuch mal ein "Wollen Sie wirklich speichern" mit einem Abbruch zu realisieren. Den Wechsel eines Datensatzen kann man nicht pauschal über die Bindingsource verhinden. Man bekommt es zwar über Umwege hin, aber desto komplexen die Anwendung wird desto mehr Seiteneffekte erhält man. Egal.

Das DataSet-Konzept is ja so ausgelegt das man Teile eine Datenbank also auch mehrere Tabllen inklusive Relationen lokal hält. Es verändert und dann die
Änderungen wieder mit der Datenbank abgleicht.
Darauf sind auch die Objekte wie die Bindingsource ausgelegt. Daher versteh ich auch nicht wieso ein solches ( meiner meinung nach nicht seltenes ) Szenario zu solchen gravierenden Fehlern führen kann.

Ist ein solches Desgin komisch? Dann hab ich grundsätzlich was falsch verstanden.

Master und Details wird nicht in einem Rutsch gespeichert, und genau das is ja das Problem. Nach einem speichern der Master Tabelle Kunden mit z.b. 2 Neuen Kunden
kann ich im nachhinein nicht mehr sagen was welcher Kunde war weil ich nicht weiß welcher Kunde welche ID von der Datenbank bekommen hat.

08.08.2008 - 09:42 Uhr

Hi Sascha,

das mit dem Nummernkreis führt aber zu selben Problem, den genau das macht das Dataset doch bereits.

Die nächsten N freien Nummern kann ich mir erst zu Zeitpunkt des speicherns holen.
Um eine Zuordnung vorhermachen zu können muss ich lokal wieder temp. Nummern vergeben(lassen). Also hab ich wieder das Beispiel:

Kunden.KundenID = 100
Adressen.KundenID = 100
Adressen.Straße = XYZ

Kunden.KundenID = 101
Adressen.KundenID = 101
Adressen.Straße = ZYX

Kunden.KundenID = 102
Adressen.KundenID = 102
Adressen.Straße = AAA

Beim speichern bekomme ich dann also Nummer 101 102 103
also Ändere ich meine Daten auf:

Kunden.KundenID = 101
Adressen.KundenID = 100
Adressen.Straße = XYZ

Kunden.KundenID = 102
Adressen.KundenID = 101
Adressen.Straße = ZYX

Kunden.KundenID = 103
Adressen.KundenID = 102
Adressen.Straße = AAA

Wenn ich jetzt iterativ die Adressdaten ändere hab ich das Problem das nachdem ich
Adressen.KundenID = 100 auf Adressen.KundenID = 101 gesetzt habe ich zwei Datensätze mit Adressen.KundenID = 101 habe. Diese muss man dann wieder auseiander klamüsern. Eine einfaches


For each Ungespeicherte Adressen-Datensätze:
    find Adressen-Datensatz D where KundenID = AlteKundeID.
    D.KundenID = NeueKundenID.
end.

geht also nicht.

Eine andere Variante ist zwei unterschiedliche Nummernkreise für Lokal und in der DB zu verwenden, aber das alles ist mit wesentlich mehr Aufwand und Fehlerquellen verbunden als die GUIDs.

Gruß
Thomas

08.08.2008 - 08:51 Uhr

Hi Rainer,

das kann man auch machen hat aber zwei Nachteile:

  1. es löst das Konzept der DataSets auf, denn dann kann man auch mit einzelnen Daten von Tabellen arbeiten.

  2. ich muss in meiner GUI nicht nur vorsorglich speichern sondern auch löschen, nämlich genau dann wenn der user nicht auf speichern drückt aber eine Adresse angelegt hat.

Szenario: Er legt lokal einen Kunden an und eine Adresse. Wenn ich dich richtig verstanden habe soll ich den Kunden anlegen sobald er versucht eine Adresse anzulegen. Dann muss ich den Kunden und die Adresse aber wieder löschen wenn er nicht speichert.

Das der Datensatz Kunde angelegt werden muss bevor man Adressen anlegen kann, das war meine bisherige Implementierung (Bzw. konnte man den Kunden nicht wechseln eher dieser gespeichert war).
Meine Erfahrung damit sagt mir aber das es immer große Probleme macht sowas abzufangen.

( Beispiel: man kann das Wechseln einen Datensatzes in der Bindersource nicht verhinden. Eine Fragen wie "Wollen Sie wirklich speichern" mit der Option "Cancel" macht dann schon arge Probleme. )

Daher scheint mir die Lösung mit den GUID im Moment am besten, da ich sonst nur Seiteneffekte mit der GUI bekomme.

Gruß
Thomas

07.08.2008 - 20:32 Uhr

Hi Sascha,

zunächst danke für die schnelle Antwort.

Klar das ist richtig das mit den GUID kann man machen.
Aber ich versteh das nicht, dass "Offline"-Arbeiten ist das Grundprinzip der DataSets.
Wie soll ich den das "Online"-Arbeiten?

Auf GUID umstellen kann man immer, trotz Kundennummer. Man muss es ja nicht sichtbar machen 😉 . Allerding ist es doch ganz schön ärgerlich wenn das nicht anderst geht.

Gruß
Thomas

07.08.2008 - 18:18 Uhr

Hallo,

ich habe ein Problem mit einer Master-Detail Relation.
Ich habe 2 Tabellen z.b. Kunden und Adressen wobei diese über eine 1:N Relation verbunden sind.
(also Adressen.KundenID = Kunden.KundenID)
Kunden.KundenID ist ein AutoIncrement Spalte, d.h. sie wird von der Datenbank automatisch erstellt.
(Legt man lokal in der Anwendung einen neuen Datenstatz an wird eine ID automatisch lokal vorvergeben, diese wird gegebenen falls beim Speichern des Datenstatzen von der Datenbank korrigiert(wenn sie bereits vergeben ist).)

Da diese ID aber auch in der Relation verwendet wird kann doch folgendes Szenario auftreten:

2 Nutzer legen zur selben Zeit lokal einen Datensatz der Tabelle Kunden an. Die lokalen Applikationen vergeben jeweils die ID 100 für den neuen Datensatz von Kunden. Legt Nutzer 1 jetzt noch einen Datensatz der Tabelle Adressen an bekommt diese den Fremschlüssel Adressen.KundenID = 100.

Speichert Nutzer 2 vor Nutzer 1 bekommt sein Datensatz die ID 100 von der Datenbank. Speichert nun der 1. Nutzer sein DataSet wird Kunden.KundenID = 101 zugewiesen.
Der Fremdschlüssel wird aber nicht upgedatet sondern der Datensatz einfach gespeichert.
Das heißt dass der Datensatz von Nutzer 2 mit Adressen.KundenID = 100 gespeichert wird und somit dem falschen Datensatz zugeordnet wird.

Wie kann man das Problem lösen? Ein Denkfehler?
Klar, gibt es nur einen neuen Datensatz A kann man das Problem lösen, was aber wenn ich mehrere neue Datensätze von A und B habe?

Beispiel:

Lokal angelegte Datensätze :

Kunden.KundenID = 100
Adressen.KundenID = 100
Adressen.Straße = XYZ

Kunden.KundenID = 101
Adressen.KundenID = 101
Adressen.Straße = ZYX

Kunden.KundenID = 102
Adressen.KundenID = 102
Adressen.Straße = AAA

wenn jetzt die Kunden.KundenID 100 schon vergeben ist sehen die Datensätze nach dem Speichern so aus:

Kunden.KundenID = 101
Adressen.KundenID = 100
Adressen.Straße = XYZ

Kunden.KundenID = 102
Adressen.KundenID = 101
Adressen.Straße = ZYX

Kunden.KundenID = 103
Adressen.KundenID = 102
Adressen.Straße = AAA

und die Zuordung ist völlig falsch.

Danke und Gruß
Thomas

05.04.2008 - 20:50 Uhr

Hi,

mit Tapi3 kann man ja in C# sehr einfach eine Wahlhilfe bauen.

Mit


...
 ITBasicCallControl bcc = ln.CreateCall("110", TapiConstants.LINEADDRESSTYPE_IPADDRESS, TapiConstants.TAPIMEDIATYPE_AUDIO);
                    bcc.Connect(false);

ist ein Anruf schnell erstellt. ( siehe http://www.codeproject.com/KB/IP/devangpro.aspx )

Führe ich den Code aus und nehme das Telefon der Nebenstelle ab,
welche ich bei der Installation des AVM Tapi Treibers eingestellt habe
, werde ich mit der Nummer verbunden.(Ich verwende eine FritzBox)

Nun meine Frage:
Weiß jemand wie ich die verwendete Nebenstelle "on the fly" ändern kann?
Das heißt ich möchte gern einstellen können, dass er die Nummer XYZ mit der
Nebenstelle ABC verbinden soll.

Danke
Thomas

16.11.2007 - 14:16 Uhr

hallo herbivore,

da haben sich wohl unsere posts überschnitten.

das problem ist nicht der tab sondern das man die cursor-position nicht festlegen kann.

gruß
thomas

16.11.2007 - 14:14 Uhr

Lösung selbst gefunden:

        
        [DllImport("User32.dll")]
        private static extern int SendMessage(IntPtr hWnd, uint msg, int wp, int lp);

        private const uint WM_LBUTTONDOWN = 0x201;
        private const uint WM_LBUTTONUP = 0x202;
        // Implements the IDataGridViewEditingControl.PrepareEditingControlForEdit 
        // method.
        public void PrepareEditingControlForEdit(bool selectAll)
        {
          /*  SendKeys.Send("{HOME}");*/
            IntPtr hWnd = this.Handle;
            if (hWnd != IntPtr.Zero)
            {
                int x = 2;
                int y = Height / 2;
                int lParam = x + y * 0x00010000;

                SendMessage(hWnd, WM_LBUTTONDOWN, 0, lParam);
                SendMessage(hWnd, WM_LBUTTONUP, 0, lParam);
            }

        }

Das ist leider nur ein Workaround, eine andere Lösung hab ich leider nicht finden können.

aber sie geht.

gruß
thomas

15.11.2007 - 17:02 Uhr

Hi,

Ich habe mir einen DateTimePicker-Column für das DataGridView gebastet und das funktioniert auch sehr gut.

Nun habe ich ein kleinen Problem mit dem Verhalten den DTP im folgenden Szenario:

Ich hab eine DataGridView mit Beispielsweise 2 DateTimePicker-Spalten.
Editiert man in der ersten Spalte den Monat und drückt Tab so landet man in der zweiten Spalte und editiert dort den Monat. Genau dieses Verhalten ist allerdings nicht erwünscht. Wechselt man die Spalte soll der Tag editiert werden und nicht der zu letzt editierte Monat oder das Jahr.

Hat einer eine Idee wie ich das ausschalten kann?

Danke
Thomas

25.10.2007 - 10:35 Uhr

Hallo nochmal,

ich hab mal eine kleine Testanwendung gebaut die dieses Problem einzugrenzen.

einfach im DGV ein Paar Zeilen auswählen und auf die ListView ziehen.
Daraufhin werden keine ListView-Einträge erzeugt sondern nur ein Kopieren simuliert.
( man kann auch die Einträge erzeugen, war mir aber auf die schnelle zu stressig 😉 )

Versucht man nach erfolgreichen Drag&Drop auf eine Zeile im DGV zu drücken, die nicht markiert ist, reagiert das DGV darauf nicht, erst ab dem 2 Klick gehts weiter.

25.10.2007 - 09:48 Uhr

Hallo,

danke für die Antwort, aber leider löst es nicht mein Problem. 🙁

Ich vermute das das dgv nicht mitbekommt das das Drag&Drop beendet ist.
Daher reagiert es nach dem 1. Click nach erfolgreichen D&D nicht.

Ich denke es ist ein Thread Problem. Meine Ziel-DragDrop-Funktionen startet einen Backgroundworker zum Kopieren der Daten und vermutlich gibt es da Probleme.
Leider habe ich keine Ahnung wieso, bzw. welches Event verschluckt wird. Schalte ich den Backgroundworker aus funzt es.

Workaround: Startet ich in der RunWorkerCompleted ein kurzes Dummy Drag&Drop an
mit z.b. ListView1.DoDragDrop("dummy", DragDropEffects.Move);
reagiert das DGV wieder auf den 1.Click.

tja ... welches Event allerdings wie verloren geht ... mhm

Gruß
Thomas

24.10.2007 - 20:50 Uhr

interessant ist das ich das 1. click-event nach einem drag&drop von dgv auch bekommen aber die selection änder sich nicht.... komisch

24.10.2007 - 20:10 Uhr

Hallo,

ich habe ein kleines Problem mit dem DGV und der DoDragDrop Funktion.
Nach einem erfolgreichen Drag&Drop vom DGV in ein ListView bleibt das DGV weiterhin für min. 1 Click ohne Reaktion. Erst nach dem 2. Click auf das DGV reagiert es wieder.

Ich löse das DoDragDrop in der MouseDown funktion aus, da ich fullrowselect und multiselect verwende um mehr als eine Zeile zu "drag&dropen".
Führe ich den gleichen Code erst in der MouseMove funktion aus, reagiert das DGV nach erfolgreichen Drag&Drop sofort wieder.
Leider kann ich das MouseMove-Event nicht verwenden, da man damit nur 1 Zeile selektieren kann.

       
private void dgvDocs_MouseDown(object sender, MouseEventArgs e)
        {
            if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
            {
                 DataGridView.HitTestInfo info = dgvDocs.HitTest(e.X, e.Y);
                 if (info.RowIndex >= 0)
                 {
                    List<int> docIDs = new List<int>();
                    bool found = false;
                    foreach (DataGridViewRow r in dgvDocs.SelectedRows)
                    {
                        int docid = Convert.ToInt32(r.Cells["docID"].Value);
                        docIDs.Add(docid);
                        if (r.Index == info.RowIndex) found = true;
                    }
                    if (found && docIDs.Count > 0)
                    {
                        dgvDocs.DoDragDrop(docIDs, DragDropEffects.Copy);
                    }
                }
            }
        }

kann mir Jemand helfen?

Danke
Thomas

14.03.2007 - 10:25 Uhr

selbst excel ( deutsche version ) erkennt 1.1 als datum. naja egal ich versuchs mal über das numberformat. ist mir sicherer...

14.03.2007 - 10:17 Uhr

das mit dem numberformat werde ich mal probieren.

die parse funktion prüft schon ob es ein datum ist. sie ließt nur bestimmte formate ein wie

  1. Juni 2007
    oder
    01.06.2007

nur weiß ich leider nicht welche formate sie alles akzeptiert, aber das könnte man einmal testen ob sie auch 1.06 nehmen würde.

14.03.2007 - 09:46 Uhr

hi,

danke für die antwort. ich habe leider keinen zeitraum auf den ich es sinvoll begrenzen kann. ausserdem besteht dann immernoch die gefahr das ich ein double in eine datum umwandle der keines ist, weil es zufälligerweise passt.

im Moment hab ich mir damit geholfen, dass ich den string nehme und mit datetime.parse versuche umzuwandeln. klappt das nicht ist es kein datum.
klappt es bin ich mir aber nicht 100%ig sicher das es ein datum ist, da ich nicht weiß was für formate die parsefunktion alles schluckt.

07.03.2007 - 09:25 Uhr

du hast recht. das zählt er als ref.
mhm...aber ich verstehe das immer noch nicht 100%ig.
ich hatte den fall das es an einem xdoc.CreateElement aufruf lag den ich zwischen den excel befehlen verwendet hatte. ohne ihn lief es - mit ihm hat er excel nicht zu gemacht. obwohl da nix von excel verwendet wurde sondern nur xml krams.

desweiteren is an meinem beispiel interessant das es excel auch zu macht wenn man alles am ende auf null setzt. heißt das das ReleaseComObject automatisch aufgerufen wird? das würde ja bedeuten das man ReleaseComObject garnicht aufrufen muss.

naja egal, aber komisch ist das schon...

danke nochmal

06.03.2007 - 18:56 Uhr

mhmmm ich würd aber gerne mal wissen wieso er in meinem beispiel bei

Marshal.ReleaseComObject(workSheet) keine null zurück gibt.

ich sehe da keine referenz ???

06.03.2007 - 11:43 Uhr

Nachsatz:

als ich meine function dazu bringen wollte excel nach beendigung wierder zu schließen bin ich übrigens an der function xdoc.CreateElement gescheitert.
was auch wieder auf den gc deutet!

06.03.2007 - 11:34 Uhr

hi,

ich habe mich auch eine zeitlang mit diesem problem beschäftigt und bin zu dem schluss gekommen das es ein garbage-collector problem ist.

wenn man extrem sauber und garbage collector "freundlich" programmiert so das er
alle verwendeten variablen problemlos löschen kann, geht auch excel zu. vergisst man aber eine variable in der funktion auf null zu setzten oder noch schlimmer ein dipose aufruf eines erstellten objektes, geht excel erst beim beenden des programmes zu. 😦

anbei ein kleines beispiel progi was bei mir excel wieder zumacht. setzt man aber eine von den variablen am ende nicht null geht excel nicht zu.

            
            Excel.ApplicationClass app = null;
            Excel.Workbook workBook = null;
            Excel.Worksheet workSheet = null;
            Excel.Range range = null;


            app = new Excel.ApplicationClass();
            // create the workbook object by opening the excel file.
            workBook = app.Workbooks.Open(@"test.xls",
                                                     0,
                                                     true,
                                                     5,
                                                     "",
                                                     "",
                                                     true,
                                                     Excel.XlPlatform.xlWindows,
                                                     "\t",
                                                     false,
                                                     false,
                                                     0,
                                                     true, 
                                                     Missing.Value,
                                                     Missing.Value
                                                     );

            if (null != workBook.ActiveSheet)
            {
                workSheet = (Excel.Worksheet)workBook.ActiveSheet;
                range = (Excel.Range)workSheet.Cells[1, 1];
            }

            workBook.Close(false, Missing.Value, Missing.Value);

            app.Application.Quit();
            app.Quit();

            Marshal.ReleaseComObject(range);
            Marshal.ReleaseComObject(workSheet);
            Marshal.ReleaseComObject(workBook);
            Marshal.ReleaseComObject(app);
   
            range = null;
            workSheet = null;
            workBook = null;
            app = null;
            GC.Collect();
            MessageBox.Show("done");
05.03.2007 - 18:05 Uhr

Hi,

weiß jemand wie ich herausbekomme ob eine zelle ein datum enthält oder ob es sich nur um ein double handelt?

??
danke im vorraus

08.11.2006 - 11:33 Uhr

hey vielen Dank, das war ja leicht ... 😁

07.11.2006 - 13:57 Uhr

Hallo,

ich suche eine Möglichkeit in Excel ein Sheet als Bild zu kopieren, wie es in Word
mit der Funktion

wordApp.Selection.CopyAsPicture();

möglich ist.

Weiß jemand ob das auch in Excel geht?!

Danke
Thomas