Laden...

beim Auslesen des Datagrids keine geänderten Werte vom Benutzer

Erstellt von DiePluto vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.396 Views
D
DiePluto Themenstarter:in
2 Beiträge seit 2011
vor 11 Jahren
beim Auslesen des Datagrids keine geänderten Werte vom Benutzer

Hallo,
ich bin noch Programmieranfängerin und probiere mich etwas aus. Für meine Diplomarbeit schreibe ich zurzeit an einem Tool, was in meiner Firma später die Arbeit beim Anlegen von Störmeldungen in der SPS erleichtern soll.

Nun zu meinem Problem. Das ganze Tool, die Eingangsdaten, Ausgangsdaten, zu edietierenden Daten, sind alle tabellarisch angelegt. Somit verwende ich ein Datagrid zur anzeige von den Daten (speziell hier EPLAN-Daten) mit folgender Struktur:


    struct _EplanFacts
    {
        public int ID { get; set; }
        public String Symb_Adr { get; set; }
        public String Adr { get; set; }
        public String Typ { get; set; }
        public String Comment { get; set; }
        public bool Choose { get; set; }
        public bool NormalyOpen { get; set; }
    }

Anschließend lege ich ein Liste an und füge sie in das Datagrid ein. Das funktioniert alles.

Zunächst zum Datagrid:

  • ich habe eine Klasse angelegt, die ein TabItem und ein daraufliegendes Datagrid enthält. Demn konstruktor wird eine Struktur übergeben, die zum Anlegen der Spalten im Datagrid dient:
/// <summary>
        /// neues Tabellenfenster anlegen
        /// </summary>
        /// <param name="windowname">Bezeichnung der Tabelle/Fenster (z.B. DB34)</param>
        public Show_Table(string windowname, Column[] TableColumns)
        {
            //Anlegen eines Fensters
            window = new TabItem();
            //Bezeichnung des Fensters (z.B. DB34)
            window.Header = windowname;
            //Anlegen einer neuen Tabelle
            table = new DataGrid();
            table.CellEditEnding += new EventHandler<DataGridCellEditEndingEventArgs>(dataGrid_CellEditEnding);
            table.CurrentCellChanged += new EventHandler<EventArgs>(dataGrid_CurrentCellChanged);
            table.AutoGenerateColumns = false;
            table.CanUserAddRows = false;
            table.IsSynchronizedWithCurrentItem = true;

            //Auswerten der Spalten und hinzufügen
            foreach (Column TableColumn in TableColumns)
            {
                switch (TableColumn.Columntyp)
                {
                    case 1:
                        DataGridTextColumn NewTextColumn = new DataGridTextColumn();
                        NewTextColumn.Header = TableColumn.Columnname;
                        table.Columns.Add(NewTextColumn);
                        break;
                    case 2:
                        DataGridComboBoxColumn NewComboColumn = new DataGridComboBoxColumn();
                        NewComboColumn.Header = TableColumn.Columnname;
                        NewComboColumn.ItemsSource = TableColumn.ColumnChoose;
                        table.Columns.Add(NewComboColumn);
                        break;
                    case 3:
                        DataGridCheckBoxColumn NewCheckColumn = new DataGridCheckBoxColumn();
                        NewCheckColumn.Header = TableColumn.Columnname;
                        table.Columns.Add(NewCheckColumn);
                        break;
                    default:
                        break;
                }
            }

            //Tabelle verbinden mit dem Fenster
            window.Content = table;
        }
  • Anschließend füge ich das Tab einem im Programm angelegten Tabcontrol zu. Die Datenbindung der Spalten wird nach der Initialisierung der Klasse im MainProgramm gemacht :

            Show_Table EplanTable = new Show_Table(_Eplan, Columns);
            EplanTable.Table.Columns[0].IsReadOnly = true;
            EplanTable.Table.Columns[2].IsReadOnly = true;
            EplanTable.Table.Columns[3].IsReadOnly = true;
            System.Windows.Data.Binding BINDINGCOLUMN = new System.Windows.Data.Binding("ID");
            BINDINGCOLUMN.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
            ((DataGridTextColumn)EplanTable.Table.Columns[0]).Binding = BINDINGCOLUMN;
            BINDINGCOLUMN = new System.Windows.Data.Binding("Symb_Adr");
            BINDINGCOLUMN.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
            ((DataGridTextColumn)EplanTable.Table.Columns[1]).Binding = BINDINGCOLUMN;
            BINDINGCOLUMN = new System.Windows.Data.Binding("Adr");
            BINDINGCOLUMN.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
            ((DataGridTextColumn)EplanTable.Table.Columns[2]).Binding = BINDINGCOLUMN;
            BINDINGCOLUMN = new System.Windows.Data.Binding("Typ");
            BINDINGCOLUMN.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
            ((DataGridTextColumn)EplanTable.Table.Columns[3]).Binding = BINDINGCOLUMN;
            BINDINGCOLUMN = new System.Windows.Data.Binding("Comment");
            BINDINGCOLUMN.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
            ((DataGridTextColumn)EplanTable.Table.Columns[4]).Binding = BINDINGCOLUMN;
            BINDINGCOLUMN = new System.Windows.Data.Binding("Choose");
            BINDINGCOLUMN.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
            ((DataGridCheckBoxColumn)EplanTable.Table.Columns[5]).Binding = BINDINGCOLUMN;
            BINDINGCOLUMN = new System.Windows.Data.Binding("NormalyOpen");
            BINDINGCOLUMN.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
            ((DataGridCheckBoxColumn)EplanTable.Table.Columns[6]).Binding = BINDINGCOLUMN;
            EplanTable.Table.AutoGenerateColumns = false;

