Laden...
O
oehrle myCSharp.de - Member
E-Technik Germany Dabei seit 08.06.2009 461 Beiträge
Benutzerbeschreibung

Forenbeiträge von oehrle Ingesamt 461 Beiträge

09.02.2024 - 09:26 Uhr

Ok, ja.

Die IT hat sich heute morgen schon offenbart, es wird eine weiter ADirectory geben, dann kann das so weiterlaufen wie bisher.

08.02.2024 - 17:43 Uhr

Hallo Abt, danke für die Info. Aber Prizipiell wird das in die Richtung mit dem Webservice gehen? Ich meine, ist da die Berechtigungseinschränkung weniger restriktiv?

Beim Webservice brauche ich ja definitiv immer zwei Seiten, den Client und den Server. Die Terminals wären die Clients .... das heißt dann ich bräuchte noch eine Serverfunktionalität mit ASP oder dergleichen .... korrekt? Über Commands muss ich dann etwas beim Server antriggern ...

Da fällt mir ein, so etwas könnte man dann auch per MQTT oder OPC-UA steuern, wobei MQTT ja keine Datein versendet ...

08.02.2024 - 13:14 Uhr

Hallo zusammen, manche werden schon die Stirn runzeln, wenn sie schon die Überschrift lesen.

Aber der Reihe nach, ich fasse mal zusammen. In unserer Firma (gehört zu einem Konzern), sind alle Mitarbeiter-PC' in der Domäne eingegliedert, habe somit Berechtigung auf unsrere Server, je nachdem was für die User konfiguriert ist.

Jetzt haben wir auch noch Windows-Terminals, die sind nicht in der Domäne (oder jedenfalls nicht der angemeldete User), somit haben diese Terminals nun auf bestimmte Netzwerkbereiche keinen Zugriff. Diese Terminals sind für die Auftragswerfassung nötig. Dafür habe ich auch eine Applikation geschrieben, die aus dieser Auftragssoftware heraus angesprochen werden kann. Es wird eine ausführbare "EXE-Datei"  mit Übergabeparameter gestartet, damit werden einmal gewisse Dinge in SAP geprüft, zum anderen werden aber auch PDF-Dateien zum Auftrag geprüft, und wenn diese vorhanden sind werden diese angezeigt.

Und hier ist jetzt mein Problem. Diese Netzwerkressource auf der diese PDF's abgelegt werden, wurde vor einer Woche ersetzt, weil diese nicht mehr den aktuellen Richtinien entsprochen hat, somit sind jetzt auch die Rechte "futsch".

Nun muss ich mir überlegen wie man das allgemein für diese Terminals wieder zum Rennen bekommt. Es soll auch eine kostengünstige uns ressourcenschonende Möglichkeit sein (Geräte sind noch gut), eventuell dann auch für spätere Transfers zu verwenden.

Folgende dinge habe ich schon angedacht, aber ich bin in der Abwägung was das beste, schnellste, einfachsteist zuweit weg weil ich die Erfahrung damit nciht habe. Hier mal Punkte, was ich mir gedacht habe:

  • Gibt es einen WebService oder kann man das relativ leicht selber machen, mit dem ich Dateien aus einem Verzeichnis erfassen und lesen kann, ohne dass der angemeldete User von dem Terminal Zugriff auf den Netzwerkbereich hat (Netzlaufwerk) ?? Gibt es da schon fertige DLL's die ich in C# verwenden kann? Eventuell wäre das auch eine Lösung für Maschinen die noch mit einem alten Betriebssystem arbeiten, um Dateien auszutauschen ??

  • Impersonation, ich weiss nicht ob das aus der Anwendung heraus funktionieren kann, wenn man für die Auswertung der PDF-Dateien und das anzeigen der PDF's im Code einen anderen user vorschaltet, der in der Konzerndomäne bekannt ist ??

  • Eine ausführbare Datei oder Batch mit den Argumenten die notwendig sind aufrufen. Die Batch müßte dann auch mit einem User arbeiten, welcher der Konzernsomäne bekannt ist. Wäre so etwas möglich?

  • Sonstige Ideen von euch ??

Ihr seht, ich bin mir sehr unschlüssig was ich genau machen soll oder was allgemein die beste oder alltagstaugliche Lösung wäre.

Bin jetzt echt etwas am Boden, denn diese bisherige Lösung hatte ich vor zwei Jahren mit diesen Kollegen erstellt, und jetzt das ...

09.01.2024 - 14:06 Uhr

Ja, du hast recht. Das veranschaulicht das ganze erst so richtig. Das hatte ich mir vor 4 Tagen auch gedacht, als ich nochmals dran ging. Ich danke dir / euch für eure sehr Gute Hilfe. Eventuell kommeich nochmal auf euch zurück, während meinem Projekt.

09.01.2024 - 13:37 Uhr

AAAAAhhhhhh, jetzt hab ichs geschnallt. In den zusammengestückelten Daten vom feld "Anschnittscheibe" waren total andere SapNummern drin wie da überhaupt eingetragen werden dürfen.

Trage ich die richtigen ein, dann klappt das ganze🙈🙈

09.01.2024 - 11:21 Uhr

Hallo, ich vermute jetzt dass der Zusammenhang der Datentabellen nicht richtig nachvollzogen werden kann, oder ich versteh es nicht, aber ich versuche den Zusammenhang nochmal zu erklären.

