C# Reheinfolge der Spalten eines DataGrids ändern

Hossain

Grünschnabel
Hallo Leutz,

hab da eine Frage bezüglich des DataGrids. Vorweg muss ich erwähnen, dass ich gezwungenermaßen mit .Net 1.1 arbeiten muss.

Und zwar kruz zur Porblemstellung:
Ich muss die Namen aller Dateien, die in einem Ornder enthalten sind auslesen und diese in einer Liste zu weiteren Bearbeitung darstellen. Hatte es bereits mit Listview realisiert. Doch die ListView wird zu langsam, da sich meist über 2000 Datein in dem Ordner befinden. Nun versuche ich das Ganz mit einem DataGrid zu realisieren. Weil ich bisher gar keine Erfahrungen mit dem DataGrid gemacht hatte, erschien mir die einfachste Vorgehensweisse die Folgende:

Ich habe eine Daten-Klasse

Code:
public class MyDataClass : IMyData
    {
        private string        _name;
        private string        _input;
        private string        _output;
        private DataPriority  _priority = DataPriority.Normal;

        public MyDataClass(string name, DataPriority priority)
        {
            this._name = name;
            this._priority = priority;
        }

        [ReadOnly(true)]
        public string Name
        {
            get
            {
                return this._name;
            }
        }


        [ReadOnly(true)]
        public string Output
        {
            get
            {
                return this._output;
            }

            set
            {
                this._output = value;
            }
        }

        [ReadOnly(true)]
        public string Intput
        {
            get
            {
                return this._input;
            }

            set
            {
                this._input = value;
            }
        }

        [ReadOnly(true)]
        public DataPriority Prioprity
        {
            get
            {
                return this._priority;
            }
        }
    }


Mit Hilfe der Pfade der Dateien werden einzelne MyData-Objekte erzeugt und in einer ArrayList eingefügt. Die ArrayList wird anschließend der DataSource des DataGrids zur weitern bearbeitung übergeben.

Code:
class Test
{
    private ArrayList _dataItems;

    private String[] DataGridItems
        {
            set
            {
                if(value.Count > 0)
                {
                    _dataGrid.DataSource = null;
                    this._dataItems = new ArrayList();

                    for(int i=0; i<value.Count; i++)
                        this._dataItems.Add(new MyDataClass(value[i].ToString(), DataPriority.High));

                    this._dataGrid.DataSource = this._dataItems;
                }
            }
        }



Nun ist das Problem, dass der DataGrid die Spalten in dieser Reihenfolge anzeigt:
Prioprity | Output | Name | Intput |

Ich hätte aber gerne das ganze in dieser Reihenfolge dargestellt wird:
Name | Prioprity | Intput | Output |

Wie kann ich das am einfachsten beeinflussen? Oder befinde ich mich auf dem totalen Holzweg? Bin für jeden Hinweis dankbar.

Gruß und danke schon mal im Voraus!
 
Ich würde wie folgt vorgehen.
1. Grid im Designer ins UserControl/Window... ziehen.
2. Im Grid oben rechts auf den Pfeil klicken (DataGridView Tasks) und bei "Choose Data Source" "Add Project Data Source" wählen.
3. Hier Object wählen und auf weiter.
4. In der Verzeichnisstruktur MyDataClass suchen, auswählen und auf Finish klicken. (Hierbei wird eine Bindingsource erstellt und dem DataGrid zugewiesen)
5. Im Menü (siehe 2.) edit columns wählen und die Reihenfolge der Colums wie gewünscht festlegen
6. Die Daten der Bindingssource zuweisen: "meineBindingSource.DataSource = meinArrayMitDaten"

Ich hoffe ich hab nix vergessen und das geht auch unter .NET 1.1.
 
Hallo BackgroundWorker,

erstmal vielen Dank für deine Antwort. Aber ich glaube, dass Du von dem Control "DataGridView" sprichst. Dieses Control ist meines Wissens nach erst mit .Net 2.0 dazugekommnen. Unter .Net 1.1 gibt es nur den "DataGrid". Und unter Visual Studio 2003 (den ich auch benutzen muss) existier leider kein Pfeil, worunter ich dann "DataSource" auswählen kann. Es Gibt den Menüpunkt "DataSource" im Properties-Fenster. Dort steht standartmäßig (none) und ich kann dort auch nichts anderes auswählen. Oder übersehe ich hier etwas?
 
Ich hab hier kein VS 2003 und kann bei meinem VS 2008 auch nur bis zum 2.0 zurück schrauben.
Das DataGrid sehe ich auch nicht im Designer. Drum hab ich es mal programmatisch ohne BindingSource versucht.
Code:
        public Form1()
        {
            InitializeComponent();
          
            DataGrid dg = new DataGrid();
            dg.Dock = DockStyle.Fill;
          
            List<Kunde> kunden = new List<Kunde>();
            kunden.Add(new Kunde(22, "Heinz"));
            kunden.Add(new Kunde(34, "Martin"));

            dg.DataSource = kunden;

            this.Controls.Add(dg);
        }

Code:
    class Kunde
    {
        #region Fields
        private int alter;
        private string name;
        #endregion 


        public Kunde(int alter, string name)
        {
            this.alter = alter;
            this.name = name;
        }

        #region Properties
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        public int Alter
        {
            get { return alter; }
            set { alter = value; }
        }
        #endregion 
    }
Die Reihenfolge ist bei den Spalten Name, Alter
Drehe ich in meiner Kunden-Klasse die Reihenfolge der Properties um setze Alter vor Name, wird auch im Grid Alter vor Name angezeigt.
Wie gesagt, ich kanns unter den Bedingungen von .NET 1.1 grad nicht testen aber vielleicht ist das ja schon die Lösung.
 
Nein, die Idee hatte ich auch schon und es funktioniert leider nicht.

ABER ich habe jetzt die Lösung.

1. Im Properties-Fenster im Menüpunkt "TableStyles" den "DataGridtableStylxe Collection Editor" öffnen
2. Mit dem Add-Button unten links einen Member adden
3. Dann auf der rechten Seite des Editors unter "Behavior" den "AllowSorting"Property auf "false" stellen
4. "Name" wie gewünscht ändern
5. Unter "Misc" in der "MappingName"-Zeile "ArrayList" eingeben
6. Wenn gewünscht "ReadOnly" auf "true"
7. Weiterhin einen "GridColumnStyles"Collection anlegen. Hier öffnet sich dann ein weiterer Editor (DataGridColumnStyles Collection Editor)
8. Hier die Spalten einzeln nach der gewünschten Reihenfolge anlegen. In meinem Fall dataGridTextBoxColumn1, dataGridTextBoxColumn2, dataGridTextBoxColumn3 und dataGridTextBoxColumn4
9. Dann bei den jeweiligen dataGridTextBoxColumns unter "Misc" die "MappingNames" anpassen. Sie müssen exakt dem entsprechen, die in der MyDataClass angegeben sind. In diesem Fall also "Name", "Prioprity", "Intput" und "Output"
10. Die Spalten-Titel, die dann im Editor angezeigt werden, kann man unter "Header Text" beeinflussen.

und das wars auch schon.

Vielen Dank BackgroundWorker für Deine Hilfe!

Grüße
Hossain
 
Zurück