Zum Problem:
Anschließend zeige ich das Datagrid an und editiere verschiedene Zellen. Nachdem ich zufrieden bin mit meiner Änderung der Daten Klicke ich auf einen Button, der die Daten nun in einer weiteren Tabelle speichern soll. Somit möchte ich auf das Datagrid zugreifen wieder über ItemsSource:
List<_EplanFacts> Data = ((Datagrid)TabItem.Content).ItemsSource;
Das geht auch. Allerdings bekomme ich die Daten, die ich schon über die umgekehrte Zuweisung geschrieben habe. Nun habe ich versucht über Items einzeln zuzugreifen, was zum gleichen ergebnis führt. Die Editierungen sind zwar in den Zellen sichtbar und bleiben, aber ich kann nicht darauf zugreifen.

Ich habe schon geschaut, aber irgendwie finde ich nicht das richtige. Ich hoffe, dass ihr mir helfen könnt. Ich weiß nicht mehr weiter. Vielleicht fehlt irgendwo ein Aufruf ähnlich dem: AcceptChanges(). Aber diese Methode oder eine ähnliche habe ich nicht gefunden.

Vielen Dank für die Hilfe

3.430 Beiträge seit 2007
vor 11 Jahren

Hallo DiePluto,

willkommen bei myCSharp.de und speziell in der WPF Welt 😉

Ich habe zwar nicht deinen ganzen Code im Detail durchgeschaut aber das Problem liegt vermutlich daran dass deine Datenklasse ein Struct anstatt einer class ist
Damit ist es pass by value anstatt pass by ref.
Das Resultat ist dass du vermutlich mit mehreren Kopien arbeitest.
Wenn du hingegen eine class - Datenklasse hast dann funktioniert es über die Referenz und du hast nicht mehrere Kopien

PS: Nur so als kleiner Hinweis. Guck dir mal WPF genauer an.
Denn mit dem DataBinding kannst du dir ganz viel Arbeit sparen.
Zudem brauchst du auch nicht das DataGrid mühsam im Code zusammenzubauen.
Das kannst du alles im Xaml - Code machen.

Gruß
Michael

D
DiePluto Themenstarter:in
2 Beiträge seit 2011
vor 11 Jahren

Hallo michlG,

Das Problem war, dass es keine Klasse war. Einmal dieses kleine Wörtchen geändert, funktioniert es. Vielen Dank.

Für mein Programm ist es leider notwendig, die Spalten im Programm festzulegen. Dieser Teil ist zwar fest definiert, aber es kommt noch eine weitere Komponente hinzu die dynamisch sein muss. Deswegen wollte ich alles gleich so machen. Aber vielen Dank für deine Hilfe. Werde jetzt besser überlegen wo ich noch eine Struktur einsetzen kann, und wo nicht.