Ich fang erst mal so an. Es gibt im Datengemenge zwei Tabellen, die müssen zu einer gemeinsamen Tabelle gestrickt werden. Das sind folgende zwei Tabellen (aus denen wird ein "Hauptansichtstabelle" ==> WerkzeugProgramminfo-Tabelle generiert. Der Bezug zueinander, damit die Daten zusammenfinden können und was genau zusammen passt, ist die Spalte "SapMaterial", jede der beiden Tabelle besitzt diese Spalte (fungiert genaugenommen als Schlüssel).

Hier dann nochmal die Struktur der beiden Tabellen, die zu einer gemeinsamen Tabelle zusammengefügt werden (wie ich das mache dieht man ja im Code, denke das wird hier auch nicht ausschlaggebend sein):

   //// Tabellenstruktur "Programminfo" erstellen
   TblProgramminfo = new DataTable("Programminfo");

   TblProgramminfo.Columns.Add(new DataColumn() { ColumnName = "SapMaterial", DataType = typeof(string) });
   TblProgramminfo.Columns.Add(new DataColumn() { ColumnName = "Anschnittscheibe", DataType = typeof(string) });
   TblProgramminfo.Columns.Add(new DataColumn() { ColumnName = "RohlingErstellt", DataType = typeof(Boolean) });
   TblProgramminfo.Columns.Add(new DataColumn() { ColumnName = "PdfLaderErstellt", DataType = typeof(Boolean) });
   
   //// Tabellenstruktur "Werkzeugdaten" erstellen
   TblWerkzeugdaten = new DataTable("Werkzeugdaten");
   TblWerkzeugdaten.Columns.Add(new DataColumn() { ColumnName = "ID",  AutoIncrement = true, AutoIncrementSeed = 1, AutoIncrementStep = 1 });
   TblWerkzeugdaten.Columns.Add(new DataColumn() { ColumnName = "SapMaterial", DataType = typeof(string) });
   TblWerkzeugdaten.Columns.Add(new DataColumn() { ColumnName = "Nenndurchmesser", DataType = typeof(Single) });
   TblWerkzeugdaten.Columns.Add(new DataColumn() { ColumnName = "Schaftdurchmesser", DataType = typeof(Single) });
   TblWerkzeugdaten.Columns.Add(new DataColumn() { ColumnName = "Schneidenlaenge", DataType = typeof(Single) });
   TblWerkzeugdaten.Columns.Add(new DataColumn() { ColumnName = "HalsVorhanden", DataType = typeof(Boolean) });
   

Die fertige Tabelle mit den Daten sieht dann so aus, wie im Bild in WerkzeugProgramminfo-Tabelle_06.jpg

Diese Tabelle muss angezeigt werden, jetzt kommt das ABER:

Sie Spalte "Anschnittscheibe" muss als DataGridComboboxColumn gesetzt werden, denn sie soll aus der Scheibentabelle (das sind Schleifscheiben die ausgewählt werden können) die Schleifscheiben in den ComboBoxItems vorhalten, die ausgewählt werden können. Ich sage bewusst "ausgewählt werden können". Ist bei einem Datensatz der angezeigt wird, das Feld "Anschnittscheibe" nicht belegt (also leer), somit sieht der User das er hier noch eine SAP-Nummer zuweisen muss (siehe im Bild der Datensatz mit ID=8)

Habe ich das ganze nun besser erklärt, oder verstehe ich die Frage falsch?

09.01.2024 - 08:37 Uhr

Hallo, ich habe das Beispiel nun mal auf aufgebaut wie es bei mir dann in der Realität aussieht, natürlcih habe ich noch viel mehr Spalten, aber das sollte nachher nicht das Problem sein.

Ich denke das Problem liegt daran, dass ich aus zwei Tabellen eine Tabelle forme, welche die Daten der beiden Tabellen hält (soll ja die Hauptübersicht aus dem Datengemenge ein).

Sobald ich das mache, funktioniert die Bindung an das Feld "Anschnittscheibe" nicht mehr, die ComboBox-Items sind immer noch da.

Kann mir jemand sagen, an was es liegt? Muss ich an dem BindigExpression etwas ändern? Anbei noch der Code als ZIP (zuviele Zeichen!!) und ein Bild ...

Bin für jeden Tipp dankbar.

Code Behind (nur ein Ausschnitt), der Rest in der ZIP als Projekt:



 /* ==============================================================================================================================*/


        public MainWindow_03()
        {
            InitializeComponent();


            //// Tabellenstruktur "Werkzeugdaten" erstellen
            TblWerkzeugdaten = new DataTable("");
            TblWerkzeugdaten.Columns.Add(new DataColumn() { ColumnName = "ID",  AutoIncrement = true, AutoIncrementSeed = 1, AutoIncrementStep = 1 });
            TblWerkzeugdaten.Columns.Add(new DataColumn() { ColumnName = "SapMaterial", DataType = typeof(string) });
            TblWerkzeugdaten.Columns.Add(new DataColumn() { ColumnName = "Nenndurchmesser", DataType = typeof(Single) });
            TblWerkzeugdaten.Columns.Add(new DataColumn() { ColumnName = "Schaftdurchmesser", DataType = typeof(Single) });
            TblWerkzeugdaten.Columns.Add(new DataColumn() { ColumnName = "Schneidenlaenge", DataType = typeof(Single) });
            TblWerkzeugdaten.Columns.Add(new DataColumn() { ColumnName = "HalsVorhanden", DataType = typeof(Boolean) });

            //// "Werkzeugdaten" Datensätze manuell zuweisen
            TblWerkzeugdaten.Rows.Add(new object[] { null,  "5075777", 3.2, 3.5, 9, true });
            TblWerkzeugdaten.Rows.Add(new object[] { null, "5075777", 3.9, 3.6, 9, true });
            TblWerkzeugdaten.Rows.Add(new object[] { null, "5075777", 3.95, 3.7, 9, true });
            TblWerkzeugdaten.Rows.Add(new object[] { null, "5075777", 4.0, 3.5, 12.2, true });
            TblWerkzeugdaten.Rows.Add(new object[] { null, "5075777", 4.5, 3.9, 12.5, true });
            TblWerkzeugdaten.Rows.Add(new object[] { null, "5075777", 4.8, 3.95, 15.1, true });
            TblWerkzeugdaten.Rows.Add(new object[] { null, "5075999", 14.5, 13.9, 12.5, false });
            TblWerkzeugdaten.Rows.Add(new object[] { null, "5075999", 14.8, 13.95, 15.1, true });




            //// Tabellenstruktur "Programminfo" erstellen
            TblProgramminfo = new DataTable("");
            //tblProgramminfo.Columns.Add(new DataColumn() { ColumnName = "ID", AutoIncrement = true, AutoIncrementSeed = 1, AutoIncrementStep = 1 });
            TblProgramminfo.Columns.Add(new DataColumn() { ColumnName = "SapMaterial", DataType = typeof(string) });
            TblProgramminfo.Columns.Add(new DataColumn() { ColumnName = "Anschnittscheibe", DataType = typeof(string) });
            TblProgramminfo.Columns.Add(new DataColumn() { ColumnName = "RohlingErstellt", DataType = typeof(Boolean) });
            TblProgramminfo.Columns.Add(new DataColumn() { ColumnName = "PdfLaderErstellt", DataType = typeof(Boolean) });

            //// Der Tabelle Programminfo ein Datensatz zuweisen
            TblProgramminfo.Rows.Add(new object[] { "5075777", "7778888", false, true });
            TblProgramminfo.Rows.Add(new object[] { "5075999", "8889999", false, true });


            //// Gedamte Tabelle organisieren: Alle Spalten der Tabelle Programminfo in die Haupttabelle überführen
            TblWerkzeugProgramminfo = TblWerkzeugdaten.Copy();
            foreach(DataColumn dtCol in TblProgramminfo.Columns)
            {
                if (!TblWerkzeugProgramminfo.Columns.Contains(dtCol.ColumnName))
                    TblWerkzeugProgramminfo.Columns.Add(new DataColumn() { ColumnName = dtCol.ColumnName, DataType = dtCol.DataType});
                
            }


            //// Die Daten der beiden Tabellen "Werkzeugdaten" und "Programminfo" programmatisch zusammenführen (Tabelle "WerkzeugProgrammminfo" mit Daten bestücken)
            foreach(DataRow rowWerkzeugProgramminfo in TblWerkzeugProgramminfo.Rows)
            {
                //// Über die SapMaterialspalte werden beide Tabellen abgeglichen
                string sapMaterial = rowWerkzeugProgramminfo["SapMaterial"].ToString();

                //// Datensatz aus der Tabelle "Programminfo" erfragen, ob es einen Datensatz mit der "SapMaterial" - Nummer gibt, wenn ja dann müssen diese Daten im aktuellen Datensatz eingefügt werden
                DataRow rowProgramminfo = TblProgramminfo.AsEnumerable().Where(x => x["SapMaterial"].ToString().Trim() == sapMaterial).FirstOrDefault();

                //// Über den Spaltennamen den Ableich der Daten durchführen
                if (rowProgramminfo != null)
                {
                    foreach (DataColumn dtColProgramminfo in TblProgramminfo.Columns)
                        rowWerkzeugProgramminfo[dtColProgramminfo.ColumnName] = rowProgramminfo[dtColProgramminfo.ColumnName];
                }
            }



            //// Tabellenstruktur "Scheibentabelle" erstellen
            TblScheibendaten = new DataTable("Scheibendaten");
            TblScheibendaten.Columns.Add(new DataColumn() { ColumnName = "SAP-Nummer", DataType = typeof(string) });
            TblScheibendaten.Columns.Add(new DataColumn() { ColumnName = "Abmessung", DataType = typeof(string) });
            TblScheibendaten.Columns.Add(new DataColumn() { ColumnName = "Standard", DataType = typeof(string) });
            TblScheibendaten.Columns.Add(new DataColumn() { ColumnName = "Anwendung", DataType = typeof(string) });

            TblScheibendaten.Rows.Add(new object[] { "8318555", "250x16x76,2", "Schneid-Formend", "Anschnitt / Fuehren"});
            TblScheibendaten.Rows.Add(new object[] { "8318556", "250x16x76,2", "Schneid-Formend", "Anschnitt / Fuehren" });
            TblScheibendaten.Rows.Add(new object[] { "8318557", "250x16x76,2", "Schneid-Formend", "Anschnitt / Fuehren" });


            //// Bringt hier nichts, dachte eventuell ...
            //TblWerkzeugProgramminfo.AcceptChanges();


            //// Gemeinsame  Datentabelle "WErkzeugProgramminfo" dem DataGrid mit der DataGridComboBoxColumn anbinden
            dg_Daten.ItemsSource = TblWerkzeugProgramminfo.AsDataView();

            //// Zur Übersicht die gemeinsame Datentabelle noch in einem eigenen DataGrid anzeigen, zur Kontrolle der Vollständigkeit
            dg_DatenOhneComboBox.ItemsSource = TblWerkzeugProgramminfo.AsDataView();

        }

 /* ==============================================================================================================================*/

        private void dg_Daten_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            if(e.Column.Header.ToString() == "Anschnittscheibe")
            {
                e.Column = new DataGridComboBoxColumn
                {
                    Header = "Anschnittscheibe",
                    ItemsSource = TblScheibendaten.AsDataView(),
                    DisplayMemberPath = "SAP-Nummer",
                    
                    //// ==> Lasse ich das frei, klappt die ITEMS-Bindung trotzdem
                    SelectedValuePath = "",
                    SelectedValueBinding = new Binding("Anschnittscheibe") { UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged },
                };
            }
        }

        /* ==============================================================================================================================*/

    }
}
08.01.2024 - 08:22 Uhr

