Da ich das mit LinQ nicht sofort hinbekommen habe, mache ich das auch gerade mit einer Schleife und prüfe die Zeichnungsnummer auf nur "einmaliges" vorkommen.
mit LinQ brauche ich bestimmt noch etwas zusätzliches für die Zwischenhaltung der einmalig vorkommenden Zeichnungsnummer (let oder so). Werde auch nochmal nachforschen, aber muss das zuerst so voran bringen.
Evtl. sieht aber jemand sofort die Lösung.
Hallo, kann mir da mal jemand auf die Sprünge helfen? Habe eine Tabelle in eienm DataSat. Da sind Datensätze drin, die mehrmals die identische Zeichnungsnummer haben. Ich möchte jetzt aber alle Datensätze, in denen die Zeichnungsnummer nur einmal vorkommt, und dazu auch die andere(n) Spalte mitausgegeben bekommen. Hie rmal ein Versuch von mir (von vielen), aber ich bekomme nur zwei Datensätze, und die Auftragsnummer ist dazu noch identisch.
var ergebnis = dsNeueProgs.Tables[0].AsEnumerable().Select(t => new {Zeichnungsnummer = t["Zeichnungsnummer"], Artikelnummer = t["Auftragsnummer"]}).GroupBy(g => g.Zeichnungsnummer).FirstOrDefault().ToList();
//// Datenausgabe in Window
Window wnd = new Window();
DataGrid dg = new DataGrid() {ItemsSource = ergebnis};
wnd.Content = dg;
wnd.Show();
verwendetes Datenbanksystem: <SQL2008>
Hallo, in einer meiner Anwendung arbeiten mehrere Personen prallel. Gibt es eine Möglichkeit, das der SQLServer eine Benachrichtigung an alle Clients sendet, sobald sich Daten in der Tabelle ändern (SMO)? Oder wie macht man das am besten, da die Tabelle auch sehr umfangreich ist.
Nun, da bin ich wieder. Leider immer noch ohne Erfolg. Jetzt erklär ich nochmal mein Problem. Evtl. hat jemand das ähnliche Problem oder eine Erklärung dazu.
Zuallererst: Ich habe eine SQL-Tabelle aus einer Datenbank, die ich in ein DataSet einlese (sind auch noch andere dabei). Diese Daten kommen vorn irgendwoher, und werden mit meienr Applikation angezeigt und editiert.
Mein Code ist somit eigentlich alles in CodeBehind erstellt, außer das Window mit dem Aufbau der einzelnen Bereiche.
So, die Tabelle ist eingelesen, ich übergebe die Tabelle an das DataGrid.ItemsSource. Die Daten werden dargestellt. Jetzt kann der User in die Zellen vom DataGrid hüpfen und die Werte ändern, wenn nötig. Er kann auch die Zelle löschen, dann kommt aber der rote Rahmen um die Zelle und mann kann die Zelle nicht verlassen, bis irgendeine Zahl eingegeben wird (und das, obwohl in der SQL-Tabelle für alle Spalten DBNULL erlaubt ist. Ich habe es noch nicht kapiert, wie ich per Code auf diesen Fehler reagieren kann. Mache ich eine eigene Klasse, dann kann ich Callbacks erstellen, das macht doch aber hier gar keinen Sinn, sonst muss ich das ja für sämtliche Tabellen machen die ich einlese. Was muss oder was kann ich tun um den Fehler abzufangen und die Zelle leer lassen, wenn es der User so will??
Hallo, mit WPF fehlt mir noch sehr viel Erfahrung. Ich habe eine Sqltabelle an ein DataGrid gebunden. Mache das aber alles ausschließlich über Code Behind. Nun stelle ich die Daten in dem DataGrid da und der User kann die Daten editieren. Wenn man in einer Zelle löscht und kein Wert hineinschreibt, wird die Zelle rot umrahmt und kann nicht verlassen werden. Wie kann ich das abschalten?
Ich habe dazu noch keine gescheite Erklärung gefunden. Es gibt dazu die ValidationRules. Aber in den Beispielen ist immer XAML im Spiel, wo diese Dinge festgelegt werden. Wie mache ich das, wenn ich eine DB-Tabelle einfach nur an ein DataGrid hänge? Oder wie schalte ich die Fehlerüberwachung aus? Da habe ich eine Menge Probleme. Kann mir jemand einen Tipp geben oder helfen?
Hallo, ich würde das Fenster mit "Auto" oder "*" aufbauen. Das kann verzwickt sein, je nach de wie dein Window aussieht (Aufteilung). Die Schriftgröße würde ich von der Fenstergröße prozentual abhängig machen. Ich denke das du diese Anpassung der Controleigenschaften dann im code behind machen musst.
Ich weiss jetzt auf jeden Fall was die Ursache ist. Es kommt zuerst beim "Speichern" der Daten eine MessageBox, mit der man den Speichervorgang abbrechen kann. Nach dem Speichern kommt dann eine MessageBox, welche die Anzahl der geänderten Datensätze ausgibt. Jetzt war das Porblem, dass die erste MessageBox kleiner als die zweite war. Die erste wurde also durch die zweite verdeckt. Man hat dann bei der 2. MessageBox auc "OK" geklickt, die verschwindet aber die 1. MessageBox die verdeckt wurde, bleibt.
Nun, in Win7 und auf meinem alten WInXP Rechner mit Entwicklungsumgebung ist das alles kein Problem. Aber auf WinXp-rechnern bei den Usern bleibt dieser Fehler bestehen. Habe es erst mal so gelöst, das die Überdeckende MessageBox kleiner ist und die 1. dadurch nicht verdeckt wird, somit muss das System neu rendern. Wie kann ich das aber manuell anstoßen, das die Seite neu aufgbaut wird? Hatte das mal mit Invalidate() probiert, aber ohne Erfolg. Muss ich da mit OnRender() ran (wie mach ich das am besten)?
Hallo, mein String kann 10 oder auch bis 25 Zeichen lang sein. Es muss nur ein Teilstring mit drei aufeinanderfolgenden Ziffern enthalten sein, davor darf aber kein "," oder "." stehen. Die drei Ziffern können auch gleich am Stringanfang stehen.
Hallo, breche mir gerade einen ab. Muss eine Prüfung vornehmen, an einem String, der 3 Zahlen haben darf. Aber vor den drei Zahlen darf kein Leerzeichen, kein "," und kein "." sein. Wie integriere ich das in das Pattern?
Das Problem kommt wohl daher, da ich die Abarbeitung meiner Abarbeitung von Dateien kopieren usw nicht in einem eigenen Thread gestartet wurde. Mache ich das, dann werden die Controls auch aktualisiert.
Hallo, ich experimentiere im Moment mit meiner Applikation. Hier werden jede Mengen von Daten kopiert und in Db's geschrieben, wozu ich auch jede Menge an Ausgaben in der Form ausgebe. das Problem ist, das die Ausgabecontrols ja die aktuellen Daten nicht sofort angezeigt werden. Nun hatte ich zuerst mit dem BackgroundWorker Erfahrungen gesammelt. Nun habe ich aber auch gesehen, das man mit dem Dispatche.Invoke() oder Dispatcher.BeginInvoke() die Controls aktualisieren kann.
Ich habe eine ListBox in der ich den akuellen Status und weitere Meldungen ausgebe. Wenn ich da eine neue Meldung absetze, dan kann ich das doch so ausgeben:
Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => lbx_Ablaufplan.Items.Insert(0, "\n\n\nNeue Dateien von Datenpool suchen und in Sammelpool kopieren ...\n")));
So wie ich das verstehe, kann ich für new Action() auch eine Delegatemethode einsetzen, oder?
Das hatte ich auch schon probiert. Das Problem ist, wenn ich das so mache werden meine COntrols nicht beschrieben, es werden keine Meldungen in der ListBox angezeigt.
Muss ich da doch noch einen Abfrage mit CheckAccess und Verify durchführen, wobei ich das so verstehe das man diese Abprüfung nur macht wenn die Aktualisierung aus einem anderen Thread aufgerufen wird?
Hallo, habe das Problem, dass bei meiner Applikation die MessageBox nach dem klicken auf den "Yes"-Button nicht verschwindet, wenn das Programm auf einem WinXP-Rechner installiert ist. Bei Win7 klappt es. Ich verwende Framework 4.0 Client. Das ist auch auf den Rechnern installiert. Nur bei meinem Win7 ist auch das große FW4.0 drauf. Kann ich irgendwie nach dem klicken von dem "Yes"-Button die Oberfläche neu rendern lassen, oder woran kann das liegen?
Das wäre bei mir ja nicht der Fall, das sieht bei mir (wenn ich das mal so in XAML darstelle) so aus:
<Window x:Class=“WPFSample001.AddControls“
xmlns=“http://schemas.microsoft.com/winfx/2006/xaml/presentation“
xmlns:x=“http://schemas.microsoft.com/winfx/2006/xaml“
Title=“AddControls“ Height=“114“ Width=“212“
>
!--< Kein Stackpanel, kein Grid... Wie füge ich solch ein Element im Code Behinde ein ?? />--!
</Window>
Wir mein Problem jetzt klarer?
Im Code behind (Beispiel):
Window wnd = new Window();
DatGrid dg = new DataGrid();
dg.ItemsSource = tbl.AsDataView();
wnd.Children.Add(dg): // das geht ja nicht, weil im wnd kein Panel ist.
Versteht man mein Problem nun besser? Die ganzen Beispiele sind immer sehr XAML-lastig.
Bist dir sicher? Was soll denn das miteinander zu tun haben, bzw. mit dem DataBindig?
Hatte das schonmal irgendwo gemacht, aber nicht notiert.
Ich will:
- per Code ein Window erstellen
- ich erstelle per Code ein DataGrid und übergebe Daten die angezeigt werden sollen
- ich will das DataGrid dem Window übergeben (per Code) *.Children.Add()
Leider hat das Window ja noch kein StackPanel oder Grid,wo ich das DataGrid rein schmeißen kann .
Hallo, ich möchte dynamisch aus dem Code heraus ein Window erstellen, und dem dann DataGrids oder ähnliches zufügen. Wie mache ich das, da ich einer Window-Instanz kein Control zuweisen kann, da noch kein Grid oder Stackpanel im Window definiert ist. Wie mache ich da?
Hallo, danke für die Info. Ich verwende ja "WPF". Da habe ich auch die DataView von ADO verwendet. Da steig ich noch nicht richtig durch. Kann ich die verwenden, oder besser eine andere (ICollectionView usw ..)? Ich möchte das ja so haben, dass alle Controls auch in anderen Windows auf die Grunddaten des DataSet zugreifen, eine View davon benutzen und somit die Daten auch überall aktualisiert werden. Muss ich da nich irgendwo ein "PropertyChangedEvent" scharfschalten, oder funktioniert das von selbst? Da finde ich mich nicht ganz zurecht. Kann mir da jemand Aufschluss geben?
verwendetes Datenbanksystem: <sqlexpress2008>
Hallo, ich schildere mal mein Problem. Ich fahre aus drei Tabellen (SQL) eine gemeinsame Tabelle zusammen (LinQ).
Ich generiere aus der Tabelle sofort eine DataView, die ich an diverse DataGrids verteile (zzur Visualisierung der Daten). Dann muss ich aus einem der DataGrids, das nur einen Teil der Datensätze anzeigt weitere Datensätze suchen, die in der gemeinsamen Tabelle enthalten sind,aber halt in diesem einen Grid nicht dargestellt wegen der Filtereinstellung. Das Problem das ich habe: Ich will diese Untersuchung in der ich weitere Datensätze bekomme an ein weiteres DataGrid übergeben und dort diverse Änderungen in die Datensätze eingeben lassen (per Code, automatisiert). Dann müssen die Daten ja auch in allen anderen DataGrids oder Anzeigeelementen aktualisiert werden, da diese an der DataView hängen.
Mein Problem ist eben, das ich diese Datensätze, die ich untersuche, aus der gemeinsamen Tabelle hole und diese in eine separate Tabelle schreibe und eben "diese" an das DataGrid weitergebe. Somit haben aber meine Daten keinen Bezug zu der DataView, wodurch sich die Daten überall aktualisieren würden. Wie kann ich das am einfachsten machen, ohne alle Änderungen abzufangen und die Änderungen in sie Datensätze aintragen zu lassen?
Bei der Abfrage bekomme ich folgenden Fehlermeldung:
{System.ArgumentNullException: Value cannot be null.
Parameter name: source
at System.Data.DataTableExtensions.AsEnumerable(DataTable source)
at WpfDatenfinder.Form.Auftr...}
Also ich denke es hat damit zu tun, das in der query die Source, d.h. die eigentliche Datentabelle == null ist. Warum aber? Wie mache ich die Abfrage anders damit das passt? Eigentlich möchte 4 Spalten in eine neue Tabelle laufen lassen, habe aber zum testen erst mal nur ein Spalte verwendet.
Ich habe mir zum behelfen erst mal alle Spalten mit LinQ in eine Tabelle laufen lassen und dann die überflüssigen Spalten entfernt.
Kann ich einzlne Spalten überhaupt gleich per LinQ über eine Abfrage in eine Tabelle fahren?
Hallo, was mache ich falsch?
In der Linq-Anleitung steht, es müßte so gehen. Aber wahrscheinlich ist das DataSet typisiert.
//// geht
IEnumerable<DataRow> query = (IEnumerable<DataRow>)(from o in DsAftVerwalt.Tables["Movdaten"].AsEnumerable()
where o["AGStatus"].ToString().Trim() == agStatus
select o);
//// geht nicht
IEnumerable<DataRow> query = ((IEnumerable<DataRow>)(from o in DsAftVerwalt.Tables["Movdaten"].AsEnumerable()
where o["AGStatus"].ToString().Trim() == agStatus
select new{Spalte1 = o[0]}));
foreach (DataRow row in query)
{
}
Bei der Abfrage bekomme ich folgenden Fehlermeldung:
{System.ArgumentNullException: Value cannot be null.
Parameter name: source
at System.Data.DataTableExtensions.AsEnumerable(DataTable source)
at WpfDatenfinder.Form.Auftr...}
ALso ich denke es hat damit zu tun, das in der query die Source, d.h. die eigentliche Datentabelle == null ist. Warum aber? Wie mache ich die Abfrage anders damit das passt? Eigentlich möchte 4 Spalten in eine neue Tabelle laufen lassen, habe aber zum testen erst mal nur ein Spalte verwendet.
Habe das Problem, wenn ich aus einem DataGrid Daten lösche, ich eine Fehlermeldung bekomme (roter Kringel um die Zelle, Ausrufezeichen). Wie kann ich das umgehen? Habe eine Tabelle angebunden, aber die Struktur der Tabelle darf in allen SPalten DBNull sein. Wie kann ich diesen Fehler unrerbinden?
Hallo, geht das irgendwie? Ich habe zwar bisher eine Lösung, aber die ist unschön. Ich habe zwei übereinanderliegende Datagrids. das obere enthält die Daten, das untere die Struktur vom Datendatagrid (es dient als EInstellung für Filterkriterien). Nun haben aber die DataGrids 35 Spalten. Ich habe die beiden ersten Spalten eingeroren, damit man die Auftragsnummer immer noch sieht wenn man nach rechts scrollt. Aber beim unteren DataGrid bleiben die beiden Spalten nicht stehen. Es hängt daran, das ich die horizontale Position vom oberen DataGrid-Scrollbalken an einen eingebetteten ScrollViewer des untere DataGrids übergebe. Wie kann ich das anders machen? Habe schon viel gesucht, aber nichts gefunden, außer einen alten Eintrag im Forum von bernett auf CodeProject, aber die Seite kann nicht mehr geunden werden.
Hat jemand einen Lösungsansatz für mein Problem?
verwendetes Datenbanksystem: <sqlespress2008>
Hallo, eine Frage zur LinQ mit Distinct(). Gibt es überhaupt die Möglichkeit in einer Abfrage einer Datentabelle mit verschiednenen Spalten, das Ergebnis mit Distinct() auf nur eine Spalte festzulegen? Bei SQL geht das ja.
Hier mal meine Abfrage:
tblMvxMhnPln.Select("Maschine = '" + e.Row["Maschine"] + "' AND Maschinenplanung ≥ " + orgPositionBelegung, "Maschinenplanung", DataViewRowState.Unchanged).Select(x => x["Auftragsnr"]).Distinct( "Hier sollte die Spalte "Auftragsnummer" überwacht werden)
Vermutlich wird nichts geben, da muss ich mir halt eine Methode frickeln.
Hallo, die Daten kommen aus eine gespeicherten Prozedur vom SQL-Server wo ich nicht dran komm (bis jetzt halt noch nicht).
Ich lade die Daten in ein DataSet. Habe die Sortierung vorgezogen, hilft aber nicht viel.
Sollte mal vielleicht doch PLinQ testen, habe mit dem aber noch nie gearbeitet.
Hallo, fogendes Paoblem. Habe Daten in ein DataSet eingelesen.
EIne Tabelle muss ich noch eine BErechnung durchführen, wie lange der Datensatz schon liegt. In dieser Tabelle liegen Aufträge, mit ihren ganzen Arbeitgängen. das heißt: Der Auftrag mit der AUftragsnummer xxx ist z.B. 10 x drin, da es 10 Arbeitsgänge gibt (1. BEarbeitung auf Maschine A, 2. Bearbeitung auf Maschine B ...). Der Datensatz hat dann noch ein Meldedatum, wann er an welcher Maschine war. Nun sollte ich hier noch verstrichenen Tage berechnen, von heute bis zur letzten Bearbeitung der Auftragsnummer. Somit müßte ich jede Auftragsnummer durchlaufen und dann noch alle Arbeitsgänge dieser Auftragsnummer und das größte Datum suchen (ist nach Format yyyyMMdd abgelegt).
Wie mache ihc das in LinQ. Ich hoffe da auf mehr Performance, denn in dieser Tabelle sind 70000 Datensätze.
Ich habe hier mal ein Beispiel. Wenn ich das unten einblende, mit dem .Max()-Auswertung bekomme ich folgenden Fehler: "At least one object must implement IComparable."
Hier mal der Code:
//// Alle Auftragsnummern erstmal vereinzeln (Distinct, und Meldedatum muss ein Datum enthalten)
var auftragsnummerListe = dataTable.AsEnumerable().OrderBy(order=>order["Auftragsnr"]).Where(x => x["Meldedatum"].ToString() != "0").Select(x => x["Auftragsnr"]).Distinct();
for (int j = 0; j < auftragsnummerListe.Count(); j++)
{
//// Auftragsnummer in Variable speichern
decimal auftragsNummer = Convert.ToDecimal(auftragsnummerListe.AsEnumerable().ToArray()[j]);
//// Auftrag mit der Auftragsnummer suchen, welche den größten Datumswert hat. Wie Mache ich das?
var auftrag = dataTable.AsEnumerable().Where(x => x.Field<decimal>("Auftragsnr") == auftragsNummer)
.Select(order => new
{
Auftragsnummer = order["Auftragsnr"],
Arbeitsgang = order["Arbeitsgang"],
Meldedatum = order["Meldedatum"]
}); // .Max(c => new { c.Meldedatum }); //==> Wenn ich das einblende, kommt die Meldung "At least one object must implement IComparable."
}
Kann mir da jemand helfen, wie ich das bei LinQ mit dem IComparable mache?