Danke, BlonderHans, dein Beispiel funktioniert so. Dann habe ich das bei mir so vereinfacht über die SQL-Datentabellen die ich als Datenquelle habe aufgebaut, ohne die ID - Spalte bei der Automobil und Farbtabelle. Da hatte ich das Problem beim der DataGridColumBox mit dem SelectedValuePath = nameof( LackierungLookup.Id ), weil es diese ID-Spalte nicht gibt.

Habe dann DisplayMemberpath + SelectedValuePath  einfach auf das gleiche Feld gerichtet, dann es es erst mal funktioniert ... habe unten den Code wie das aussieht ...

                /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private  DataTable tblAutomobil;
        private DataTable tblFarbe;

        public MainWindow()
        {
            InitializeComponent();


            //// Tabellenstruktur "Automobiltabelle" erstellen
            tblAutomobil = new DataTable("Automobil");
            tblAutomobil.Columns.Add(new DataColumn() { ColumnName = "ID",  AutoIncrement = true, AutoIncrementSeed = 1, AutoIncrementStep = 1 });
            tblAutomobil.Columns.Add(new DataColumn() { ColumnName = "Hersteller", DataType = typeof(string) });
            tblAutomobil.Columns.Add(new DataColumn() { ColumnName = "Baujahr", DataType = typeof(string) });
            tblAutomobil.Columns.Add(new DataColumn() { ColumnName = "Lackfarbe", DataType = typeof(string) });
            tblAutomobil.Columns.Add(new DataColumn() { ColumnName = "Kilometerstand", DataType = typeof(string) });

            //// "Automobiltabelle" Datensätze manuell zuweisen
            tblAutomobil.Rows.Add(new object[] { null,  "VW", "2015", "Blau", "50000" });
            tblAutomobil.Rows.Add(new object[] { null, "BMW", "2012", "Grau", "100000" });
            tblAutomobil.Rows.Add(new object[] { null, "BMW", "2019", "Schwarz", "30000" });
            tblAutomobil.Rows.Add(new object[] { null, "Mercedes", "2018", "Weiss", "40000" });
            tblAutomobil.Rows.Add(new object[] { null, "OPEL", "2020", "Silber", "50000" });
            tblAutomobil.Rows.Add(new object[] { null, "VW", "2021", "", "50000" });

            //// Tabellenstruktur "Farbtabelle" erstellen
            tblFarbe = new DataTable("Farbe");
            tblFarbe.Columns.Add(new DataColumn() { ColumnName = "Farbe", DataType = typeof(string) });
            tblFarbe.Columns.Add(new DataColumn() { ColumnName = "Farbzusatz", DataType = typeof(string) });
            tblFarbe.Columns.Add(new DataColumn() { ColumnName = "Pigmentierung", DataType = typeof(string) });

            tblFarbe.Rows.Add(new object[] { "Blau", "Alkyd", "leicht" });
            tblFarbe.Rows.Add(new object[] { "Grau", "Alkyd", "leicht" });
            tblFarbe.Rows.Add(new object[] { "Schwarz", "Polyacryl", "nein" });
            tblFarbe.Rows.Add(new object[] { "Weiss", "Polyacryl", "nein" });
            tblFarbe.Rows.Add(new object[] { "Silber", "Alkyd", "nein" });

            dg_Daten.ItemsSource = tblAutomobil.AsDataView();

        }

        /* ========================================================================================================================================================================*/

        private void dg_Daten_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {

            if(e.Column.Header.ToString() == "Lackfarbe")
            {
                e.Column = new DataGridComboBoxColumn
                {
                    Header = "Lackfarbe",
                    ItemsSource = tblFarbe.AsDataView(),
                    DisplayMemberPath = "Farbe",
                    
                    //// ==> Hier habe ich dann auch "Farbe" gesetz, ansonsten funktioniert das nicht
                    SelectedValuePath = "Farbe",
                    SelectedValueBinding = new Binding("Lackfarbe") { UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged },
                };
            }





        }
        /* ========================================================================================================================================================================*/
    }
}

Das ganze funktioniert noch nicht wenn ich das auf mein reeles Problem beziehe, da habe ich das ganze auch schon ausprobiert. Dort ist es allerdings so, das ich zwei Tabellen sozusagen zusammenvereine, aber nicht direkt schon mit "JOIN" in SQL verknüpfe, sonder das im Code mache. Eventuell liegt das Problem da, ich brauche da noch etwas Zeit um das nochmal genau zu analysieren und daran zu tüfteln / verändern. Ich melde mich mit dem konkreten Problem, aber zuerst möchte ich mich noch selber etwas mehr damit auseinandersetzen, das Problem dann auch mit vereinfachtem Code aufbauen damit ich das dann auch einfach und Übersichtlich in das Forum stellen kann.

Ich möchte euch jedenfalls erst mal schon für eure Hilfe und Mühe danken.

06.01.2024 - 09:43 Uhr

Sorry, nochmal zum Verständis zum vorgen Post von BlonderHans:

Muss nochmal erklären wie das ganze funktionieren oder aussehen soll. Ich probiere das nochmal ganz einfach anhand von zwei Datentabellen.

Tabelle "Automobildaten". Diese hätte 5 Spalten (Hersteller, Baujahr, Lackfarbe, Kilometerstand).

Hersteller Baujahr Lackfarbe Kilometerstand
VW 2015 Blau 50000
BMW 2012 Grau 100000
BMW 2019 Schwarz 30000
MERCEDES 2018 Weiss 40000
OPEL 2020 Silber 50000

Dann gibt es die Tabelle "Karosseriefarbe" mit den Spalten (Farbe, Farbzusatz, Pigmentierung) :

Farbe Farbzusatz Pigmentierung
Blau Alkyd leicht
Grau Alkyd leicht
Schwarz Polyacryl nein
Weiss Polyacryl nein
Silber Alkyd leicht

Jetzt will ich diese Tabelle Automobildaten in einem DataGrid anzeigen lassen. Die Spalte Lackfarbe soll eine DataGridComboBox sein, damit ich in dieser die Items der Tabellenspalte Karosseriefarbe.Farbe anzeigen kann.

Jetzt kommt das ABER wo ich mit nicht sicher bin ob ihr mich korrekt verstanden habt:

Ist die Tabelle "Automobildaten" geladen und die Daten werden im DataGrid angezeigt, dann soll in der Spalte "Lackfarbe" die diese gespeicherten Werte dieser Tabelle angezeigt werden. Die Items der DataGridComboBox werden poppen erst auf, wenn ich auf eines dieser Control der Spalte "Lackfarbe" klicke.

Was möchte ichmit diesem Szenarion erreichen ==> Neue Datensätze die angezeigt werden und noch keine Festlegung von "Lackfarbe" haben, können somit vom User über die DataGridComboBox mit Daten bestückt werden. Der User sieht auch sofort, wo noch Daten nachzutragen sind.

05.01.2024 - 23:40 Uhr

Hallo TH69, habe nochmals die Variante von dir als auch von BlonderHans geprüft. Beides mal bleibt die Textbox leer, aber die ComboBox-Items sind befüllt.

Ich habe auch mal nach der Erzeugung der Spalte mir ihren Eigenschadften angesehen (als DataView zugewisen). Die Spalten sind in der LinQ-Abfrage auch vorhanden, aber diese ComboBox-Items sind ja nicht das Problem, sondern der Spaltenwert der normal im Datensatz drin steht. Wenn ich mir diese View ansehe und die ItemSource vom DataGrid, dann passt das auch, in der Spalte "Anschnittscheibe" steht der Wert 7778888 drin, wird aber nicht angezeigt.

Kann es sein das wie an die TextBox der Spalte binden müssen??

Habe noch Bilder beigefügt, von der DataView der Items und dem Aussehen des DataGrids.

05.01.2024 - 15:13 Uhr

Hallo TH69, hier nochmal der Test zu:  https://mycsharp.de/forum/posts/3841129

Mein Code:

            DataGridComboBoxColumn dgComboBoxColAnschnittscheibe = new DataGridComboBoxColumn()
            {
                    Header = "Anschnittscheibe",
                    Width = new DataGridLength(150),

                    //// Nur die definierten Scheibennummern aus der Scheibentabelle dürfen bei "Anschnittscheibe" verwendet werden ==> jetzt mal als List
                   
                    ItemsSource = new List<string>{"0815", "0816", "4711" },
    
                    //// Tipp von TH69:
                    DisplayMemberPath = "SAP-Nummer",
                    SelectedValueBinding = new Binding("Anschnittscheibe"), // <-- der Name der Spalte in "VereinteDatentabelle"
                    SelectedValuePath = "SAP-Nummer",


                    DisplayIndex = 2

                };
                //// Zuweisen der ComboBox an die DataGrid-Spalte
                e.Column = dgComboBoxColAnschnittscheibe;
            }

Es scheint so erst mal nicht zu funktionieren, aber so hast du das gemeint, korrekt?

Die gedamte Datentabelle übergebe ich der dem DateGrid das die gesamten Daten visualisiert:

DataGrid_VereinteDaten.ItemsSource = Datenabfrage.VereinteDatentabelle.AsDataView();

Das müßte dann so passen.

Das Ergebnis liegt als Bild bei, auch nochmal das Bild wie es aussehen sollte mit den Verbindungen der beiden Tabellen.

Bin um weitere Hilfe dankbar.

05.01.2024 - 10:31 Uhr

Hallo, das sollte auf mich zutreffen: https://stackoverflow.com/questions/5517789/binding-a-wpf-datagridcomboboxcolumn-with-mvvm

Meine Frage, wie setze ich die Bindungen genau in Code beihind um, kann mir das jemand erklären?

Ich habe mal soweit probiert, aber die Bindungen die zum einen im <ElementStyle> und im <EditElementStyle>  gemacht werden, wie setze ich diese um?

Hier der bisherige Code mit Beschreibung;

if (e.Column.Header.ToString() == "Anschnittscheibe")
{

    //// Test neu ....

    //// DataGridComboBoxColumn - Instanz generieren, damit diese dann wie in XAML definiert werden kann ...
    DataGridComboBoxColumn dgColBox = new DataGridComboBoxColumn();

    //// <DataGridComboBoxColumn.ElementStyle> - in Code behind dedinieren
    //// Erste Variante geht nicht, da sealed .... deshalb mal die zweite Variante
    //dgColBox.EditingElementStyle.TargetType = typeof(ComboBox);
    dgColBox.EditingElementStyle = new Style(typeof(ComboBox));

    //// ==> Wie mache ich hier die Datenbindung (oder ist das von mir soweit korrekt) in CodeBehind für: 
    //<DataGridComboBoxColumn.ElementStyle>
    //    < Style TargetType = "ComboBox" >
    //        < Setter Property = "ItemsSource" Value = "{Binding RelativeSource={RelativeSource FindAncestor, 
    	AncestorType={x:Type Window}}, Path=DataContext.Titles}" />
    //    </ Style >
    //</ DataGridComboBoxColumn.ElementStyle >

    //// Datenbindung der Items welche in der ComboBox ausgewählt werden sollen können
    dgColBox.ItemsSource = Datenabfrage.Tbl_Schleifscheiben.AsEnumerable()
    	.Where(x => x["Anwendung"].ToString().StartsWith("anschnitt", StringComparison.CurrentCultureIgnoreCase)).AsDataView();



    //// <DataGridComboBoxColumn.EditingElementStyle> - in Code behind dedinieren
    //// Erste Variante geht nicht, da sealed .... deshalb mal die zweite Variante
    //dgColBox.EditingElementStyle.TargetType = typeof(ComboBox);
    dgColBox.EditingElementStyle = new Style(typeof(ComboBox));


    //// ==> Wie mache ich hier die Datenbindung in CodeBehind für: 
    //< DataGridComboBoxColumn.EditingElementStyle >
    //    < Style TargetType = "ComboBox" >
    //        < Setter Property = "ItemsSource" Value = "{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.Titles}" />
    //    </ Style >
    //</ DataGridComboBoxColumn.EditingElementStyle >


    //// Instanz der DataGridComboBoxColumn dem DataGrid zuweisen
    e.Column = dgColBox;

}	

Anbei noch ein Bild, wie es aktuell aussieht

03.01.2024 - 09:33 Uhr

MVVM habe ich bisher noch nie genutzt, werde ich aber früher oder später nicht scheuen können. Was mich bisher an den Beispielen abschreckt , dass die Oberfläche mit den Controls immer statisch aufgebaut ist. Ich entscheide oft über die Daten welche Spalten werden zur ComboBox, muss eine Spalte eingefärbt werden, wird diese Spalte überhaupt gebraucht (muss diese visualisiert werden) ....

Deshalb habe ich das bisher immer im Code behind geregelt.

Aber eigentlich müßte das alles auch funktionieren, denn mit AutgenerateColumns könnte ich das selber steuern. Dann müßte ich die Bindings in code behind machen. Da fehlt mir noch etwas der Durchblick.

Aktuelle bin ich auf der Suche wie ich das DataGridTemplate für die TextBox mit integriertet ComboBox mache.

Danke für die Informationen von dir, das werde ich mal vesuchen, auf Google habe ich auch schon etwas gefunden (FrameWorkElementFactory in code behind). Mal sehen ob ich da weiter komme.

03.01.2024 - 08:11 Uhr

Ja, danke. Scheint mir nun auch so, hatte die Tage beim googeln auch schon so was gesehen.

Denke das ist der Weg, da gibt es zwei Templates (DataTemplate und und DateEditTemplate), das werde ich beides nutzen müssen. DataTemplate für die Anzeige des vorhandenen belgten Wertes aus den Daten die gespeichert sind, DateEditTemplate als ComboBox-Auswahlkriterium.

Das ganze muss ich im Code behind machen, da diese Visualisierung sehr dynamisch ist, je nachdem welche Datentbellen angebunden werden. Eventuell hat jemand schon so etwas gemacht.

02.01.2024 - 21:24 Uhr

Hi, habe das gerade überprüft.

Ne, der definierte Wert von Anschnittscheibe wird nicht angezeigt, bleibt leer. Eigentlich müßte da der Wert 7778888 angzeigt werden.

Die Auswahlitems sind korrekt belegt.

02.01.2024 - 14:11 Uhr

Hallo Th69, danke für die Hilfe.
Ich habe gestern mal noch getestet, bin aber leider nicht zum Erfolg durchgestiegen. Ich habe das ganze mal in einem Bild zusammengestellt, welche Tabellen es gibt und wie sich diese mit welchen Daten zusammenstzen.

Hier mal zuerst ein Überblick wie sich die Daten zusammenstellen:

  • Es gibt zwei Tabellen, aus denen wird eine vereinte Tabelle generiert (Werkzeugdatentabelle + Programminfotabelle).

In der Programminfotabelle wird auch der Wert der Tabellenspalte "Anschnittscheibe" gespeichert. Dieser Wert soll nach der Initialisierung der Daten unter anderem für jeden Datensatz in der DataGridComboBoxColumn angezeigt werden (also der gespeicherte Inhalt von diesem Datensatz).

Es kann aber auch neue Datensätze geben, da ist dieser Wert noch nicht belegt, da muss dann der User aus der vorgegebenen Auswahlmöglichkeit der DataGridComboBox den Wert auswählen, somit wird dieser Wert dem Datensatz zugewiesen.

  • Diese Datenauswahlmöglichkeiten (Items) welche der DateGridComboBox zugewiesen werden, kommen aus der Scheibendatentabelle. Aus dieser soll dann das Datenfeld "SAP-Nummer" angebunden werden.

Über den Ablauf, Dateninitialisierung:

  • Zuerst wird die Scheibentabelle eingelesen
  • Werkzeugdatentabelle einlesen
  • Programminfotabelle einlesen
  • Vereinte Datentabelle von Werkzeug- und Programminfotabelle erstellen

Datenbindung  und :

  • Dem DataGrid die ItemsSource zuweisen
 DataGrid_VereinteDaten.ItemsSource = Datenabfrage.VereinteDatentabelle.AsDataView();
  • AutoGeneratingColumn = true gesetzt, somit wird jede Spalte im Event untersucht, bis ich feststelle dass die Spalte "Anschnittscheibe" verarbeitet wird, und diese Spalte im CodeBehind modifizieren (DataGridComboBoxColumn festlegen, hier sollte auch die Zuweisung der Daten gemacht werden):
        private void DataGrid_Filterergebnisse_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            if (e.Column.Header.ToString() == "Anschnittscheibe")
            {
                 DataGridComboBoxColumn dgComboBoxColAnschnittscheibe = new DataGridComboBoxColumn()
                {
                   

                    Header = "Anschnittscheibe",
                    Width = new DataGridLength(150),
                    
                    //// Nur die definierten Scheibennummern aus der Scheibentabelle dürfen bei "Anschnittscheibe" verwendet werden
                    ItemsSource = Datenabfrage.Tbl_Schleifscheiben.AsEnumerable().Where(x => x["Anwendung"].ToString().StartsWith("anschnitt", StringComparison.CurrentCultureIgnoreCase)).AsDataView(),
                    
                    //// Das anzuzeigende Feld der Datentabelle
                    DisplayMemberPath = "SAP-Nummer",
                    
                    //SelectedItemBinding,
                    //SelectedValueBinding,
                    SelectedValuePath = "SapMaterial",

                    DisplayIndex = 2

                };
                //// Zuweisen der ComboBox an die DataGrid-Spalte
                e.Column = dgComboBoxColAnschnittscheibe;
            }
        }

Aktuelle Situation:

  • Das Feld "Anschnittscheibe" wird im DataGrid nicht mit dem aktuell gespeicherten Wert versorgt, es bleibt leer. Nur wenn ich etwas auswählen möchte, dann werden die Auswahlmöglcihkeiten angezeigt.

Wie binde ich das nun genau, oder besteht diese Möglichkeit die ich haben möchte etwa gar nicht?

Aktuell mache ich das gesamt im Codebehind, das sollte doch für diese Möglichkeit machbar sein ??

29.12.2023 - 11:25 Uhr

Also, die DataGridComboBoxColumnhaben alle die gleiche Datenquelle (nenne das mal Primärdatenquelle) wie die anderen Spalten vom DataGrid.  Jeder Datensatz im DataGrid der angezeigt wird zeigt diese Daten an, die Spalten mit den DataGridComboBoxColumnzeigen auch die Daten an.

Aber die Auswahlkriterien derDataGridComboBoxColumn ist eine andere Datenquelle (Sql-Tabelle welche die auswählbaren Kriterien der ComboBox enthalten soll - ComboBoxItems).

Wäre das verständlicher ausgedrückt?

29.12.2023 - 09:05 Uhr

Verwendetes Datenbanksystem: MS-SQL

Hallo Communitiy, ich habe eine Anwendung in der Daten eine SQL-Tabelle in einem DataGrid (WPF) visualisiert werden. Dieses Grid hat aber noch noch zusätzliche Spalten die als DataGridComboboxColumn definiert sind. Standardmäßig zeigen diese Comboboxfelder das jeweils zugeordnete Datenfeld aus dem Datensatz der Haupttabelle an, sofern ein Wert vorhanden ist. Allerdings soll mit der ComboBox die Möglichkeit geschaffen werden, falls das Datenfeld noch nicht bestückt ist eine Auswahlmöglichkeit zu treffen, und somit den Datensatz vollständig zu bestücken.

Für die Auswahlmöglichkeit der DataGridComboboxColumn gibt es eine separate SQL-Tabelle mit den möglichen Daten (kann dann somit beliebig ohne codeänderung erweitert/angepasst werden).

Ist so etwas standardmäßig bei der ComboBox vorgesehen (vermute eher nicht) ??

Wäre folgende Vorgehensweise richtig:

  1. DataGridComboboxColumn bei AutoGeneratColumn per Binding mit dem Hauptsqltabellenfeld verknüpfen, damit aktiver Wert vom Datendatz angezeigt wird
  2. Soll der Wert der DataGridComboboxColumn verändert werden, auf MouseClick reagieren, dann die ItemsSource der DataGridComboboxColumn auf die Auswahltabelle richten, bis die Daten ausgewählt sind, Auswahltext speichern
  3. DataGridComboboxColumn wieder an die BindingSource der Hauptabelle binden, gespeicherten Wert in DataGridComboboxColumn eintragen

Klingt zwar unständlich, aber eine andere Möglichkeit sehe ich im Moment nicht ...

Seht ihr einen anderen Ansatz?

04.12.2023 - 08:05 Uhr

Hallo zusammen, ich mache mir gerade Gedanken, welches Framework aktuell für die weitere entwicklung auf Desktop-PC's (eventuell auch mobile Geräte wie Tablet / Smartphone Android / IOS) )die beste Kompatibilität bieten würde.

Ist das tatsächlich NET CORE ?

Was ich noch nicht begriffen habe, Net Standard, soll ja auch vile Mompatibilität geben, aber läuft ja bald die Unterstützung wieder aus? Ist NetCore die Erweiterung davon, oder was komplett anderes.

Ntürlich habe ich bisher in FW 4.0 viel Basismaterial erstellt. Da muss ich dann natürlich auch viel auf die neue Architektur umstellen.

Was macht am meisten für die Zukunft Sinn, oder würdet ihr empfehlen?

04.12.2023 - 07:56 Uhr

Hallo, kurze Info von mir, habe das gerade gesehen weil ich auf der Suche nach etwas war.

Mit Excel habe ich mich schon öfters herumgeägert, weil plötzlich mti dem Standard nichts mehr geht sobald es um 32 oder 64 bit geht, bei den PC's aber irgend ein Mischmasch installiert ist.

Ich habe dann das NPOI gefunden, dass kann auch noch das XLS-Format verarbeiten.

Google mal nach NPOI.

17.08.2023 - 08:32 Uhr

Hallo, ich habe vor längerem eine Applikation von mir erweitert, mit einer Datenaktualisierung die stündlich abgearbeitet wird.

Die Daten die ich anzeige, die sammle und organisiere ich alle in einer DataTable, diese Daten übergebe ich dann als DateView dem DataGrid.ItemSource.

So hat das bisher funktioniert, das alles funktioniert auch weiterhin, bis sich bei der DataTable neue Datensätze zufügen, dann bringt mir mein Syystem ein Fehler ==> "Sorting" is not allowed during an AddItem or EditItem transaction

Jetzt habe ich schon versucht das "Sorting" abzustellen, aber ich finde das nicht, wo ich das machen kann.

Das DataGrid ist in eine WPF-Window integriert, also nachdem ich die Daten in der DataTable nue aktualisiert habe, hänge ich diese da einfach neu an das DataGrid.

Hat jemand eine Idee?

19.06.2023 - 06:55 Uhr

Hallo nochmals, wie ist das denn mit dem FolderBrowserDialog() oder dem OpenFileDialog(), gibt es dafür auch etwas gleichwertiges?

Dafür hatte ich bisher auch nichts gefunden, alternativ ist es ja in der Win32-Lib.

14.04.2023 - 09:05 Uhr

Das wars, super und Danke für die Info.

14.04.2023 - 07:48 Uhr

Hallo, ich glaube ich stehe auf dem Schlauch. Ich entwickle gerade eine neue Appliaktion, und benutze .Net 7, bisher Framework 4.0.

Nun wollte ich den Cursor auf Cursors.Wait setzen, aber ich kann die Instanz vom Cursor sit gar nicht da.

//// Framework 4.x
Cursor = Cursors.Arrow;

Hat jemand einen Tipp für mich? habe schon gegoogelt, habe nichts finden können.

11.01.2023 - 09:32 Uhr

Ja T-Virus, wie so oft. man wird ins kalte Wasser geworfen und soll schnell damit umgehen und was rausholen können.

Was die Sache mit der MongoDB angeht, ich bin da Frischling, ich muss mich damit beschäftigen. Ich muss aus einem System die Daten auswerten, diese sind in einer MongoDB enthalten, aber es gibt von diesen Daten auch Endpoints (REST), die ich auch abgreifen kann (oder schon mache).

Jetzt muss ich mich damit erst mal zurechtifinden (Umgang / Aufbau), habe auch schon gesehen das in den Endpoints Daten fehlen, aber ich denke diese entstehen alle aus den Daten der MongoDB. Ich muss mich nun mal vortasten ...

10.01.2023 - 15:42 Uhr

Hallo, ich wollte erst mal alle Collections erfassen, aber da wird auch eine Exceptin geworfen, das muss mit der Userberechtigung zu tun haben.
Erst mal nichts desto trotz, ich habe in der Doku von dem Tool Angaben zu verschiedenen Entities gefunden, und mal eine ausprobiert, soweit klappt das.


#if true
                //// Geht noch ... Verbinden mit Datenbank
                var database = cMongoClient.GetDatabase("MTLINKi");


                //// Bekannte Collection erfassen
                var collection = database.GetCollection<BsonDocument>("Program_History");

#endif

Meine weitere Frage, wie kann ich denn dann durch diese collection iterieren, ich würde diese gerne als DataTable in einem DataGrid darstellen.
Dahinter verbirgt sich JSON, ist das korrekt?

10.01.2023 - 12:24 Uhr

Hallo, es war der falsche Port in der Firewall, so ein Schitt.
Aber jetzt bekomme ich die Verbindung, und die ListDataBaseNames().

Nun muss ich mal sehen wie ich da die Daten raus bekomme, probiere erst mal ...

10.01.2023 - 10:06 Uhr

Diese MEldung kommt nach dem Aufruf von:



                //// .... hier kommt dann Fehler 
                var testDatabases =  cMongoClient.ListDatabaseNames().ToList();

Fehlermeldung:
System.TimeoutException: "A timeout occurred after 30000ms selecting a server using CompositeServerSelector{ Selectors = MongoDB.Driver.MongoClient+AreSessionsSupportedServerSelector, LatencyLimitingServerSelector{ AllowedLatencyRange = 00:00:00.0150000 }, OperationsCountServerSelector }. Client view of cluster state is { ClusterId : "1", Type : "Unknown", State : "Disconnected", Servers : [{ ServerId: "{ ClusterId : 1, EndPoint : "10.38.143.27:27017" }", EndPoint: "10.38.143.27:27017", ReasonChanged: "Heartbeat", State: "Disconnected", ServerVersion: , TopologyVersion: , Type: "Unknown", HeartbeatException: "MongoDB.Driver.MongoConnectionException: An exception occurred while opening a connection to the server.
---> System.Net.Internals.SocketExceptionFactory+ExtendedSocketException (10060): A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. 10.38.143.27:27017
at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
at System.Net.Sockets.Socket.Connect(EndPoint remoteEP)
at MongoDB.Driver.Core.Connections.TcpStreamFactory.Connect(Socket socket, EndPoint endPoint, CancellationToken cancellationToken)
at MongoDB.Driver.Core.Connections.TcpStreamFactory.CreateStream(EndPoint endPoint, CancellationToken cancellationToken)
at MongoDB.Driver.Core.Connections.BinaryConnection.OpenHelper(CancellationToken cancellationToken)
--- End of inner exception stack trace ---
at MongoDB.Driver.Core.Connections.BinaryConnection.OpenHelper(CancellationToken cancellationToken)
at MongoDB.Driver.Core.Connections.BinaryConnection.Open(CancellationToken cancellationToken)
at MongoDB.Driver.Core.Servers.ServerMonitor.InitializeConnection(CancellationToken cancellationToken)
at MongoDB.Driver.Core.Servers.ServerMonitor.Heartbeat(CancellationToken cancellationToken)", LastHeartbeatTimestamp: "2023-01-10T09:02:09.0192194Z", LastUpdateTimestamp: "2023-01-10T09:02:09.0192200Z" }] }."

  • Eigentlich würde ich gerne die Struktur / Tabellen der Datenbank auslesen.
  • Wenn ich die datenbanken abfragen könnte, wäre das auch gut, aber n diesem Fall geht das ding auf die Bretter ...
09.01.2023 - 16:13 Uhr

Hallo, ich habe vor einem Monat ein Datentool testweise an ein System ageschlossen, um die Zustände zu sehen.
Diese Daten werden in einer MongoDB gespeichert.

Nun würde ich gerne die Daten ode Tabellen der MongoDB auslesen oder analysieren.
Ich habe dann mal gegoogelt, was es für C# so gibt, und bin bei folgendem hängen geblieben (NuGet): MongoDb.Driver V2.18.0

Habe dann mal fogendes probiert:


// Replace the uri string with your MongoDB deployment's connection string.
var client = new MongoClient("mongodb+srv://<username>:<password>@<cluster-address>/test?w=majority");
var database = client.GetDatabase("test");

Hier mal mein Beispiel, wie ich das mache:


MongoClient cMongoClient = new MongoClient("mongodb://USERNAME:PASSWORD@IPADRESS/DATENBANKNAME?w=majority");
var database = client.GetDatabase("DATENBANKNAME");

Wenn ich nun weiter gehe und die Namen der Tabellen ausgeben möchte, tritt ein Fehler auf


                //// .... hier kommt dann Fehler 
                var testDatabases =  cMongoClient.ListDatabaseNames().ToList();

Ist da bei der Anmeldelogik etwas falsch im Aufbau?

09.01.2023 - 15:21 Uhr

Hallo Abt, danke für die Info.
Die IT hat mit einen Serviceuser bereitgetellt. Worin sich der von einem anderen gewöhnlichen User unterscheidet, weiss ich nicht oder kann ich nicht sagen.
Aber eventuell gibt es da Einstellungen die man machen muss, die wir nicht genau wissen (IT und ich).

Habe den User eingesetzt (aber nicht als LocalSystemAccount), Passwort eingetragen und den Dienst gestartet.

Leider ohne Erfolg, der Dienst läuft an und wird auch beendet, Zugriffe auf Verzeichnisse und Prüfungen, das was der Dienst machen sollte, macht er nicht.

Nun meine Frage, kann ich den Dienst per Remote debuggen, aber wie mache ich das damit das Debugging mit dem Serviceuser ausgeführt wird?
Somit könnte ich prüfen, ob es an Berechtigungen mangelt ??

Gäbe es noch eine andere Möglichkeit wie ich den Serviceuser prüfen könnte?

23.11.2022 - 11:52 Uhr

Hallo, folgendes Problem.
Ich habe eine Anwendung, die zyklisch Daten aktualisieren soll / tut. Ich habe diese Applikation erst so gebaut, dass diese in einer Desktop-Applikation ausgeführt werden kann.
Allerdings war ich auch schon so weit vorrausschauend, dass ich von der eigentlichen Aktualisierungsthematik eine DLL erstellen lassen kann, die ich dann in einem Dienst ausführen kann.

Jetzt ist es so, wenn ich den Dienst bei mir auf meinem Rechner installiere, funnktioniert alles korrekt, alle Zugriffe funktionieren.

Installiere ich den Dienst auf dem Server mit meinem Account, dann gibt es Probleme mit Berechtigungen auf manche Verzeichnisse. Wie ist da möglich?
Arbeitet der Server nach anderen Prinzipien, oder worin kann der Unterschied liegen?

Es handelt sich um einen Windows Server.

Hat jemand einen Idee?

08.09.2022 - 22:28 Uhr

MMhhh. Hab ichmir schon gedacht das es nicht einfach wird. Also ob wir was mit Azure Active Directory nutzen, keine Ahnung, muss mal bei der IT nachfragen. WIr identifizieren uns jedenfalls mit 2-Faktorauthentifizierung, aber denke das hat nichts mit deiner besagten Tokennauthentifizierung zu tun.

Das nächste wäre, wie ich dann meine Applikation als Dömänenteil hingebogen ??

Also es handelt sich um eine Desktopanwendung FW 4.5. Webserver nutze ich nicht, WPF-Applikation.

Die andere Möglichkeit, ich entwickle schön weiter, erstelle Files während der Entwicklung auf einem Verzeichnis auf das ich Zugriff habe.
Wenn die Anwendung bei den Kollegen verwendet wird, kann diese ja mit dem anderen Benutzer (lokaler Benutzer) ausgeführt werden, je anchdem ist der Kollege mit diesem lokalen Benutzer am System sogar angemeldet.
Aber richtig gefallen tut mir das nicht.
Angenommen ich mache das so, mein Kollege hat ein Problem und ich schalte micht auf seinen Rechner um die Applikation zu debuggen. Geht das dann überhaupt oder gibt es dann da auch schon Probleme?

08.09.2022 - 16:37 Uhr

Hallo Community, bin mir nicht sicher ob die Überschrift das Thema korrekt trifft, aber ich beschreibe mal mein Problem.

Ich habe sämtliche Applikationen, bei denen die Berechtigungen und Zugriffe wegen Useraccouts sich verändern. Normalerweise werden Berechtigungen über den Windowsuser geregelt, wenn es um Schreib- oder Lesezugriffe auf unseren Fileservern geht.
Außer bei SQL-Datenbankkommunikation werden andere Benuttzer verwendet.

Jetzt muss aus IT-Sicherheitstechischen Gründen sämtliche Bereiche auf die zugegriffen wird nur noch mit lokalen Usern arbeiten.
Ich habe zum Beispiel ein Appliaktion, die holt sich Daten vom SQL-Server, das geht alles noch, weil ich da einen expliziten User bei der Verbindung einsetzen kann.
Ich verarbeite die Daten, muss dann die Ergebnisse in einer Datei auf dem Fileserver ablegen, das hat bisher ganz normal mit meinem Windows-User aus der Domäne funktioniert.

Wenn ich jetzt am Entwickeln der Anwendung bin, kann ich ja die Datei nicht wegschreiben, weil ich mit meinem Windows-User die Applikation (VisualStudio) am Laufen habe.
Gibt es die Möglichkeit, in der Anwendung einen anderen User (den lokalen User vom Fileserver) vorzuschalten ??

Ich hoffe man kann den Stuss verstehen, den ich geschrieben habe.

Wenn die Applikation von einem Kollegen ausgeführt wird, dann kann er ja die Applikation unter dem lokalen User starten.
Aber wenn ich entwickle, wie mache ich es dann? Gibt es da Möglichkeiten, den User im Code zu wechseln ??

Oder Visual Studio als anderen User zu starten ??

Habe Visual Studio probiert, unter dem lokalen User mit "Runas different User" zu starten, leider ohne Erfolg, denn: Mein Rechner kennt den lokalen User gar nicht.

Wenn ich im Code eine Datei erstelle mit File.Wite / File.xxxx gibt es da auch die Möglichkeit einen anderen User für diesen Teilbereich vorzuschalten?

29.04.2022 - 13:07 Uhr

Hallo, hat von euch jemand eine Idee, wie man über Windows die Bilder von der Speicherkarte kopieren kann?
Klar, es gibt Tools, aber ich möchte mir selber was bauen. Damit ich flexibel reagieren kann.
Problem ist, das dieses Laufwerk ja nicht sichtbar ist (zwar im WInExplorer, aber nicht als Verzeichnis im Code).

26.04.2022 - 16:10 Uhr

Hallo, danke für die Info.
Bei dem neuen Projekt mußte unter:

    • Sicherheit ==> das Häkchen "ClickOnce"-Sicherheitseinstellungen aktivieren aktiviert werden.

Dazu ist noch "Voll vertrauenswürdige Anwendung" aktiviert.

Dann hatte es nun wieder korrekt geklappt.
Vielen Dank.

25.04.2022 - 08:49 Uhr

Ok, danke erst mal für die Info.

25.04.2022 - 07:08 Uhr

Habe eine Appliaktion, mit mehreren Projekten, habe ich auch schon länger am laufen. Jetzt habe ich ein zusätzliches Projekt eingebunden, weil ich ein neues Feature eingebaut habe.
Dann habe ich die Applikation veröffentlicht, konnte diese aber nicht installieren, Deployment-Error.

Kann es sein, sobald man ein anderes Projekt hinzubindet oder nur eine Methode die eine andere EXE aufruft, das dann die Applikation sich nicht mehr automatisch mit einer neueren Version sich nicht mehr installiert?

Wenn das so wäre, muss mann ja jedes mal die Applikation auf den Rechnern deinstallieren und neu installieren, absolut unbrauchbar???
Hat jemand eine Idee, wie man so ein Prblem umschiffen kann?

Hier mal das LOG-File das beim Update erscheint ... :

IDENTITIES
Deployment Identity : Datenfinder.application, Version=1.0.26.0, Culture=neutral, PublicKeyToken=b6d294c9d8a2e221, processorArchitecture=amd64
Application Identity : Datenfinder.exe, Version=1.0.26.0, Culture=neutral, PublicKeyToken=b6d294c9d8a2e221, processorArchitecture=amd64, type=win32

APPLICATION SUMMARY
* Installable application.

ERROR SUMMARY
Below is a summary of the errors, details of these errors are listed later in the log.
* Activation of F:\APPS\Fertigung\DatenFinder\Datenfinder_x64\Datenfinder.application resulted in exception. Following failure messages were detected:
+ Reference in the manifest does not match the identity of the downloaded assembly MessprogrammFinder.exe.

COMPONENT STORE TRANSACTION FAILURE SUMMARY
No transaction error was detected.

WARNINGS
There were no warnings during this operation.

OPERATION PROGRESS STATUS

Fehlermeldung:

  • [25.04.2022 07:16:43] : Activation of F:\APPS\Fertigung\DatenFinder\Datenfinder_x64\Datenfinder.application has started.
  • [25.04.2022 07:16:44] : Processing of deployment manifest has successfully completed.
  • [25.04.2022 07:16:44] : Installation of the application has started.
  • [25.04.2022 07:16:45] : Processing of application manifest has successfully completed.
  • [25.04.2022 07:16:47] : Found compatible runtime version 4.0.30319.
  • [25.04.2022 07:16:47] : Request of trust and detection of platform is complete.

ERROR DETAILS

Fehlermeldung:
Following errors were detected during this operation.

  • [25.04.2022 07:17:06] System.Deployment.Application.InvalidDeploymentException (RefDefValidation)
    • Reference in the manifest does not match the identity of the downloaded assembly MessprogrammFinder.exe.
    • Source: System.Deployment
    • Stack trace:
      at System.Deployment.Application.DownloadManager.ProcessDownloadedFile(Object sender, DownloadEventArgs e)
      at System.Deployment.Application.FileDownloader.DownloadModifiedEventHandler.Invoke(Object sender, DownloadEventArgs e)
      at System.Deployment.Application.FileDownloader.OnModified()
      at System.Deployment.Application.SystemNetDownloader.DownloadSingleFile(DownloadQueueItem next)
      at System.Deployment.Application.SystemNetDownloader.DownloadAllFiles()
      at System.Deployment.Application.FileDownloader.Download(SubscriptionState subState, X509Certificate2 clientCertificate)
      at System.Deployment.Application.DownloadManager.DownloadDependencies(SubscriptionState subState, AssemblyManifest deployManifest, AssemblyManifest appManifest, Uri sourceUriBase, String targetDirectory, String group, IDownloadNotification notification, DownloadOptions options)
      at System.Deployment.Application.ApplicationActivator.DownloadApplication(SubscriptionState subState, ActivationDescription actDesc, Int64 transactionId, TempDirectory& downloadTemp)
      at System.Deployment.Application.ApplicationActivator.InstallApplication(SubscriptionState& subState, ActivationDescription actDesc)
      at System.Deployment.Application.ApplicationActivator.PerformDeploymentActivation(Uri activationUri, Boolean isShortcut, String textualSubId, String deploymentProviderUrlFromExtension, BrowserSettings browserSettings, String& errorPageUrl, Uri& deploymentUri)
      at System.Deployment.Application.ApplicationActivator.PerformDeploymentActivationWithRetry(Uri activationUri, Boolean isShortcut, String textualSubId, String deploymentProviderUrlFromExtension, BrowserSettings browserSettings, String& errorPageUrl)
      --- End of stack trace from previous location where exception was thrown ---
      at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
      at System.Deployment.Application.ApplicationActivator.PerformDeploymentActivationWithRetry(Uri activationUri, Boolean isShortcut, String textualSubId, String deploymentProviderUrlFromExtension, BrowserSettings browserSettings, String& errorPageUrl)
      at System.Deployment.Application.ApplicationActivator.ActivateDeploymentWorker(Object state)

COMPONENT STORE TRANSACTION DETAILS
No transaction information is available.

24.04.2022 - 22:51 Uhr

Hallo Palladin, hast das Problem inzwischen behoben?
Was war denn die Ursache dafür?

Ich habe ein ähnliches Problem. Habe eine Appliaktion, mit mehreren Projekten, habe ich auch schon länger am laufen. Jetzt habe ich ein zusätzliches Projekt eingebunden, weil ich ein neues Feature eingebaut habe.
Dann habe ich die Applikation veröffentlicht, konnte diese aber nicht installieren, Deployment-Error.

Kann es sein, sobald man ein anderes Projekt hinzubindet oder nur eine Methode die eine andere EXE aufruft, das dann die Applikation sich nicht mehr automatisch mit einer neueren Version sich nicht mehr installiert?

Wenn das so wäre, muss mann ja jedes mal die Applikation auf den Rechnern deinstallieren und neu installieren, absolut unbrauchbar???
Hast du da eine Idee?

03.02.2022 - 14:40 Uhr

So, jetzt hab ich nochmal eine Frage. Ich nutze einen Webservice von einem Hersteller, mit dem lass ich mir Daten von dem Hersteller ausgeben, oder übergebe dem System Daten.
Wenn ich so was für meine eigene Appliaktion bauen will, dann muss ich einmal den bereich für den Server entwickeln, als auch Methodik für die Clients (das wären natürlcih unsere Rechner der Firma).
Ich denke so ein WebService ist bestimmt nicht gerade einfach zum entwickeln, oder? Legt man die Kommando- oder Befehlssyntax die z.B. der Client an den Server geben kann selber fest oder gibt es da feste Definitonen (als Beispiel: Client sagt ==> du Server, lösche Auftrags xy in Tabelle B) ?? Oder kann man diese Syntax selber festlegen?

02.02.2022 - 13:40 Uhr

Na ja, Bespiel SAP. Ich benutze etwas was mit an die hand gegeben wurde, um aus meiner Applikation Daten von dem besagten abzufufen. Da gibt es dann DLL's für Verbindung und Methodik.
Habe ich die wiederum nicht NET6-kompatibel, bin ich nass.

02.02.2022 - 11:41 Uhr

Tja, eine Sache gibt es bestimmt zu beachten, oder?
Wenn ich jetzt meine Appliaktionen / Projekte auf NET6 hebe, was mache ich dann mit DLL's die ich von Drittherstellern bisher benutze?
Die müssen dann auch dem NET6 genugtun (kompatibel sein). Da fängt dann bestimmt auch schon wieder ein Kampf an, oder ist das einfach zu lösen?

30.01.2022 - 19:54 Uhr

MAUI, habe ich schon mal gelesen, soll nun in VS2022 voll unterstützt werden.
Hast du damit schon was gemacht?

30.01.2022 - 13:47 Uhr

Hallo Forenmitglieder. Programmiere schon einige Jahre in C# (WPF). Nun ist es so, dass sich in unserer Firma ein immer gößerer Wandel vollzieht, sei es mit unseren Sytemen (ERP), Daten usw. die immer mehr in die Cloud gesetzt werden.
Nun soll ja auch der digitale Wandel bei uns in der Firma Einzug halten. Es soll auf Tablets gesetzt werden, Apple oder Android, Windows ...
Nun beschäftigt mich halt immer mehr die Frage, ob es auch eine andere Möglichkeit gibt, die bisherigen Applikationen zu verwenden oder leicht zu modifizieren, damit diese auf solchen Geräten laufen?
Es ist mir klar, das ich die Anwendungen auch komplett für Android oder Apple mit Xamarin umsetzen könnte, aber ich frage mich ob es noch eine andere Möglichkeit gibt?
Gibt es so etwas, das man diese Anwendungen irgendwo z.B. auf Azure laufen lässt, und man kann über die mobile Geräte sich da per Webverbindung aufschalten, somit braucht man das nicht auf den Geräten zu installieren? So etwas in die Richtung??
Das wäre vielleicht auch ein größerer Schutz vor Viren, Angriffe usw. ??

Hat jemand von euch damit Erfahrung, oder kann sagen was Sinn macht, was nicht?
Bin schon gespannt.

30.01.2022 - 13:27 Uhr

Danke Abt für deinen Typ, das funktioniert (jedenfalls lokal, ob in der Firma auch muss ich noch checken).
Ist mir schon klar, mit Sonderzeichen usw. Aber das machen die auch nicht, weil denen ihr Programm eingentlich ein SQLITE-Datenfile ist, also haben die auch bestimmte Regeln.
Mir geht es darum, dass die Programme schnell und übersichtlich gefiltert, sortiert, verglichen werden können, deshalb diese Sache. Habe davor schon ohne diese Ooption die Programme verarbeitet, musste aber bei so einem Fall, wenn "Durchmesser-a" schon da war und dann noch "Durchmesser-A" in einem Programm vorhanden war, die Spalte mir einem Zähler versehen.
Aber so sollte das klappen.

24.01.2022 - 13:41 Uhr

Danke Abt, dass du dir die Zeit nimmst und mir das anschaulich erklärst.
Du denkst jetzt da schon einen Schritt weiter, das da verschiedene Hersteller / Systeme von Maschinenherstellern angesprochen werden. Es geht hier bei mir aber nurm um einen Hersteller, da kommt sonst nichts rein, was sich vermischen kann. Es geht um einen schweizer Schleifmaschinenhersteller, der hat seine Schleifsoftware und von dieser lege ich nur Daten ab.
Ich weiss aber was du meinst, wenn verschiedene Hersteller hier in der DB drin wären , dann bräuchte ich eine Mappingtabelle, das die Parameter genau und eindeutig zu identifizieren sind. Ja, man könnte auch die Logik eventuelle für andere Systeme anpassen, ableiten (Vererben).

Also, bei den Daten die ich hier archiviere, ist der Parameter an allen Maschinen identisch.
Aber zu meiner Frage, kann man den Spaltennamen im Microsoft SQLserver nun so einstellen, das er "Durchmesser-A" und "Durchmesser-a" anlegen kann ??

24.01.2022 - 13:07 Uhr

Hallo Abt, ja du weisst schon, es geht um Maschinenprogramme 😉.
Der Hersteller speichert dieses auch (in SQLITE, da geht es doch wohl auch...).
Ich muss die Programme über einen WebService ansprechen, kann die Daten dann abgreifen. Dann brösle ich das alles in seine Bestandteile auf und übertrage das in die Datenbank. Neue Tabellen, Spalten werden automatisch angelegt. Aber, wie ich dann trotzdem Spaltennamen die identische Zeichnen haben aber sich in Groß-Kleinschrift unterscheiden, verstehe ich nicht. Es ist wahrschleinlich deswegen, weil ich kein Informatikstudium gemacht habe.
Und ich dachte ich hatte auch mal etwas gelesen, das man diese Eigenheit beim SMS einstellen kann.
Also, wenn ich automtisch per Code eine neue Spalten anlegen lassen will, muss der SQL-Server / Datenbank unterscheiden zwischen "Durchmesser-A" und "Durchmesser-a".

24.01.2022 - 11:32 Uhr

Hallo, danke für die Antwort.
Ich habe das gerade bei einer bestehenden lokalen Datenbank getestet. Habe die in den SingelUser geschaltet, und dann unter Options
die Collation in dem DropDown-Menu von Latin1_General_CI_AI auf Latin1_General_CS_AI gesetzt.

Davor hatte ich in einer Tabelle eine Spalte mit Durchmesser-a angelegt.
Nach der obigen Änderung habe ich nochmal versucht, in der Tabelle eine weitere Spalte mit Durchmesser-A anzulegen. Es kam dann die Fehlermeldung, das diese Spalte schon existiert.
Was ist falsch?

23.01.2022 - 22:25 Uhr

Hallo liebe Community, stehe gerade vor folgendem Problem.
Ich muss Maschinendaten in eine SQL-Datenbank transferieren. Dabei ist mir aufgefallen, das der Hersteller manchmal Namen vergibt (Parameternamen welche dann als Spaltennamen benutzt werden) , die aus Buchstaben bestehen, aber einmal als "Durchmesser-a" und anderes mal als "Durchmesser-A" beschrieben werden. Beide Parameter haben eine andere Bedeutung, aber mit der aktuellen Einstellung kann ich die Spalte "Durchmesser-A" nicht anlegen, weil der SQL-Server motzt und sagt es gibt diese Spalte schon in der Tabelle "Durchmesser-a".
Deshalb meine frage, wo kann ich das einstellen. Habe schon im Netz dazu gesucht, aber ich finde nichts passendes.
Kann ich das überhaupt nachträglich ändern, oder muss das der komplette SQL-Server neu aufgesetzt werden?

21.01.2022 - 12:33 Uhr

Genau richtig, Maschinensteuerungen, die kauft man und da bleiben die stehen.
Aber: Du hast es korrekt gesagt. Wo es möglich ist, muss der "alte Scheiß raus".
Danke.

21.01.2022 - 12:26 Uhr

Ok, dann muss ich ran.
Dann muss ich auch damit leben das diese Appliaktion nicht mehr auf alten WINXP (wir haben noch Maschinen mit XP) nicht mehr unterstützt werden, da wird es dann keinen Ausweg geben.